シリアル経由のMCUの制御コマンドの実装


8

PCからシリアル経由でコマンドを受け入れるようにするプロジェクトにコマンドインターフェイスを統合することを検討しています。

アイデアは、デバイスはそれを実行しますが、コマンドが送信され、それを実行するというものです。これは、シリアルデータを待機している単なるアイドルデバイスであることがわかったほとんどの例とは異なります。

たとえば、LEDを制御してアニメーションを再生するデバイスなどです。3つのプリセットアニメーションがあるとします。オンにすると、常に1番を再生します。PC側では、「プリセット2を再生」または「色を緑に変更」コマンドを送信するか、デバイスにライブリアルタイムアニメーションを送信します。 LEDで遊ぶ。

だから私の質問は、私はこの「デザインパターン」について多くの情報を見つけることができないということですか?どこを見ればよいのかわかりません。一番近いのは、既製のarduinoシリアル解析ライブラリです。ただし、C /非Arduino /理論的アプローチの詳細を探しています。

私はシリアルプロトコルを調べていますが、これはSPIやI2Cなどのことであり、実際にソフトウェアで制御/コマンドインターフェイスを実装する方法ではありません。

HDLCについても知りましたが、これは標準/プロトコルのようです。同様のスレッドは/programming/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system これはいくつかの非常に素晴らしい情報を持っていますが 、やるべきことですプロトコル/通信自体で。

これをコード化/実装してコマンドまたはコントロール機能を作成する方法を見つけようとしています。

無限ループを使用して、着信コマンドのシリアルを監視およびキャッチし、IFステートメントのリストを使用して、実行するコマンドを選択しますが、コマンドおよびシステムが正常である必要がない場合、またはその場合コマンドを逃した?

割り込み駆動、ステートマシン?

例を調べて見つけるために使用できる正式な名前はありますか?

編集:

同じ質問をしている人のために、私は調査中にこの本当に良い例を見つけました、 http://www.adnbr.co.uk/articles/parsing-simple-usart-commands


FreeMODBUSやFirmataなどのフレームワークを使用しないのはなぜですか?
Ignacio Vazquez-Abrams

回答:


5

通信プロトコルを実装するには多くの方法があります。たとえば、次の使用を選択できます。

  • 人間が読める形式またはバイナリ
  • チェックサムやCRCなどのエラーチェック
  • 開始および/または終了メッセージ文字
  • メッセージの長さ、数などのペイロード情報
  • 確認/否定確認/再試行メカニズム

コマンド例は人間が読める形式であり、メッセージの終わりの文字として「\ n」(入力)を使用する必要があります。メッセージの開始/終了文字により、入力ストリームの解析が容易になります。

典型的なプログラムフローは、開始文字が受信されるのを待ってから、終了文字が受信されるまで後続のバイトをメッセージバッファに格納します。それが発生したら、バッファを別の関数に渡してメッセージを解析します。開始文字がない場合は、終了文字を受け取るまで、ただちにバイトの格納を開始します。

ほとんどの*組み込みシステムは無限ループで実行されます。シリアル送受信の処理は、Arduinoの割り込みを介して行われます(HardwareSerial.cppを参照)。受信した文字はバッファに入れられます。ループのすべての反復で、バッファー(Serial.available())に文字があるかどうかを確認し、それらを処理します。割り込みを使用して文字を受信することにより、文字を見逃すことはありません。ただし、これらの割り込みルーチンですべての処理を行うわけではありません。そうしないと、処理が長くなりすぎて、後続の割り込みを見逃してしまいます。

デバイスをアイドルループ状態にしたくない場合は、デバイスをスリープ状態にして、割り込みまたはその他のイベントが発生するまでループを「一時停止」します。

私は人間が読めるメッセージングのためにこのライブラリが本当に好きです:http : //playground.arduino.cc/Code/Messenger

*ないシステムは考えられませんが、おそらくそこにあるシステムがあるでしょう。


3

プログラムがしなければならないことは、次のとおり
です。1。シリアルポートで新しいキャラクターを頻繁にチェックする
2.適切なルーチンにジャンプする/ステータスを設定する/キャラクターに応じて何でもする
3. 1に進む

プログラムは単一の文字で動作することも、独自のメッセージ形式を作成することもできます。私はしばしば "$"で開始して改行で終了し、コマンドに読み取り可能なASCII文字を使用しました(デバッグを容易にするためです)。

無効なコマンドを受け取ってもプログラムがハングアップしないことを確認してください。


一部の自動テスト装置(ATE)では、非常によく似たシリアルリンクを使用してこれを行っています。
スプーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.