[英]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.