1

XP が組み込まれたシステムがあり、COM2 はハードウェア RS485 ポートです。

私のコードでは、RTS_CONTROL_TOGGLEを使用して DCB を設定しています。私はそれが言うことをするだろうと思います...書き込み空の割り込みが発生したら、カーネルモードでRTSをオフにします。それは事実上瞬時に行われるはずです。

代わりに、PC がメッセージの終了よりも 1 ~ 8 ミリ秒長くバスを駆動していることをスコープで確認します。話しているデバイスは、約 1 ~ 5 ミリ秒で応答しています。だから...通信の破損が多発しています。いいえ、ターゲットの応答時間を変更する方法はありません。

RS232 ポートに接続し、スコープを TX および RTS ラインに接続したところ、同じ結果が得られました。RTS ラインは、メッセージが送信されてから 1 ~ 8 ミリ秒高いままです。

また、FIFO をオフにするか、FIFO の深さを 1 に設定しようとしましたが、効果はありませんでした。

何か案は?「SendFile、clear RTS」サイクル中に、REALTIME優先度でユーザーモードからRTSラインを手動で制御しようとしています。これがうまくいくという希望もあまりありません。これは、ユーザー モードでは実行しないでください。

4

2 に答える 2

4

RTS_CONTROL_TOGGLEは、組み込み XP プラットフォームでは機能しません (送信後にオフになるまでに 1 ~ 15 ミリ秒の遅延があります)。timeBeginPeriod(1) などを使用してタイム クォンタムを 1 ミリ秒に変更すると、それを下げることができる可能性がありますが、信頼できるか、問題になるのに十分であるかは疑問です。(デバイスは時々 1 ミリ秒で応答します)

最終的な解決策は本当に醜いですが、このハードウェアで動作します。ハードウェアが固定されていないものには使用しません。

基本的:

1) シリアル ポートのデバイス マネージャー ページの FIFO をオフまたは 1 文字の深さに設定します。

2) 次のコードを使用して、メッセージ +追加の 2 バイトを送信します。

int WriteFile485(HANDLE hPort, void* pvBuffer, DWORD iLength, DWORD* pdwWritten, LPOVERLAPPED lpOverlapped)
{
  int iOldClass = GetPriorityClass(GetCurrentProcess());
  int iOldPriority = GetThreadPriority(GetCurrentThread());
  SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
  SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

  EscapeCommFunction(hPort, SETRTS);

  BOOL bRet = WriteFile(hPort, pvBuffer, iLength, pdwWritten, lpOverlapped);

  EscapeCommFunction(hPort, CLRRTS);

  SetPriorityClass(GetCurrentProcess(), iOldClass);
  SetThreadPriority(GetCurrentThread(), iOldPriority);

  return bRet;
}

WriteFile() は、最後の 1 バイトまたは 2 バイトがシリアル ポートに書き込まれると戻ります。それらはまだポートから出ていないため、2 バイト余分に送信する必要があります。CLRRTS を実行すると、それらの 1 つまたは両方が破棄されます。

私が言ったように...それは醜いです。

于 2009-06-19T17:58:28.623 に答える
1

何か案は?

DDK にシリアル ポート ドライバーのソース コードが含まれている場合があります。これにより、そのオプションがどのように実装されているかを確認できます。つまり、割り込みレベルか、DPC レベルか、またはそれよりも悪いかどうかを確認できます。

その他の可能性としては、ドライバーの書き換えが含まれます。サードパーティの RS485 ドライバーが見つかった場合は、それを使用します。または、独自のドライバを備えたサードパーティ RS485 ハードウェアを使用する (たとえば、少なくとも過去には、サードパーティは 32 ポート、ディープ バッファ、および独自のマイクロプロセッサを備えた「インテリジェント シリアル ポート ボード」を作成していました。RS485 は、誰かが解決しました)。

8 ミリ秒は、がっかりするほど長い時間のように思えます。XP が RTOS ではないことはわかっていますが、(通常は) それよりもうまくいくと思います。もう 1 つ確認すべきことは、干渉している可能性がある優先度の高いスレッドが他に実行されているかどうかです。独自のアプリケーションでいくつかのスレッドの優先度を上げている場合は、代わりに他のスレッドの優先度を下げる必要があります。

「SendFile、clear RTS」サイクル中に、REALTIME優先度でユーザーモードからRTSラインを手動で制御しようとしています。

そのスレッドを制御不能にしないでください。IME のようなスレッドは、バグがある場合、他のすべてのユーザー モード スレッドを永久にプリエンプトできます。

于 2009-06-19T15:45:54.107 に答える