Windows XPでは、標準の(マザーボード上の)RS-232シリアルポートを開いて構成しました。
dcb.fRtsControl = RTS_CONTROL_TOGGLE;
これは私のニーズには問題なく機能します。
保留中のRXはありませんが、アプリケーションの制御下でRTSラインを簡単に切り替える必要がある場合があります。RTS_CONTROL_TOGGLEが有効になっていると失敗するため、EscapeCommFunctionを呼び出すことはできません。
私はこれを試みました:
dcb.fRtsControl = RTS_CONTROL_ENABLE; // manual RTS control and turns on RTS
SetCommState( hDevice, &dcb );
dcb.fRtsControl = RTS_CONTROL_TOGGLE; // turns off RTS since there is no TX pending
SetCommState( hDevice, &dcb );
ただし、これは機能しないようです。RTSトグルが表示されません。これは、デバイスドライバーが、RTSを設定してクリアしていることに気付いたため、実行していたことを中止するようなものです。
私がそこで眠ったら:
dcb.fRtsControl = RTS_CONTROL_ENABLE; // turn on RTS
SetCommState( hDevice, &dcb );
Sleep(1);
dcb.fRtsControl = RTS_CONTROL_TOGGLE; // turns off RTS since there is no TX pending
SetCommState( hDevice, &dcb );
次に、トグルが表示されますが、長さは非常に可変で、1〜15ミリ秒の範囲です(これは予想されることです)。timeBeginPeriodを使用して1msのスケジューリングを設定しましたが、スレッドはすでに高い優先度になっています(リアルタイムの優先度に移行する必要がありますか?)。
では、RTSの変更をハードウェアに「フラッシュ」して、スリープを実行する必要がないようにするためにできることはありますか?ビジーウェイト(QueryPerformanceCounterを使用して必要な時間待機する)はできますが、それでもRTSの変更がデバイスに「フラッシュ」されないのではないかと心配しています。
ありがとう。