簡體   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