2

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();
}
4

2 に答える 2

2

あなたの観察の鍵は、「まだここでは、GetLastError()はERROR_SUCCESS(0)を返す」というソースのフレーズだと思います

GetLastErrorの呼び出しは、(おそらく)失敗した呼び出しの後に行われる次のWin32呼び出しである必要があります。実験として、失敗ハンドラー内で、メッセージボックス呼び出しの直前にGetLastError()を明示的に呼び出してみてください。本当の失敗コードが表示されると思います。

幸運を!

于 2011-04-16T09:10:48.003 に答える
1

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();
}
于 2011-04-16T09:21:49.040 に答える