3

私は LPC2148 用の独自のドライバーを書いていますが、疑問が頭に浮かびました。サイズが指定されていないメッセージを UART で受信するにはどうすればよいですか?

頭に浮かぶのは次の 2 つだけです。1 - ウォッチドッグを構成し、時間切れになったら受信を終了します。2-メッセージが送信されるたびに、メッセージの終わりの文字が必要になるようにします。

私の意見では、最初の選択肢の方が優れているように思えますが、誰かがより良い答えを持っているかどうか知りたいです。

どうもありがとうございました

4

5 に答える 5

8

これまでに受信したバイト数を呼び出し元に渡すだけです。UART ドライバーはアプリケーション プロトコルを実装しようとするべきではなく、アプリケーションが実装する必要があります。

于 2012-12-27T06:40:18.347 に答える
3

ウォッチドッグの間違った使い方のようです。この問題に対する 3 つの解決策を見つけました。

  1. 固定サイズのパケットと DMA を使用します。したがって、トランザクションごとに 1 つのパケットを受け取ります。どうやら、あなたの場合は不可能です。
  2. メッセージの終わりの文字が受信されるまで、メッセージを 1 文字ずつ受信します。EOM char がデータに表示される可能性があるため、エラーが発生しやすいタイプです。
  3. すべてのパケットの前に固定サイズのヘッダーを使用します。ヘッダーには、ペイロード サイズおよび/またはメッセージ タイプ ID を格納します。

3 番目のアプローチがおそらく最良の方法です。最初のトランザクションと組み合わせることができます。つまり、DMA を使用してヘッダーを受信し、次にデータを受信します (2 番目のトランザクションでは、データ サイズがヘッダーからわかった後)。これは、最も柔軟なアプローチの 1 つでもあります。

もう 1 つ心配すべき点は、バイトストリームの同期を維持することです。UART 入力バッファにゴミが残っていて、データとして読み取られたり、MCU に電源が投入された後にパケットの一部しか取得できなかったりする可能性があります (つまり、その時点までにパケットの先頭が既に送信されている)。これを回避するには、パケット ヘッダーにマジック バイトを追加し、おそらく CRC を追加します。

編集

OK、もう 1 つのオプション :) 受け取ったものすべてを、後で使用するために成長するバッファに保存するだけです。これは、基本的に PC ドライバーが行うことです。

于 2012-12-27T06:04:57.087 に答える
2

実際の組み込み UART ドライバは通常、リング バッファを使用します。バイトは順番に格納され、クライアントはバッファーがいっぱいになる前にバッファーから読み取ることを約束します。その後、ステート マシンは複数のパスでメッセージを処理できます。受信が終了したことをウォッチドッグが通知する必要はありません。

于 2012-12-27T06:48:16.450 に答える
0

ウォッチドッグ タイマーは、デバイスの予期しない動作が発生したときにシステムをリセットするために使用されます。アプリケーションが必要とするサイズのデータ​​を格納できるバッファを使用する方がよいと思います。

于 2012-12-27T07:25:52.733 に答える
0

オプション 2 を選択することをお勧めします) 送信文字列に送信終了文字を追加します。

ただし、実際の送信を受信して​​いることを確認するために、送信の開始も追加することをお勧めします。

于 2012-12-27T07:19:00.230 に答える