0

この質問は、8 つの発信チャネル IR 送信機のファームウェアに関するものです。これは、8 つの IR LED を備えたマイクロコントローラー ボードです。目標は、1 つまたは複数のチャネルを使用してデータ ストリームを送信できるトランスミッタを用意することです。データは UART を介してボードに配信され、1 つまたは複数のチャネルを介して送信されます。

私の送信回路は UART よりも高速なので、フロー制御は必要ありません。

現在、ファームウェアでチャネルが固定されているため、UART からの各バイトは直接送信されます。これは、UART 経由で目的のチャネルを設定する方法がないことを意味します。これは私が望んでいることです。

もちろん、最も簡単な解決策は、各ビットが 1 つのチャネルを表す制御バイトをデータ バイトに追加することです。これには、各バイトを 1 つまたは複数のチャネルにルーティングできるという利点がありましたが、もちろんオーバーヘッドが大幅に増加します。

ストリーム タイプの送信のため、送信機で長さフィールドを回避しようとしています。

私の研究は、この上のネットワーク スタックにあります。

私の質問は、これを解決するためのスキームまたは優れた慣行があるかどうかです。同様の問題がロボティクスにもあると思いますが、センサー データが常にクロス コントロール シグナルを流しますが、シンプルで洗練された解決策を見つけることができませんでした。

4

2 に答える 2

1

唯一の賢明な解決策は、UART データ用のキャリア プロトコルを作成することです。UART は EMI に対する耐性が低いため、とにかくこれが必要な場合があります。プロトコルに CRC チェックを含めることで、信頼性を高めることができます。(start/stop/parity による UART の組み込みエラー処理は非常に単純であり、70 年代半ば以降は非常に時代遅れであることに注意してください。)

通常、これらのプロトコルは のよう<sync token> <header> <data> <checksum>になり、ヘッダーにデータ長が含まれ、データが可変長になる場合があります。

おそらく現時点ではオプションではありませんが、SPI を使用した方がはるかに快適なインターフェイスでした。次に、8 つの IR ダイオードごとに 1 つのシフト レジスタを設定し、MUX/DEMUX 回路を介して SPI スレーブ セレクトを介してチャネルを選択できます。すべてが同期的に機能し、キャリア プロトコルは必要ありません。また、データ送信側とダイオードの間の MCU が完全に不要になります。

于 2014-11-27T07:54:09.813 に答える
1

私は通常、自分のプロジェクトで SLIP 伝送プロトコルを使用します。非常に高速で、実装が簡単で、必要なパケットをフレーム化するのに非常に適しています。

http://www.tcpipguide.com/free/t_SerialLineInternetProtocolSLIP.htm https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=slip%20プロトコル

基本的に、送信または受信する各バイトを、ヘッダーとフッターの両方として 0xC0 を使用する関数にフィードします。0xC0 は送信できるデータ パケットの有効なバイトであるため、0xC0 がヘッダーとフッターのみになることを保証するために、0xC0 のデータ バイトに対していくつかの変換が行われます。

次に、反対側で逆アルゴリズムを使用して、着信データをフレーム化し、正しい順序で 0xC0 を 2 回探すことができます。これは、メイン CPU 処理用にバッファリングしてフラグを立てることができる完全なパケットを意味します。

SLIP は、パケットの正しいフレーミングを保証します。

次に、SLIP パケット内のデータ フィールドがパケットを正しくフレーム化したときに存在する、独自のパケット フォーマットを定義するのはあなた次第です。

私はよく次のことをします...

<0xC0> ...<0xC0>

チャネルごとに異なるオペコードを使用します。必要に応じて、謝辞を含む別のレイヤーを簡単に追加できます。

于 2014-12-04T16:42:59.430 に答える