0

マイクロコントローラーと ac# Windows アプリケーション間のシリアル通信を実装しようとしています。

コンピューターからマイクロコントローラーへの方向ですべてが正しく機能しています。しかし、他の方向に通信を実装する方法を正確に理解するのに苦労しています.

メッセージは 4 バイトで構成されています

  • B0 – 送信される値のアドレス/名前
  • B1 – 上位バイト
  • B2 – 下位バイト
  • B3 – チェックサム = バイト 0 ~ 2 の追加

完全なメッセージが確実に受信されるようにするために、バイト間に 20 ミリ秒以上ある場合、受信中の現在のメッセージをマイクロコントローラーにあきらめさせます。

タイミングを細かく制御できないことがわかっているため、ac# アプリケーション内からこの遅延を実装する方法がわかりません。

開始文字と停止文字を送信する他の A​​SCII プロトコルを見たことがありますが、バイナリ データを送信するときにこれを実装する方法がわかりません。この場合、値はバイト内で可能な任意の値を取ることができ、たまたま開始文字または停止文字が何であるかはわかりません。

リソースが限られているため、マイクロコントローラー側を基本的に保つ必要があり、コントローラーの主要なタスクには、ascii を 10 進数に変換する非常に正確な (サブ us 範囲) 必要があります。

マイクロプロセッサまたはコンピュータ側からこれをどのように実装する必要があるかについての推奨事項はありますか?

編集
ここで他の質問のいくつかを見てきましたが、それらはすべてはるかに大きなASCIIベースのメッセージを参照しているようです。

4

2 に答える 2

1

これはかなり悪い考えです。ワイヤーのもう一方の端にあるマシンが同じ保証を提供できることを前提としています。マイクロコントローラでは、20ミリ秒はまったく問題ありません。LinuxまたはWindowsを起動するマシン。シリアルポートへの書き込みでビジー状態のスレッドは、数百ミリ秒の間プロセッサを簡単に失う可能性があります。C#の場合のガベージコレクション。

例外的なケースに最適化しないでください。意味がありません。タイムアウトは2番目の範囲で、予想される最悪の場合の10倍である必要があります。プロトコルをフレーミングすることにより、プロトコルの信頼性をさらに高めます。受信者に再同期する機会を与える常に開始バイト。長さバイトが含まれている場合もありますが、遅かれ早かれそれが必要になります。チェックサムよりもCRCを優先します。広く無視されていますが、回復可能なプロトコルの提案についてはRFC916を確認してください。私がそれを使用したときはうまくいきましたが、接続の試行を信頼できるものにするために追加の作業が必要でしたが、受信バッファーをフラッシュする必要があります。

于 2013-03-14T13:45:11.523 に答える
1

次のコマンドを使用して、読み取りタイムアウトを 20 ミリ秒に設定できます。

serialPort.ReadTimeout = 20;

これにより、読み取り操作が 20 ミリ秒後にタイムアウトになります。この場合、必要なことを行うことができます。

ReadExisting読み取りタイムアウトに依存しないため、このタイムアウトと一緒に使用しないでください。
代わりに、Read()またはを使用してタイムアウト例外readByte()をチェックしてください。

ちなみに、書き込みが成功した場合でも、 WriteTimeoutを使用して同じことができます。だから気をつけて。

于 2013-03-14T12:28:47.863 に答える