首页 > 解决方案 > WriteFile 到串行端口正在工作,但写入的字节数为零

问题描述

问题:我的控制台应用程序(Microsoft Visual Studio C++ 2019)通过 USB 虚拟串行端口发送数据。一切正常,直到 WriteFile(参见我的代码片段)函数报告写入零字节,即使该函数没有失败(WriteFile 返回 TRUE)。GetLastError() 返回 1。请注意 COMM 设置已正确执行(包括读/写超时)。

我知道过去曾提出过非常类似的案例,但实际上我还没有找到关于这个问题的明确解释。

任何想法?

            if (!WriteFile(hPort, (LPCVOID)serout, 1 * sizeof(uint16_t), &byteswritten, NULL)) {
                printf("Error writing COMM port\n");
                return;
            }
            if (!byteswritten) {
                printf("Error bytes written COMM port %d", GetLastError()); 
            }
            FlushFileBuffers(hPort);

// COM SETUP
DCB dcb;
HANDLE hport;
std::string strport = "COM1";
TCHAR pcCommPort[16];
COMMTIMEOUTS timeouts;
_tcscpy_s(pcCommPort, CA2T(strport.c_str()));

hPort = CreateFile(
    pcCommPort,
    GENERIC_READ | GENERIC_WRITE,
    0,      //  must be opened with exclusive-access
    NULL,   //  default security attributes
    OPEN_EXISTING, //  must use OPEN_EXISTING
    0,      //  not overlapped I/O
    NULL); //  hTemplate must be NULL for comm devices

if (!GetCommState(hPort, &dcb))
    printf("CreateFile failed with error %d.\n", GetLastError());

//  Initialize the DCB structure.
SecureZeroMemory(&dcb, sizeof(DCB));
dcb.DCBlength = sizeof(DCB);

dcb.BaudRate = 921600; //256000 Baud
dcb.ByteSize = 8; //8 data bits
dcb.Parity = NOPARITY; //no parity
dcb.StopBits = ONESTOPBIT; //1 stop
if (!SetCommState(hPort, &dcb))
    printf("Fail setting serial port\n");

PrintCommState(dcb);

timeouts.ReadIntervalTimeout = 1;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.ReadTotalTimeoutConstant = 1;
timeouts.WriteTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 10;
if (!SetCommTimeouts(hPort, &timeouts))
    printf("Fail setting tineout on serial port\n");// setting timeouts failed.

PurgeComm(hPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

标签: c++winapivirtual-serial-port

解决方案


推荐阅读