[英]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
时会进行符号扩展。 这就是打印值为0xaf
的char
时ffffffaf
中额外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.