簡體   English   中英

串行通信C ++ ReadFile()

[英]Serial Communication C++ ReadFile()

我創建了2個可通過串行端口進行讀寫的函數,我使用Visual Studio 2012,Windows 7、64位操作系統和RS-232串行線在C ++中進行編碼。 我所連接的電路板應該在按下按鈕時發送5個字符,即TRG 1,該代碼有效,但是輸出並不總是正確的值。

char serialRead()
{
    char input[5];
    DCB dcBus;
    HANDLE hSerial;
    DWORD  bytesRead, eventMask;
    COMMTIMEOUTS timeouts;
    hSerial = CreateFile (L"\\\\.\\COM13", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (hSerial == INVALID_HANDLE_VALUE)
    {
        cout << "error opening handle\n";
    }
    else
    {
        cout << "port opened\n";
    }
    dcBus.DCBlength = sizeof(dcBus);
    if ((GetCommState(hSerial, &dcBus) == 0))
    {
        cout << "error getting comm state\n";
    }
    dcBus.BaudRate = CBR_9600;
    dcBus.ByteSize = DATABITS_8;
    dcBus.Parity = NOPARITY;
    dcBus.StopBits = ONESTOPBIT;
    if ((GetCommState(hSerial, &dcBus) == 0))
    {
        cout << "error setting comm state\n";
    }
    if ((GetCommTimeouts(hSerial, &timeouts) == 0))
    {
        cout << "error getting timeouts\n";
    }
    timeouts.ReadIntervalTimeout = 10;
    timeouts.ReadTotalTimeoutMultiplier = 1;
    timeouts.ReadTotalTimeoutConstant = 500;
    timeouts.WriteTotalTimeoutMultiplier = 1;
    timeouts.WriteTotalTimeoutConstant = 500;
    if (SetCommTimeouts(hSerial, &timeouts) == 0)
    {
        cout << "error setting timeouts\n";
    }
    if (SetCommMask(hSerial, EV_RXCHAR) == 0)
    {
        cout << "error setting comm mask\n";
    }
    if (WaitCommEvent(hSerial, &eventMask, NULL))
    {
        if (ReadFile(hSerial, &input, 5, &bytesRead, NULL) !=0)
        {
            for (int i = 0; i < sizeof(input); i++)
            {
                cout << input[i];
            }
            cout << endl;
        }
        else 
        {
            cout << "error reading file\n";
        }
    }
    else
    {
        cout << "error waiting for comm event\n";
    }
    switch (input[4])
    {
    case '1' :
        CloseHandle(hSerial);
        return '1';
        break;
    case '2' :
        CloseHandle(hSerial);
        return '2';
        break;
    case '3' :
        CloseHandle(hSerial);
        return '3';
        break;
    case '4' :
        CloseHandle(hSerial);
        return '4';
        break;
    case '5':
        CloseHandle(hSerial);
        return '5';
        break;
    default :
        CloseHandle(hSerial);
        return '9';
        break;
    }
}

在正確配置端口並傳輸數據的意義上,代碼成功運行。 輸出會有所不同,大多數情況下,輸出將打印整個“ TRG 1”,但看起來是隨機的,輸出將是“ TRG |} |}”或“ T |} |} |} |}”,即它將成為字符串的一部分,並且每個丟失的字符都將由“ |}”代替正確的字符。 這是一個問題,因為我希望能夠將其發送給觸發器以不同的值並運行該變量的開關。

我對串行通信比較陌生,而不是專業的程序員,所以我想知道發生了什么嗎?

串行通信不是基於數據包的。 這些信息不是以打包的形式提供給您的,在打包中,必須一次性讀取整個消息。 相反,它是一個流,因此您可以閱讀半條消息,整條消息,多條消息等。

正如zdan在評論中所說,您需要檢查從ReadFile讀取的字節數,並使用它來構成5個字符的軟件包,這就是您的消息。 具體來說,只有返回返回的讀取字節數的前幾個字符才有效; 其余都是垃圾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM