質問

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

コードでは、 RTS_CONTROL_TOGGLE を使用してDCBを設定しています。空の書き込み割り込みが発生したら、カーネルモードでRTSをオフにします。それは事実上即座に行われるはずです。

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

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

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

アイデアはありますか? 「SendFile、clear RTS」の実行中に、リアルタイムモードでユーザーモードからRTS回線を手動で制御しようとしています。サイクル。これがうまくいくという希望もあまりありません。これはユーザーモードでは実行しないでください。

役に立ちましたか?

解決

組み込みXPプラットフォームでは、

RTS_CONTROL_TOGGLE は機能しません(送信後にオフになるまでに1〜15ミリ秒の可変遅延があります)。 timeBeginPeriod(1)などを使用してタイムクォンタムを1ミリ秒に変更した場合、それを減らすことができますが、信頼できるか、問題になるのに十分ではないかと思います。 (デバイスは@ 1ミリ秒で応答することがあります)

最終的なソリューションは本当にreallyいですが、このハードウェアで動作します。ハードウェアが固定されていない場所では使用しません。

基本的に:

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を実行すると、その一方または両方がゴミ箱に移動します。

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

他のヒント

  

アイデアはありますか

DDKにはシリアルポートドライバーのソースコードがあり、そのオプションの実装方法を確認できます。つまり、割り込みレベル、DPCレベル、またはそれ以上のレベルです。

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

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

  

「SendFile、clear RTS」の実行中に、リアルタイムモードでユーザーモードからRTS回線を手動で制御しようとしています。サイクル。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top