ウォッチドッグの間違った使い方のようです。この問題に対する 3 つの解決策を見つけました。
- 固定サイズのパケットと DMA を使用します。したがって、トランザクションごとに 1 つのパケットを受け取ります。どうやら、あなたの場合は不可能です。
- メッセージの終わりの文字が受信されるまで、メッセージを 1 文字ずつ受信します。EOM char がデータに表示される可能性があるため、エラーが発生しやすいタイプです。
- すべてのパケットの前に固定サイズのヘッダーを使用します。ヘッダーには、ペイロード サイズおよび/またはメッセージ タイプ ID を格納します。
3 番目のアプローチがおそらく最良の方法です。最初のトランザクションと組み合わせることができます。つまり、DMA を使用してヘッダーを受信し、次にデータを受信します (2 番目のトランザクションでは、データ サイズがヘッダーからわかった後)。これは、最も柔軟なアプローチの 1 つでもあります。
もう 1 つ心配すべき点は、バイトストリームの同期を維持することです。UART 入力バッファにゴミが残っていて、データとして読み取られたり、MCU に電源が投入された後にパケットの一部しか取得できなかったりする可能性があります (つまり、その時点までにパケットの先頭が既に送信されている)。これを回避するには、パケット ヘッダーにマジック バイトを追加し、おそらく CRC を追加します。
編集
OK、もう 1 つのオプション :) 受け取ったものすべてを、後で使用するために成長するバッファに保存するだけです。これは、基本的に PC ドライバーが行うことです。