c – ReadFile()表示失败,但错误代码为ERROR_SUCCESS

我在Windows上使用ReadFile()从串口读取数据.这个代码在某个时间点工作正常,但它现在失败了,我试图找出问题的根源,所以我怀疑它是串行配置或超时的问题,因为这些都没有改变.

ReadFile()返回false,表示发生了错误.但是,当我立即检查GetLastError()的值时,它返回0,即ERROR_SUCCESS.读取的字节数是0,所以我倾向于认为确实出现了问题,但错误代码完全没用.

有任何想法吗?谢谢.

编辑:这是一些相关的代码片段:

#define GPS_COM_PORT L"COM3"

// for reference, the device communicates at 115200 baud,
// no parity, 1 stop bit, no flow control

// open gps com port
hGpsUart = CreateFile(GPS_COM_PORT, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hGpsUart == INVALID_HANDLE_VALUE)
{
    if (GetLastError() == ERROR_FILE_NOT_FOUND)
    {
        msg.setText("GPS COM port does not exist!");
        msg.exec();
        QApplication::quit();
    }

    msg.setText("Error occurred while trying to open GPS COM port!");
    msg.exec();
    QApplication::quit();
}

// set gps com port settings
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(hGpsUart, &dcbSerialParams))
{
    msg.setText("Could not get GPS COM port settings!");
    msg.exec();
    QApplication::quit();
}
dcbSerialParams.BaudRate = CBR_115200;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hGpsUart, &dcbSerialParams))
{
    msg.setText("Could not set GPS COM port settings!");
    msg.exec();
    QApplication::quit();
}

// set gps com port timeouts
timeouts.ReadIntervalTimeout = MAXDWORD;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier = 10;
if (!SetCommTimeouts(hGpsUart, &timeouts))
{
    msg.setText("Could not set GPS COM port timeouts!");
    msg.exec();
    QApplication::quit();
}

// ... later in the code ...

char buf[161] = {0};
DWORD bytes_read = 0;

// This returns false...
if (!ReadFile(hGpsUart, buf, 160, &bytes_read, NULL)) 
{
    // Yet in here, GetLastError() returns ERROR_SUCCESS (0)
    QMessageBox msg;
    msg.setText("Error reading from GPS UART!");
    msg.exec();
}

解决方法:

我认为你的观察的关键是你的源中的短语“在这里,GetLastError()返回ERROR_SUCCESS(0)”

对GetLastError的调用必须是在(可能)失败的调用之后进行的下一次Win32调用.作为一个实验,尝试在失败处理程序中对GetLastError()进行显式调用,但是在消息框调用之前.我怀疑你会看到真正的失败代码.

祝好运!

上一篇:英语练习 2


下一篇:同一域树下的提权利用方式(Golden Ticket+SID History)