3

みなさんこんにちは!

簡単な C++ で小さな GPS アプリケーションを作成しました。これは、プロトコルの切り替え、GPS チップへのコマンドの送信などです。GPS ポートへの書き込みは正常に機能しています。しかし、(受け入れられたコマンドを確認するために) ポートを読み取ろうとすると、多くの愚かな文字が表示されます。通常、NMEA 出力メッセージは次のようになります。

$GPGLL,4916.45,N,12311.12,W,225444,A

そして、私は同様のものを受け取りました:

1C0CFC14

何が悪いのかわかりません...私のコードのこの部分は次のとおりです:

LPCVOID buffer[100];
ReadFile(hSerial, buffer, 100, 0, 0);

または、いくつかのデータをログに記録するための別のもの:

LPCVOID buffer[100];
ReadFile(hSerial, buffer, 100, 0, 0);
ofstream log ("log.txt");
log << buffer;
log.close();

もちろん、Hserial は前に宣言されており、書き込みには適しています。Im が HANDLE を宣言したとき、hSerial ファイルを開いて読み取りと書き込みも行いました。対象プラットフォームは、Windows Mobile 5.0 および 6.0 です。どうしたの?助けてくれてありがとう!

4

1 に答える 1

2

GPSポートからのデータの読み取り、またはポートからのその他のデータの読み取りは、必ずしも簡単なことではありません。

読み取りを試みる前に、待機中のデータがあり、COMポートに以前のエラーがないことを確認する必要があります。次に、読み取りが成功した場合は、データが適切に終了し、完全なNMEAセンテンスで構成されていることを確認する必要があります。次のNMEAセンテンスの先頭、または1回の読み取りで数回続けてガットする場合があるため、それに対処する必要があります。

それをすべて別の日に残して、読み取り自体に焦点を当てましょう。

ReadFileの4番目のパラメーターは、実際に読み取られたバイト数を格納するDWORDへのポインターである必要があります。実際のデータを確実に取得するために、これを使用する必要があります。また、エラーの戻り値を確認する必要があります。

実際に読み取られるのを待っているデータがあることを確認した後、これが私がそれを行う方法です。

/**

  Read data from port

  @param[in] buffer pointer to location to store data
  @param[in] limit  maximum number of bytes to read

  @return  0 if error

*/
int cSerial::ReadData( void *buffer, int limit )
{

    if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );

    BOOL bReadStatus;
    DWORD dwBytesRead, dwErrorFlags;
    COMSTAT ComStat;

    ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
    if( !ComStat.cbInQue ) return( 0 );

    dwBytesRead = (DWORD) ComStat.cbInQue;
    if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit;

    bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
    if( !bReadStatus ){
        if( ::GetLastError() == ERROR_IO_PENDING ){
            WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
            return( (int) dwBytesRead );
            }
        return( 0 );
        }

    return( (int) dwBytesRead );

}

すべて非常に複雑に見えますが、上記のコードのすべてが必要であることが証明されています。これがないと、アプリはしばらくの間実行される可能性がありますが、いつかハングするか、文字化けする可能性があります。これらのチェックの一部を省略してもかまいませんが、このコードを開発したときと同じように、アプリの問題をデバッグするために何時間も費やす必要があります。

于 2012-04-04T22:48:47.193 に答える