1

から続く-GPS中間ドライバーの問題

上記はうまく答えられず、私は新しい質問に行くために問題に関する新しい情報を持っていると感じています。

私が直面している問題は、GPS中間ドライバーによってデータが配信される速度です。

Pocket Puttyを使用してシリアルポートを読み取り、公開された正確な情報を確認しました。

COM1-GPS中間ドライバー

COM 6-PCへのシリアルポート(データを手動で入力)

COM8-GPSハードウェア用の仮想シリアルポート。

COM 8を読むと、約3秒ごとに約18個のNMEAストリングが表示されることがわかります。これは、制限されたUSB接続を介してプッシュできるのと同じくらい高速です。そして、それはディスプレイにすばやく表示されます。COM 6(PCから手動でデータを送信する)を読み取る場合、同じようにすばやく表示されます。したがって、利用可能なデータに問題はありません。

GPS中間ドライバーを入力します。GPS中間ドライバーがCOM1(ソフトウェア)およびCOM6(ハードウェア)に設定されている場合。COM6に入力されたデータは、GPS中間ドライバーがない場合と同じようにCOM1に表示されます。データは変更されていないため、COM6で「JON」を送信すると、有効なNMEAデータではありませんが、COM1に表示されます。これは問題ありません。

問題はCOM8にあります。GPS中間ドライバーがCOM1(ソフトウェア)およびCOM8(ハードウェア)に設定されている場合。COM1のPocketPuttyに表示されるデータは本当に遅いです。画面の出力は毎秒約5文字で、データは有効ですが、配信が非常に遅いだけです。これは、仮想シリアルポートの実装における問題を指摘しています。これは、問題を仮想シリアルポートに限定しているため、GPS中間ドライバーが一度に1文字だけすべてのデータを読み取っていないかのようです。

COM8がGPSソフトウェアとPocketPuttyアプリケーションと直接連携し、データが利用可能で、読み取られており、正しいことを示しているため、これを改善するために何を変更できるかわからないため、仮想シリアルポートの実装の明確な例を誰かが提供できますか? 。

4

1 に答える 1

0

デバッグビルドを実行しているデバイスメーカーからサポートを受けた後、問題の原因は、クライアントアプリケーションが多くの読み取り呼び出しを行っていたことでした。シリアルポートはそれ自体でそれらを処理できましたが、GPS中間ドライバーを介して呼び出しの数が多すぎて、オーバーヘッドが通信を台無しにしていました。これは、Mutexロックと一般的なスレッドの問題によるものでした。

クライアントアプリケーションが正常に機能するには、GPS中間ドライバーへの読み取りごとに960バイトのデータを読み取る必要があります。これは理想的な解決策ではないため、別の修正が見つかりました。

解決策は、readメソッドにWaitForSingleObject(IsThereEnoughGPSDATAEvent、COMTotalTimeout)を追加して、十分な量のデータが利用可能な場合にのみすべての読み取りがデータを取得するようにすることでした。もともと私は960をバッファで利用できるように要求しましたが、それを10バイトに設定しましたが、それでも機能します。

サンプルコード

DWORD COM_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count )
{
    if(gpsThreadEvents[GPS_THREAD_EVENT_DATA_AVAILABLE] != NULL)
    {
        if(WaitForSingleObject(gpsThreadEvents[GPS_THREAD_EVENT_DATA_AVAILABLE], GPSTimeouts.ReadTotalTimeoutConstant) != WAIT_OBJECT_0)
        {
            return 0;
        }
    }

    //read code goes in here

    return dataOut;
}
于 2011-01-10T16:14:55.003 に答える