2016-04-29 4 views
0

私はUARTを介してmicrontroller LED、LCDなどで制御する簡単なデータを通信するために使用できる軽量メッセージプロトコルまたは構造を探しています。私は、 "LED1 ON、LED1 OFF、LED1 GREENなどのようなコマンドで文字列ASCIIデータを送ることができると思う"UARTを介してマイクロコントローラを制御するメッセージングプロトコル

私はイーサネットからRS232(UART)モジュールを使用しています。特定のデータに対してパケットを解析します。 UDPからのこのデータは、LEDの点灯、7セグメント表示、LCD文字列メッセージなどを制御するために使用されます。

LEDの制御、7セグメント表示、LCDなどのすべての周辺制御は、AVRマイクロコントローラによって処理されます。このアーキテクチャーはマスター(イーサネット・コントローラー)とスレーブ(AVR)に似ています。しかし私はまた、AVRからボタン押下やハートビートメッセージなどのメッセージを得ることができる必要があります。

私は、だから私は、ユニークな私がコントロールする各デバイスについてのdeviceID、データの長さ、および実際のデータを持っている可能性が

struct HWCtrlData 
{ 
    unsigned char deviceID; 
    unsigned char deviceDataLen; 
    unsigned char deviceData[255]; 
} 

ような何かを送ることを考えていました。

私はRGB LEDの、7つのセグメントディスプレイ、LCDにASCII文字列を送信することができます考えていた。

はLED1「グリーン」を送信し、それはRGBは、たとえば緑にLEDを点灯します。

これを行うより良い方法はありますか? ASCII文字列とデータの破損、エラーチェック(CRC?)を心配する必要があります

私のためにこれを行うことができるプロトコルはありますか?

+0

最も広く使用されているのは[ModBus](http://www.modbus.org)です。しかし、すべてのプロトコルの一般的な概念は、[ID:1-4] [CMD:1-2] [CMD_OPT:0-X] [CRC:1-2](バイト単位の長さ)です。 – imbearr

答えて

0

まずは、パケットの開始と終了を制御することが重要です。それを行う方法は2つしかありません(ハードウェアフロー制御を使用しない場合)。Modbusプロトコルを使用します。 RTUとASCIIの2つの実装があります。最初に、2つの連続するバイト間に3,5シンボルの遅延が発生した場合、パケットの終わりを検出します。秒は、パケットの先頭を検出するために開始記号0x3A(:)を使用します。 最初のプロトコルは短くなりますが、MCUの速度がより速くなければなりません。

LRCを使用するかどうか、CRCチェックは配線の長さと電気的環境によって異なります。エラーがある場合は、制御チェックが必要です。 RTU ModbusはCRCを使用し、asciiはlrcを使用します。

プロトコルで複雑な文字列を使用しないでください。もっとも簡単なフォーマットは、(私にとって)[opcode] [register] [value] - 4バイトのみです。

0

チェックサムと境界を区別する何らかの方法が必要なのであれば、理想的です。パターン(ある文字)の長さ(おそらくバイト、バイナリ)、ペイロード、チェックサムを開始します。または開始パターン、ペイロード、チェックサム、停止パターン(ある文字/バイト)。

NMEAがどのようにasciiであるのか見ることができます。実際に単語を含む開始パターンがあります。必要な場合はカンマ区切りのパラメータを、次にアスペクトパターンの停止パターンはペイロードのチェックサムを持ちます。あなたはそれをASCIIで見ることができますが、それはすべての望ましい機能を持っています。

あなたはおそらく、開始パターンとチェックサムを得ることができます。これは、数字のasciiカップルである可能性があります。可能なコマンドのリストが短い可能性が高いので、それらはまったく自己チェックです。可能性は低いですが、あなたは逃したいと思っていません。またはLED1 ON LED2をOFFにしますが、一部の文字が失われてLED1 OFFになります。チェックサムはそれをカバーするでしょう。

関連する問題