Win32 C++写入串行端口会在一段时间后冻结程序

hivapdat  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(117)

我添加了一个串口写入我的代码,现在它冻结后,几十个迭代。几分钟,它的工作只是它应该。如果我删除串口相关的行,它将永远顺利运行。我使用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;
}

我已经尽我所能把代码做得尽可能简单了。但是它仍然有一些严重的问题。

kyvafyod

kyvafyod1#

也许你会尝试在第一次调用还没有完成之前写;缓冲区可能已满,请检查PurgeComm函数。同时尝试执行事件序列。(WaitCommEvent)

cygmwpex

cygmwpex2#

您是否正在阅读串行另一端的值?我知道,例如在Arduino类中常见的许多廉价仿制FTDI USB串行芯片上,它们有一个小(4kB)缓冲区,如果缓冲区已满,将简单地阻止调用。
如果阻塞本身是你最大的问题,另一件要考虑的事情可能是检查CreateFile中的FILE_FLAG_OVERLAPPED标志,它不会解决通信中断的问题,但是如果你最关心的只是在通信准备好之前不要阻塞程序的其他部分,这可能是一个选择。

相关问题