天天看點

c語言中ERROR_SUCCESS,c – ReadFile()表示失敗,但錯誤代碼為ERROR_...

我在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();

}