3

Boostasioを使用してシリアルポートを開くプログラムがあります。

シリアルポートには、デフォルトで、回線をアイドル状態に保つ遅延があります。Windowsプラットフォームでは30ミリ秒の遅延が見られ、Linuxプラットフォームでは20ミリ秒の遅延が見られました。

Linux環境の場合、「linux.h」のクラス「ioctl」には、いくつかのフラグ(および必要なもの:low_latency)を使用してシリアル設定を設定する方法があることがわかりました。

コードは次のとおりです。

boost::asio::basic_serial_port<boost::asio::serial_port_service>::native_type native = serial_port_.native(); // serial_port_ is the boost's serial port class.
struct serial_struct serial;
ioctl(native, TIOCGSERIAL, &serial);
serial.flags |= ASYNC_LOW_LATENCY; // (0x2000)
ioctl(native, TIOCSSERIAL, &serial);

Windowsプラットフォームでも遅延を減らしたいです。C ++のWindowsで同じことを行う同等の方法はありますか?

ところで、Windowsのデバイスマネージャーでシリアルポートのプロパティを変更することを提案するソリューションがいくつかあることを確認しましたが、これらのソリューションが示すようにそれらのプロパティがなく、コードソリューションが必要です。

4

2 に答える 2

2

Windowsのブーストasioから取得したネイティブハンドルを取得し、SetCommTimeoutsに渡します:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363437(v = vs.85).aspx

特に、COMMTIMEOUT構造のReadIntervalTimeoutを確認してください:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363190(v = vs.85) .aspx

ReadIntervalTimeout通信回線に2バイトが到着するまでに経過できる最大時間(ミリ秒単位)。ReadFile操作中、期間は最初のバイトが受信されたときに始まります。2バイトの到着間隔がこの量を超えると、ReadFile操作が完了し、バッファリングされたデータが返されます。ゼロの値は、インターバルタイムアウトが使用されていないことを示します。MAXDWORDの値は、ReadTotalTimeoutConstantメンバーとReadTotalTimeoutMultiplierメンバーの両方のゼロ値と組み合わされて、バイトが受信されていない場合でも、読み取り操作がすでに受信されたバイトをすぐに返すことを指定します。

GetCommTimeoutsを使用して現在の値を照会することもできます:http://msdn.microsoft.com/en-us/library/windows/desktop/aa363261(v = vs.85).aspx

于 2012-08-14T05:58:05.637 に答える
0

NT4/Win2k/WinXP の時代にこの問題があったことを思い出します。あなたが抱えている問題は似ていると思います。

COMMTIMEOUT 構造を使用すると、各タイムアウトの後に常にタイムスライスの遅延が追加されます。つまり、可変長パケットの場合、マシンが SMP マシンであるかどうかに応じて、常に 10 ミリ秒または 16 ミリ秒のレイテンシが追加されます。たとえば、実際には 1 ミリ秒のタイムアウトを取得できませんでした。これは、完了ポートを持つシリアル ポートでの非同期操作で COMMTIMEOUT を使用した場合でも当てはまりました。

この問題を解決するために、私は IO Completion Ports を使用し、未処理の単一文字読み取り操作のパイプラインを用意しました。バイトがポートに到着すると読み取りが完了し、メインの IOCP イベント ループでキューから取り出される可能性があります。これにより、コードが多少複雑になりますが、非常に高いパフォーマンスが得られました。

このアプローチは、boost::asio ではすぐには機能しません。Windows for asio 用の Windows IOCP ベースのシリアル ポート バックエンドの実装を試みるか、シリアル通信用に別の IOCP とスレッドを用意することができます。

于 2012-08-16T23:23:21.220 に答える