ReadFile() говорит, что это не удалось, но код ошибки ERROR_SUCCESS
Я использую ReadFile()
в Windows для чтения данных с последовательного порта. Этот код работал нормально в какой-то момент времени, но сейчас он терпит неудачу, и я пытаюсь отследить источник проблемы, поэтому я сомневаюсь, что это проблема с последовательной конфигурацией или таймаутами, поскольку ничего из этого не изменилось.
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();
}
2 ответа
Я думаю, что ключом к вашим наблюдениям является фраза в вашем источнике, которая гласит: "Но здесь GetLastError() возвращает ERROR_SUCCESS (0)"
Вызов GetLastError должен быть следующим вызовом Win32 после (предположительно) неудачного вызова. В качестве эксперимента попробуйте выполнить явный вызов GetLastError() в обработчике ошибок, но непосредственно перед вызовом окна сообщения. Я подозреваю, что вы увидите истинный код ошибки.
Удачи!
Конструктор QMessageBox может делать что-то, что очищает `GetLastError'. Попробуй это:
if (!ReadFile(hGpsUart, buf, 160, &bytes_read, NULL))
{
int LastError = GetLastError() ;
QMessageBox msg;
msg.setText(QString("Error %1 reading from GPS UART!").arg(LastError));
msg.exec();
}