簡體   English   中英

Win32 C++ 寫入串口一段時間后程序凍結

[英]Win32 C++ writing to serial freezes the program after a while

我添加了一個串行端口寫入我的代碼,現在它在十分之幾的迭代后凍結了。 幾分鍾就可以正常工作。 如果我去掉串口相關的線,它會一直運行的很流暢。 我正在使用 Visualstudio。 誰能發現問題?

int main() {
    HANDLE hSerial;
    DCB dcbSerialParams = { 0 };
    
    // Open the serial port
    hSerial = CreateFile(L"COM1", GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hSerial == INVALID_HANDLE_VALUE) {
        std::cout << "Error opening serial port" << std::endl;
        return 1;
    }

    // Set the serial port parameters
    dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
    if (GetCommState(hSerial, &dcbSerialParams) == 0) {
        std::cout << "Error getting serial port state" << std::endl;
        CloseHandle(hSerial);
        return 1;
    }
    dcbSerialParams.BaudRate = CBR_9600;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;
    if (SetCommState(hSerial, &dcbSerialParams) == 0) {
        std::cout << "Error setting serial port state" << std::endl;
        CloseHandle(hSerial);
        return 1;
    }

    // Send the serial message
    DWORD dwBytesWritten;
    char message[] = "c";
    WriteFile(hSerial, message, sizeof(message) - 1, &dwBytesWritten, NULL);  

    

    while (stop == 0) {
        
        WriteFile(hSerial, "x", sizeof(message) - 1, &dwBytesWritten, NULL);

        int i = 0;
        while (i < 7) {
            i++;
            //some code that works fine without serial port writings
        }
        
        WriteFile(hSerial, "y", sizeof(message) - 1, &dwBytesWritten, NULL);

        i = 0;
        while (i < 7) {
            i++;
            //some code that works fine without serial port writings
        }
    }
    }    
    return 0;
}

我已使代碼盡可能簡單。 它仍然有一些嚴重的問題。

可能您會嘗試在第一次調用未完成之前編寫; 緩沖區可能已滿,檢查 PurgeComm function。也嘗試實現一個事件序列。 (等待通訊事件)

你在讀序列另一邊的值嗎? 我知道,例如,在 Arduino 之類的設備上很常見的許多更便宜的山寨 FTDI USB 串行芯片上,它們有一個小的 (4kB) 緩沖區,如果緩沖區已滿,它們將簡單地阻止調用。

如果阻塞本身是您最大的問題,要考慮的另一件事可能是檢查CreateFile中的FILE_FLAG_OVERLAPPED標志。 它不會解決通信中斷的問題,但如果您最關心的只是在通信准備就緒之前不阻止程序的其他部分,那可能是一個選擇。

暫無
暫無

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

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