繁体   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