[TWEシリーズ用 UART アプリケーション] 本アプリケーションは、親機と子機間の 1:1 または 1:N の構成で UART 通信を行います。 通信方法は透過モードと書式モード2種類用意されています。 - 透過モード 透過モードは、入力したデータ列が相手側からそのまま出力されます。親機は相手先 を選択するために DI1-DI4 のピンを使用します。同じ DI の設定同士の親機子機同 士が通信します。 - 書式モード 一定サイズまでのデータを、所定の書式で入力します。パケットを意識した送信方式 です。また書式にはチェックサムがあるため、UART でのデータ化けを抑制できます。 ■ 改版記録 - v0.4.3: 2013/07/04 アスキー系列の終端を の連続から または に変更しました。 アスキー系列のチェックサムを省略する終端 'X' を加えました。 チェックサムが省略されますのでデータ化けには脆弱になります。 :00123456X は :0012345664と同じ入力です。 拡張アドレスによる送受信を実装しました。 4バイトのアドレス欄にて 0xFFFFFFFF は未定義アドレスとしました。一部受信パ ケットでは宛先アドレスが 0xFFFFFFFF と表示されることが有ります。 - v0.4.1: 2013/07/03 初版(試食版1) ■ 利用ピン - TWE Lite DI1 -> DIO12 DI2 -> DIO13 DI3 -> DIO11 DI4 -> DIO16 M1 -> DIO10 M2 -> DIO2 M3 -> DIO3 BPS -> DIO17 UART TX -> DIO6 (UART0) UART RX -> DIO7 (UART0) - TWE Regular, STRONG DI1 -> DIO9 (KIT SW1) DI2 -> DIO10 (KIT SW2) DI3 -> DIO11 (KIT SW3) DI4 -> DIO20 (KIT SW4) M1 -> DIO0 M2 -> DIO1 M3 -> DIO8 BPS -> DIO12 UART TX -> DIO6 (UART0) UART RX -> DIO7 (UART0) ■ ピンによる設定 - 表記 - G -> GND 接続またはプルダウン - O -> VCC 接続またはプルアップまたはオープン - 親機 M1=G M2=O M3=O - 子機 M1=O M2=O M3=O - BPS設定について BPS=O -> 115200bsp 8N1 BPS=G -> 38400bps 8N1, インタラクティブモード(後述)にて変更可能 ■ インタラクティブモード インタラクティブモードは、ピン設定のみでは対応できない拡張的な設定を行います。 操作方法は + + + と少し時間を空けながら (0.2?1.0秒間隔) 入力します。 本アプリケーションとは設定内容は異なりますが基本的な操作は以下を参照してください。 http://mono-wireless.com/jp/products/twelite-dip/TWE-Lite-DIP-step3.html インタラクティブモードでは、以下の設定が可能です。 - Application ID (TWELITE DIP標準アプリ参照) 同一無線チャネルの他のシステムと干渉しないように識別子を設定します。 - Device ID (TWELITE DIP標準アプリ参照) 121を設定する事でピン設定する事なく親機に設定できます。 - Channels (TWELITE DIP標準アプリ参照) 無線チャネルを指定します。最大3つまで設定できます。 - UART Baud BPSピンを設定したときのUARTのボーレートを指定します。規定値は 38400bps です。 - UART Parity BPSピンを設定したときのUARTのパリティを指定します。規定値は N(無し) です。 - UART mode アプリケーションの動作モードを変更します。 T -> 透過モード A -> 書式モード、アスキー形式 B -> 書式モード、バイナリ形式 ■ 送信フォーマット - 表記について - OCTET 1バイト - OCTET N OCTETがNバイト連続する - BE_WORD 2バイト (BigEndian) 0x1234 -> 0x12 0x34 と並ぶ - BW_DWORD 4バイト (BigEndian) 0x1234ABCD -> 0x12 0x34 0xAB 0xCD と並ぶ - バイナリ形式・アスキー形式 以下のアスキー形式、またはバイナリ形式の書式にて、1送信分のデータを無線モ ジュールに入力します。入力にはタイムアウト(1秒)があり、さらに、チェックサム に相違が有ったり、期待しない文字が入力された場合は、その入力はキャンセルされ 応答も出力されません。 インタラクティブモードでは、確認作業の効率化のため、入力された系列のエコー バック表示を行い、またタイムアウトを廃止しています。連続して要求を入力する様 な場合の振る舞いなど動作が違う場合が有ります。 - アスキー形式 アスキー形式は、ペイロード+チェックサム部分のデータを16進数文字列(0-9, A-F)表記し、先頭に ':', 終端に または を付加します。 または チェックサムを省略し、終端を 'X' とします。 - チェックサム チェックサムはペイロードの和を8ビットで計算し、計算値の2の補数、つまり 符号反転したものです。結果、チェックサムおよびペイロード部の全バイトの和 を8ビットで計算すると 0 になります。 - 例 例えばペイロードが 0x00 0x12 0x34 0x56 の4バイトの場合 :0012345664 または :00123456X と表現されます。 - 注意 書式自体はModbus のアスキー形式と同等ですが、本アプリケーションはModbus 互換を意識したものではありません。また A-F, X は全て大文字とし小文字の入 力は受けつけません。 受理されない文字列の入力、またはタイムアウト(1秒)が発生した時は、未入力 状態に遷移します。 - バイナリ形式 - 1:OCTET 0xA5 - 2:OCTET 0x5A - 3:BE_WORD 0x8000 + ペイロード長 - 4:OCTET N ペイロード - 5:OCTET ペイロード部の XOR - 6:OCTET 0x04 終端子、省略可能 - アドレス形式 無線モジュールを特定するためのアドレスを規定します。 - 簡易アドレス 子機が最大100台まで利用できるアドレス形式です。以下に記載したアドレス 以外は使用できません。動作が不定になる場合が有ります。 - 0 -> 親機 - 1-100 -> 子機 - 120 -> アドレス未設定時の子機のアドレスです。 送信時に指定すると親機から全子機を指定します。 - 0x80 -> 拡張アドレスを指定する場合 - 0xDB -> 自身のアドレス - 拡張アドレス 拡張アドレスは、システム中に使用される16bitアドレス、または無線モジュール の個体アドレスです。 - 0x0000?0xFFFF の範囲は、IEEE802.15.4 の 16bit ショートアドレスです * 16bitショートアドレスはアプリケーションで自動に割り当てられます - 0x80000000以上は、無線モジュールの個体アドレスです * モジュールに記載される7桁のシリアル番号 + 0x80000000 となります - UART 送信要求コマンド UART 送信要求には簡易形式(TWELITE DIP 標準アプリケーションと同様)と拡張形式 が用意されます。拡張形式では、送信方法の選択、受信時のアドレス等の書式が追加 されます。以下の解説ではペイロード部のみを記載します。 - 簡易形式 - 書式(送信時の入力・受信時の出力) - 1:OCTET 送信時:宛先簡易アドレス 出力時:送信元簡易アドレス - 2:OCTET 0x00-0x7F データ (0x80 以降はコマンドとして解釈される場合があるので入力しない) - 3:OCTET N データ - 拡張形式 (送信時の入力) - 1:OCTET 送信先簡易アドレス - 2:OCTET 0xA0 (拡張送信コマンド) - 3:OCTET 応答ID (応答メッセージで利用される) - 4:BE_DWORD 送信先拡張アドレス (送信先簡易アドレスが 0x80 の場合のみ指定) - 5:OCTET オプション - ANY オプション引数(オプションに依存) ... オプション・オプション引数は複数指定可能 - 6:OCTET 0xFF オプション終端 - 7:OCTET N データ - 拡張形式 (受信時の出力) - 1:OCTET 送信元簡易アドレス - 2:OCTET 0xA0 (拡張送信コマンド) - 3:OCTET 応答ID (送信元の値が渡される) - 4:BE_DWORD 送信元拡張アドレス - 4:BE_DWORD 送信先拡張アドレス - 5:OCTET 受信品質 LQI値 (0..255 値が大きいほど受信品質良好) - 6:BE_WORD データバイト数 - 7:OCTET N データ - 拡張形式 (応答メッセージ) 応答メッセージはコマンド受付後のステータスを通知します。 - 1:OCTET 0xDB - 2:OCTET 0xA1 (拡張送信コマンドの応答) - 3:OCTET 1:送信要求の応答 - 4:OCTET 0:失敗 1:成功 - 拡張形式オプション - 0x01: MAC ACK を設定する。1ホップ中継は不可能になる。 - 0x02: アプリケーション再送の設定を行う。設定しなければ、デフォルト値が 選択される。続いて OCTET の再送回数を指定する。 - 0x00 〜 0x0F: 0 から 16 回の再送を行う。再送成功を持って終了する。 MAC_ACK を用いない場合は、1回送信すれば終了する事になる。 - 0x81 〜 0x8F: 1 から 16 回の再送を行う。回数分送信を試みる。 MAC_ACK を用いない場合、この設定を使用する。 - 0x03: 初回の送信までの遅延を設定し、その最小値を与える。 続いて BE_WORD の遅延時間[ms]を設定する。 - 0x04: 初回の送信までの遅延を設定し、その最大値を与える。 続いて BE_WORD の遅延時間[ms]を設定する。遅延の最小値より小さな値を設 定した場合無効となる。 - 0x05: アプリケーション再送の再送間隔を設定する。 続いて BBE_WORD の間隔[ms]を設定する。 - 0x06: 送信要求が完了する前に、次の送信要求を受け付ける。 例えば再送の遅延を大きくして複数のメッセージを併行的に送信する場合、最 初の要求が完全に完了するまで次の要求を受け付けないが、本オプションを設 定する事で、次の要求が受け付けられる。ただし、 - 1パケット分に収まるデータサイズに限定します。 - 同時並行数は5。送信順は保証されません。 ■ 制限事項 - 応答が発生しない場合もあります。外部アプリケーションでタイムアウトをもうけて 処理をしてください - UARTバッファのサイズには制限があり(1.5KB)またフロー制御を行っていません。 バッファ溢れ時の動作は、未定義です(原則、あふれたデータが捨てられる) - 併行送信要求時には、一度に送信キューに多くのパケットを投入できますが、キュー のサイズ以上一度に投入しないようにしてください。送信キューのサイズは 10、併 行処理数は 5 です。併行処理数以上の要求を投入した場合、処理が終って処理数に 余裕が出た時点で残りのパケットが処理されます。 - 複数チャネル動作時の送信成功率は下がります。 再送方法などのパラメータ調整を行ってください。 - 透過モードで大きなデータをまとめて送ったような場合や、書式モードですうパケッ トに及ぶ大きなデータを送信した場合、通信の成功率は下がります。複数チャネル運 用と同時に行うと更に成功率は低下します。 - ストレス試験を行った際の最適な再送回数、間隔などのパラメータ調整は為されてい ません。 - 時間遅延などを設定し、送信パケット到達順が前後するような場合は、より新しい パケットを受信された時点を持って、これより旧いパケットは受信出力されなくなり ます。 ■ 使い方例(透過モード) 0. 親機・子機の UART を PC でアクセスできるようにしておく (115200bps 8N1) 1. 親機の M1 を G, M2-3 をオープンに設定して電源投入 2. 子機の M1-M3 をオープンにして電源投入 3. 親機から文字列を入力してみる →子機から文字列が出力される 4. 子機から文字列を入力してみる →親機から文字列が出力される 5. 子機の D1=G にしてみて、親機から何か入力する →子機には何も表示されない 6. 親機も D1=G にしてみて、親機から何か入力する →子機に入力した文字列が表示される ■ 使い方(書式モード、アスキー形式) 0. 親機・子機の UART を PC でアクセスできるようにしておく (115200bps 8N1) ※ 改行を CR+LF に設定しておくこと 1. 親機の M1 を G, M2-3 をオープンに設定して電源投入 2. 子機の M1-M3 をオープンにして電源投入 3. 親機でインタラクティブモードに入る (+ + + と3回入力) 3.1 uart mode の設定で A を選択、セーブして終了。"mA[Enter]S" 4. 子機でインタラクティブモードに入る (+ + + と3回入力) 4.1 uart mode の設定で A を選択、セーブして終了。"mA[Enter]S" 5. 親機・子機共にインタラクティブモードに設定する(手入力で確認するため) 6. 親機から :7801020382[Enter] を入力する → 子機側で :00010203FA が出力される 7. 子機から :00010203FA[Enter] を入力する → 親機側で :7801020382 が出力される 8. インタラクティブモードを解除して、6/7 を実行する。 タイムアウトが設定されているので、改行付きコピー&ペーストで実行してください。 9. 末尾に例があるので実行してみる。 ■ 使い方(書式モード、バイナリ形式) 書式内容が違うだけで、アスキー形式と同様です。 "00010203" の系列はアスキー形式では :00010203FA となりますが、 0xA5 0x5A 0x80 0x04 0x00 0x01 0x02 0x03 0x00 と表現されます。 - 0x80 0x04 がデータ部のサイズ + 0x8000 - 末尾の 0x00 が 0x00 0x01 0x02 0x03 の XOR 値です。 unsigned char i = 0; i = i ^ 0x00; i = i ^ 0x01; i = i ^ 0x02; i = i ^ 0x03; ここで i = 0 となる。 ■ 例 ○ 子機→親機 :00010203FA (応答) :DBA1000183 (受信) :7801020382 ○ 親機→子機、少し長い(93バイト) :78020304DB32807005D70101100001000080A005D718DB32807005D70101100001000080A005D718DB32807005D70101100001000080A005D718DB32807005D70101100001000080A005D718DB32807005D70101100001000080A005D797 (応答) :DBA1000183 (受信) :00020304DB32807005D70101100001000080A005D718DB32807005D70101100001000080A005D718DB32807005D70101100001000080A005D718DB32807005D70101100001000080A005D718DB32807005D70101100001000080A005D70F ■ 例 (拡張形式) ※ 受信メッセージや応答メッセージの宛先アドレス値が変更されている場合が有ります。 ○ 子機→親機、単純な送信 :00A012FF123456B3 (応答) :DBA1120171 (受信) :78A0128630000100000000D80003123456A8 ○ 子機→親機、Ack 付きの送信 :00A01301FF123456B1 (応答) :DBA1130170 (受信) :78A0138630000100000100DB0003123456A3 ※ 子機の電源を切っておくと、送信が失敗する (応答) :DBA1130071 ○ 親機→子機、Ackつきの送信 :78A01301FF12345639 (応答) :DBA1130170 (受信) :00A0138630000200000000DE000312345618 ○ 子機→親機、連続送信(2秒後) :00A01001030800FF123456A9 :00A01101030800FF123456A8 :00A01201030800FF123456A7 :00A01301030800FF123456A6 :00A01401030800FF123456A5 (応答) :DBA1100173 :DBA1110172 :DBA1120171 :DBA1130170 :DBA114016F (受信) :78A0108630000100000100DB0003123456A6 :78A0118630000100000100DB0003123456A5 :78A0128630000100000100DB0003123456A4 :78A0138630000100000100DB0003123456A3 :78A0148630000100000100DB0003123456A2 ○ 連続送信(0〜2秒ランダム後) :00A01001040800FF123456A8 :00A01101040800FF123456A7 :00A01201040800FF123456A6 :00A01301040800FF123456A5 :00A01401040800FF123456A4 (応答) :DBA1100173 :DBA1110172 :DBA1120171 :DBA1130170 :DBA114016F (受信) :78A0108630000100000100D80003123456A9 :78A0118630000100000100DB0003123456A5 :78A0128630000100000100DB0003123456A4 :78A0138630000100000100D80003123456A6 :78A0148630000100000100DB0003123456A2 ○ 併行処理(2秒後に送信) :00A0100103080006FF123456A3 :00A0110103080006FFABCDEFD7 :00A0120103080006FF123456A1 :00A0130103080006FFABCDEFD5 :00A0140103080006FF1234569F :00A0150103080006FFABCDEFD3 (応答) :DBA1100173 :DBA1110172 :DBA1120171 :DBA1130170 :DBA114016F :DBA115016E (受信) :78A0108630000100000100DB0003123456A6 :78A0118630000100000100DB0003ABCDEFDA :78A0128630000100000100DB0003123456A4 :78A0138630000100000100DB0003ABCDEFD8 :78A0148630000100000100DB0003123456A2 :78A0158630000100000100DE0003ABCDEFD3 ○ 強制再送5回、ほか :00A01201040800060285050600FFABCDEF43 (応答) :DBA1120171 (受信) :78A0128630000100000100D80003ABCDEFDC :78A0128630000100000100D80003ABCDEFDC :78A0128630000100000100D80003ABCDEFDC :78A0128630000100000100D80003ABCDEFDC :78A0128630000100000100DB0003ABCDEFD9 :78A0128630000100000100D80003ABCDEFDC ※ 同一パケットで1秒以内はフィルタされるので受信出力されませんが、本コマンドで はタイムアウト以上に時間を空けており、タイムアウト後のデータが表示されます。 ○ 親機→子機 :78A01201030800FF1234562F (応答) :DBA1120171 (受信) :00A0128630000200000000E4000312345613 ○ 拡張アドレス 80B00213へ送信 :80A05A80B00213FF1234FC 80B00213へ送信 (Ack 付き) :80A05A80B0021301FF1234FB 80B00212へ送信 :80A05A80B00212FF1234FD 80B00212へ送信 (Ack 付き) :80A05A80B0021201FF1234FC 0x100 (親機) に送信 :80A05A00000100FF123440 :80A05A0000010001FF12343F :80A05A0000010101FF12343E