Win32 COM端口数据乱序



我试图让我的Arduino Nano通过USB通过COM端口发送数据到我的c++脚本,但我得到的数据似乎是出了sink。我不知道出了什么问题。

这是我的Arduino代码:

void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
Serial.begin(9600);
Serial.println("Hello World!");
Serial.end();
}
下面是我的c++代码:
#include <iostream>
#include <windows.h>
int main()
{
char Byte;
DWORD dwBytesTransferred;
HANDLE hSerial;
while (true)
{
hSerial = CreateFile(L"COM7",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (hSerial == INVALID_HANDLE_VALUE) {
if (GetLastError() == ERROR_FILE_NOT_FOUND) {
std::cout << "Serial Port Disconectedn";
//return 0;
}
}
else
{
ReadFile(hSerial, &Byte, 1, &dwBytesTransferred, 0);
std::cout << Byte;
}

CloseHandle(hSerial);
}
return 0;
}
下面是我的c++代码显示的内容:
roHdol!!HdWl
l e!ol
l e!ol

我的Arduino正在发送"Hello World!", BTW.

Arduino代码是正确的。

我在c++代码中发现的问题如下:
  1. 连续打开和关闭端口是一个坏主意(while循环的执行速度比你获得数据的速度快-这只会导致你获得垃圾数据)

  2. 由于您试图读取单个字节的数据,ReadFile的参数3应该是1,而不是10。相反,如果将大小为10的数组传递给参数2,则代码有效。

  3. 您没有使用返回值dwBytesTransferred来检查具有正确字节数的读取操作是否成功。在ReadFile之后,可以检查参数2和参数3是否匹配

  4. 根据我的经验,当串行设备连接时,windows自动开始缓冲数据。根据您的情况,您可能希望使用PurgeComm函数清除窗口中的接收缓冲区。

更正后的代码如下:

#include <iostream>
#include <windows.h>
int main()
{
char Byte;
DWORD dwBytesTransferred;
HANDLE hSerial;
hSerial = CreateFile("COM7",                                    //Placed outside while loop also, check if 'L"COM7"' is correct.
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
PurgeComm(hSerial, PURGE_RXCLEAR);                              //Clear the RX buffer in windows
while (hSerial != INVALID_HANDLE_VALUE)                         //Executes if the serial handle is not invalid
{
ReadFile(hSerial, &Byte, 1, &dwBytesTransferred, 0);

if(dwBytesTransferred == 1)                 
std::cout << Byte;
}
if (hSerial == INVALID_HANDLE_VALUE)                            //Throw an error if the serial handle is invalid
{
std::cout << "Serial Port Not Availablen";
}
CloseHandle(hSerial);                                           //Close the handle (handle is also automatically closed when the program is closed)
return 0;
}

我已经测试过了,它可以工作,我的输出是

Hello World!
Hello World!

相关内容

  • 没有找到相关文章

最新更新