繁体   English   中英

C++串口数据接收错误

[英]C++ Serial port data received incorrectly

从串口接收到的数据,不正确,有时会发生变化!

  if (WaitCommEvent(hSerial, &eventMask, NULL))
{
    if (ReadFile(hSerial, &input, 14, &bytesRead, NULL) !=0)
    {
        for (int i = 0; i < sizeof(input); i++)
        {
            cout << hex <<(int)input[i]<<endl;
        }
    }
    else
    {
        cout << "error reading file\n";
    }
}
else
{
    cout << "error waiting for comm event\n";
}

数据是:

50
ffffffaf
0
e
2
42
2
b
d
0
1
1
50
ffffffe5

当我使用 Pyserial 获取数据时,数据是:

50AF000E0242020B0D00010150E5

如您所见,我得到了额外的 'ffffff' 并错过了一些 '0'! 由于丢失数据,有时“af”会变成“2f”!

我的代码有什么问题吗?

问题不在于数据,数据本身没问题。 是您打印的数据有问题。

您没有考虑到input使用的是签名char类型,该类型在分配给签名int时会进行符号扩展 这就是打印值为0xafcharffffffaf中额外f s 的0xaf ,因为高位为 1 并被带入扩展位:

0xAF       =                            10101111
0xFFFFFFAF = 11111111 11111111 11111111 10101111

另一方面,无符号值是零扩展的

0xAF       =                            10101111
0x000000AF = 00000000 00000000 00000000 10101111

您也没有考虑到您仅使用 1 个十六进制数字打印数值0..15 ,因此不会打印前导0十六进制数字。 您应该将这些值填充为 2 个十六进制数字。

尝试这个:

char input[...];
...
if (ReadFile(hSerial, &input, 14, &bytesRead, NULL))
{
    for (int i = 0; i < bytesRead; ++i)
    {
       cout << hex << setw(2) << setfill('0') << static_cast<int>(static_cast<unsigned char>(input[i])) << endl;
    }
}

如果您将input更改为使用unsigned char而不是char ,那么您可以删除该类型转换:

unsigned char input[...];
...
if (ReadFile(hSerial, &input, 14, &bytesRead, NULL))
{
    for (int i = 0; i < bytesRead; ++i)
    {
       cout << hex << setw(2) << setfill('0') << static_cast<int>(input[i]) << endl;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM