最適な出力のために、Google Chrome(15以降)または Microsoft Edge(79以降)を推奨いたします。
2024-11-14 現在シリアル通信アプリの通信モード
各通信モードの説明
シリアル通信アプリ(App_Uart)には、5つの通信モードがあります。
通信モードの一覧
各モードは、インタラクティブモードによって切り替えます(一部のモードはピン入力にて設定可能)。
初期状態はヘッダ付き透過モードです。
モードに関わらず、送信データは80バイト以内としてください
パケットサイズの制約から、一度に送るデータはバイナリ換算で80バイト以内に収めてください。
TWELITE が採用する IEEE 802.15.4 のパケットの最大長は128バイトであり、オーバーヘッドを考慮するとシリアル通信アプリのペイロードに使用できる領域は80バイトに限られます。
大量のデータを送信する場合は、Wi-Fi などを利用した他社製品をご検討ください。TWELITE は少ないデータを効率よく送る用途に適しています。
A
:書式モード(アスキー)
送信側の端末へ特定の書式に従ったデータを入力すると、受信側の端末も特定の書式に従ったデータを出力します。
16進数で表すデータはアスキー文字列で表現します。
送信側の入力 | | 受信側の出力 |
---|
簡易形式/拡張形式のデータ | → | 簡易形式/拡張形式のデータ |
TWELITE UART では、SET
ピンを GND
へ接続して起動すると本モードが有効となります。
データを表現する形式は2種類あります。
- 簡易形式:論理デバイスIDだけを使用。超簡単!標準アプリのUART伝送機能と互換性あり
- 拡張形式:論理デバイスIDに加えて、シリアルIDや再送回数などの送信オプションを使用できる
例えば、5バイトのバイナリデータ 0x48 0x45 0x4C 0x4C 0x4F
は、簡易形式を使って次のように送信できます。
【送信側】
:000148454C4C4F8B <- 入力
:DBA1800103 <- 出力
【受信側】
書式モードでは、アプリケーションIDなどの設定をインタラクティブモードだけでなく UART によるコマンド(アスキー形式)によって動的に適用できます。
B
:書式モード(バイナリ)
送信側の端末へ特定の書式に従ったデータを入力すると、受信側の端末も特定の書式に従ったデータを出力します。
16進数で表すデータはそのままバイナリ形式で表現します。
送信側の入力 | | 受信側の出力 |
---|
簡易形式/拡張形式のデータ | → | 簡易形式/拡張形式のデータ |
TWELITE / TWELITE DIP では、EX1
ピンを GND
へ接続して起動すると本モードが有効となります。
書式モード(アスキー)と同様に、データを表現する形式は2種類あります。
例えば、5バイトのバイナリデータ 0x48 0x45 0x4C 0x4C 0x4F
は、簡易形式を使って次のように送信できます。
【送信側】
0xA5 0x5A 0x00 0x07 0x00 0x01 0x48 0x45 0x4C 0x4C 0x4F 0x43 0x04 <- 入力
0xA5 0x5A 0x00 0x04 0xDB 0xA1 0x80 0x01 0xFB 0x04 <- 出力
【受信側】
0xA5 0x5A 0x00 0x07 0x78 0x01 0x48 0x45 0x4C 0x4C 0x4F 0x3B 0x04 <- 出力
書式モードでは、アプリケーションIDなどの設定をインタラクティブモードだけでなく UART によるコマンド(バイナリ形式)によって動的に適用できます。
C
:チャットモード
テキストチャットを実現します。
送信側の入力 | | 受信側の出力 |
---|
任意の文字列 | → | 補助情報+任意の文字列 |
プロンプトの表示とエコーバック(入力した文字の出力)を行います。すべての端末は子機として、同報通信を行います。
例えば、ある端末から他の端末へ Hello
という文字列を送信する場合は、次のように振る舞います。
【送信側】
810A4778:0> Hello <- 入力
810A4778:1> <- 出力
【受信側】
[810A4778:0] Hello <- 出力
82018CA0:0> <- 出力
上記の例ではプロンプトにシリアルIDを表示していますが、任意のハンドル名を使用することもできます。
D
:透過モード
送信側の端末へ任意のデータを入力すると、受信側の端末は受信したデータをそのまま出力します。
送信側の入力 | | 受信側の出力 |
---|
任意のデータ | → | 任意のデータ |
書式を必要としないため、既存の UART 通信を簡単に無線化できます。
一方で、データの区切りがあいまいになってしまうほか、受信側の出力から送信元を判別できないといった欠点があります。
初期状態では、送信側へ入力されたデータをCRLFで区切り、CRLF よりも前のデータを送信します。
例えば、送信側の端末へ Hello<Enter>
と入力すると、受信側の端末はそのまま Hello
を出力します。
【送信側】
【受信側】
E
:ヘッダ付き透過モード
送信側の端末へ任意のデータを入力すると、受信側の端末は受信した内容に特定の書式で補助情報を付加したデータを出力します。
送信側の入力 | | 受信側の出力 |
---|
任意のデータ | → | 任意のデータ+補助情報 |
初期状態では、送信側へ入力されたデータをCRLFで区切り、CRLF よりも前のデータを送信します。
例えば、送信側の端末へ Hello<Enter>
と入力すると、受信側の端末は補助情報を含んだ書式で Hello
を出力します。送信側の端末も送信完了といったメッセージを伝える書式を出力します。
【送信側】
Hello <- 入力
;U;00004;219;0x820163B2;000;000;0,1,Hel...;6E; <- 出力
【受信側】
;U;00003;000;0x820163B2;255;000;Hello;42; <- 出力
受信側が出力する補助情報は、送信元のアドレスや受信時の電波強度、チェックサム等を含みます。補助情報の書式はカスタマイズできます。
1 - シリアル通信アプリの書式モード(アスキー形式)
送受信双方の出力にヘッダを付加するモード(アスキー形式)
書式モードは、送受信双方の出力にヘッダを付加します。アスキー形式では、データを16進数の文字列で表します。
概要
送信側の端末へ特定の書式に従ったデータを入力すると、受信側の端末も特定の書式に従ったデータを出力します。
データは16進数のアスキー文字列で表現します。
送信側の入力 | | 受信側の出力 |
---|
簡易形式/拡張形式のデータ | → | 簡易形式/拡張形式のデータ |
- TWELITE UART では、
SET
ピンを GND
へ接続して起動すると書式モード(アスキー)が有効となります。 - TWELITE / TWELITE DIP では、
EX1
ピンを GND
へ接続して起動すると書式モード(バイナリ)が有効となります。
扱うことのできる書式の形式は2種類あります。
- 簡易形式:論理デバイスIDだけを使用する。超簡単!標準アプリのUART伝送機能と互換性あり
- 拡張形式:論理デバイスIDに加えて、シリアルIDや再送回数などの送信オプションを使用できる
例えば、5バイトのバイナリデータ 0x48 0x45 0x4C 0x4C 0x4F
は、簡易形式を使って次のように送信できます。
【送信側】
:000148454C4C4F8B <- 入力
:DBA1800103 <- 出力
【受信側】
基本の書式
基本形式や拡張形式で表現したデータ列を送信するときは、アスキー文字列(0-9,A-F)へ変換します。
書式は超簡単!標準アプリ(App_Twelite)や親機・中継機アプリ(App_Wings)の親機の出力と同様に、:
で始まりCRLFで終わります。
ヘッダ | ペイロード | チェックサム | フッタ |
---|
: | 00 -FF の繰り返し | ペイロードのLRC8 | CRLF |
- すべて ASCII 文字
- 先頭は
:
(0x3A
) - チェックサムはペイロードの合計の2の補数
- 末端は CRLF (
\r\n
/0x0D 0x0A
) - ビッグエンディアン
例えば、バイナリデータ 0x00 0x11 0x22 0x33 0xAA 0xBB 0xCC
は次のように表現します。
:00112233AABBCC69<CR><LF>
親機と子機の区別
書式モードは、親機と子機を区別します。
親子間では、アプリケーションIDと周波数チャネルを合わせる必要があります。
送信元の判別
書式モードでは、受信したデータから送信元を判別できます。
簡易形式の書式では論理デバイスIDを、拡張形式の書式では論理デバイスIDに加えて拡張アドレスを利用します。
拡張アドレスは、TWELITE 本体に記載された7ビットのシリアルIDの先頭へ0x8
を付加したものです。
簡易形式の書式
書式モードの簡易形式を利用する場合は、次の書式に従います。
送信側の入力
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信先の論理デバイスID | 親機0x00 ,子機0x01 -0x64 ,全子機0x78 |
1 | uint8 | コマンド番号 | 0x80 未満の任意の値 |
2 | [uint8] | 任意のデータ | 長さ\(N\)のバイト列(\(N\leqq80\)を推奨) |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
受信側の出力
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信元の論理デバイスID | 親機0x00 ,子機0x01 -0x64 ,未設定子機0x78 |
1 | uint8 | コマンド番号 | 送信側で指定した0x80 未満の値 |
2 | [uint8] | 任意のデータ | 長さ\(N\)のバイト列 |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
送信側の出力(応答メッセージ)
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信元の論理デバイスID | 0xDB のみ:自身を示す |
1 | uint8 | コマンド番号 | 0xA1 のみ |
2 | uint8 | 応答ID | 128 -255 (0x80 -0xFF )の範囲で続き番号を示す |
3 | uint8 | 処理結果 | 成功1 ,失敗0 |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
使用例
親機から全子機に対してバイト列 0x11 0x22 0x33 0xAA 0xBB 0xCC
を送信する例を示します。
【送信側:親機】
:7801112233AABBCCF0<CR><LF> <- 入力
:DBA1800103<CR><LF> <- 出力
末尾の0xF0
はチェックサム:0x78
から0xCC
までの合計の2の補数のLSBから8ビット。
【受信側:全子機】
:0001112233AABBCC68<CR><LF> <- 出力
末尾の0x68
はチェックサム:0x00
から0xCC
までの合計の2の補数のLSBから8ビット。
拡張形式の書式
書式モードの拡張形式を利用する場合は、次の書式に従います。
送信側の入力
送信先の指定に論理デバイスIDを使用する場合
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信先の論理デバイスID | 親機0x00 ,子機0x01 -0x64 ,全子機0x78 |
1 | uint8 | コマンド番号 | 0xA0 のみ |
2 | uint8 | 応答ID | 任意の値 |
3 | [uint8] | オプション | 長さ\(N\)のオプション列 |
3+\(N\) | [uint8] | 任意のデータ | 長さ\(M\)のバイト列(\(M\leqq80\)を推奨) |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
送信先の指定に拡張アドレスを使用する場合
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 拡張アドレスの指定 | 0x80 のみ |
1 | uint8 | コマンド番号 | 0xA0 のみ |
2 | uint8 | 応答ID | 任意の値 |
3 | uint32 | 送信先の拡張アドレス | シリアルIDの先頭へ0x8 を加えた値 |
7 | [uint8] | オプション | 長さ\(N\)のオプション列 |
7+\(N\) | [uint8] | 任意のデータ | 長さ\(M\)のバイト列(\(M\leqq80\)を推奨) |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
オプション列の詳細
拡張形式では、オプション列を指定することで細かな設定を行うことができます。
オプション列は、オプションのIDと引数の繰り返しで表現します。終端は 0xFF
とします。
オプションを指定しない場合は0xFF
の1バイトだけを指定します。
入力後1秒が経過すると、送信処理はタイムアウトします。また、内部のバッファが処理待ちで埋まってしまい、新しい要求を受け付けることができない場合があります。アプリケーション再送や遅延を設定する場合は、極端な値に設定しないように注意してください。
0x01
:MAC ACKの有効化
MAC層のACK(確認応答)を有効化します。
頻繁にデータを送信する場合には適しませんが、信頼性を向上できる場合があります。
中継機は利用できません。また、送信先を全子機(0x78
)とするときは利用できません。
0x02
:アプリケーション再送の有効化
MAC ACK を使用するときは、0x00
-0x0F
を指定します。送信に成功するまで、それぞれ0-16回の再送を行います。
MAC ACK を使用しないときは、0x81
-0x8F
を指定します。必ず1-16回の再送を行います。
応答メッセージは、すべての再送が終了してから出力します。
0x03
:初回送信の遅延の最小値
初回送信までの遅延の最小値をミリ秒で指定できます。
0x04
:初回送信の遅延の最大値
初回送信までの遅延の最大値をミリ秒で指定できます。
0x05
:アプリケーション再送の間隔
アプリケーション再送を有効化した際の再送間隔をミリ秒で指定します。
0x06
:平行要求の許可
平行要求を許可します。
平行要求を許可すると、要求を完了するまでブロックせず、次の要求処理を受け付けることができるようになります。
例えば 0.5 秒の遅延を設定した要求を3回連続して入力した場合、初期状態では 0.5 秒後、1.0秒後、1.5秒後と順番に処理します。ところが、平行要求を許可した場合は、0.5秒後に順不同で送信要求を処理します。なおパケット分割を必要とする場合は使用できません。
受信側の端末は、常に新しいデータを採用します。平行要求を許可していると、新しいデータのあとに古いデータが届き、古いデータが無視されてしまうことがあります。
0x07
:応答メッセージの無効化
送信側へデータを入力した際に出力される応答メッセージを無効とします。
0x08
:送信後スリープ
送信後、速やかに本体をスリープさせます。
RX
が立ち上がりエッジを検知すると、スリープから復帰します。何か1バイトのデータを入力してください。
スリープ復帰後、UART の初期化が終わると入力を受け付けます。
受信側の出力
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信元の論理デバイスID | 親機0x00 ,子機0x01 -0x64 ,未設定子機0x78 |
1 | uint8 | コマンド番号 | 0xA0 のみ |
2 | uint8 | 応答ID | 送信側で指定した値 |
3 | uint32 | 送信元の拡張アドレス | シリアルIDの先頭へ0x8 を加えた値 |
7 | uint32 | 送信先の拡張アドレス | 論理デバイスID使用時は0xFFFFFFFF |
11 | uint8 | LQI | 受信時の電波通信品質 |
12 | uint16 | 続くバイト列の長さ | バイト数\(M\)を表す |
14 | [uint8] | 任意のデータ | 長さ\(M\)のバイト列 |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
送信側の出力(応答メッセージ)
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信元の論理デバイスID | 0xDB のみ:自身を示す |
1 | uint8 | コマンド番号 | 0xA1 のみ |
2 | uint8 | 応答ID | 入力時に指定した値 |
3 | uint8 | 処理結果 | 成功1 ,失敗0 |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
使用例
親機から子機に対してバイト列 0x11 0x22 0x33 0xAA 0xBB 0xCC
を送信する例を示します。
論理デバイスIDを指定する例
親機から論理デバイスID0x42
の子機へ送信する例を示します。
- 応答IDは
0x01
- オプションなし
- 親機の拡張アドレスは
0x81000000
(シリアルID0x1000000
)
【送信側:親機】
:42A001FF112233AABBCC87<CR><LF> <- 入力
:DBA1010182<CR><LF> <- 出力
末尾の0x87
はチェックサム:0x42
から0xCC
までの合計の2の補数のLSBから8ビット。
【受信側:子機】
:00A00181000000FFFFFFFFC80006112233AABBCC7D<CR><LF> <- 出力
末尾の0x7D
はチェックサム:最初の0x00
から0xCC
までの合計の2の補数のLSBから8ビット。
拡張アドレスを指定する例
親機から拡張アドレス0x81000001
(シリアルID0x1000001
)の子機へ送信する例を示します。
- 応答IDは
0x01
- オプションなし
- 親機の拡張アドレスは
0x81000000
(シリアルID0x1000000
)
【送信側:親機】
:80A00181000001FF112233AABBCCC7<CR><LF> <- 入力
:DBA1010182<CR><LF> <- 出力
末尾の0xC7
はチェックサム:0x80
から0xCC
までの合計の2の補数のLSBから8ビット。
【受信側:子機】
:00A0018100000081000001C80006112233AABBCCF7<CR><LF> <- 出力
末尾の0xF7
はチェックサム:最初の0x00
から0xCC
までの合計の2の補数のLSBから8ビット。
MAC ACKを使用する例
親機から論理デバイスID0x42
の子機へ MAC ACK を使用して送信する例を示します。
【送信側:親機】
:42A00101FF112233AABBCC86<CR><LF> <- 入力
:DBA1010182<CR><LF> <- 出力
末尾の0x86
はチェックサム:0x42
から0xCC
までの合計の2の補数のLSBから8ビット。
【受信側:子機】
:00A00181000000FFFFFFFFC80006112233AABBCC7D<CR><LF> <- 出力
末尾の0x7D
はチェックサム:0x00
から0xCC
までの合計の2の補数のLSBから8ビット。
遅延を設ける例
親機から論理デバイスID0x42
の子機へ 768ms の遅延を設けて送信する例を示します。
【送信側:親機】
:42A001030300FF112233AABBCC81<CR><LF> <- 入力
:DBA1010182<CR><LF> <- 出力
末尾の0x81
はチェックサム:0x42
から0xCC
までの合計の2の補数のLSBから8ビット。
【受信側:子機】
:00A00181000000FFFFFFFFC80006112233AABBCC7D<CR><LF> <- 出力
末尾の0x7D
はチェックサム:0x00
から0xCC
までの合計の2の補数のLSBから8ビット。
0xDB
コマンド
インタラクティブモードの設定を行う代わりに、UART から 0xDB
コマンドを入力することでモジュールの操作や設定を行うことができます。
1.1 - シリアル通信アプリ 書式モード(アスキー)の 0xDB コマンド
書式モード(アスキー)におけるインタラクティブモードを使用しない設定機能
書式モードでは、インタラクティブモードの代わりに0xDB
コマンドを使うことで、UART接続されたデバイスから動的に設定を行えます。
入力の書式
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信先の論理デバイスID | 自身を示す0xDB のみ |
1 | uint8 | コマンド番号 | 後述の値から選択 |
2 | [uint8] | パラメータ | 設定値を示す長さ\(N\)のバイト列(オプション) |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
コマンド番号の一覧
0xF0
:ACKの有効化
ACK 応答の要求を行います。
パラメータはありません。
応答の書式
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF0 のみ |
2 | uint8 | データ | 0x01 のみ |
| uint8 | チェックサム | 0x34 :LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
0xF1
:端末情報の取得
アドレス等の情報を表示します。起動時にも出力されます。
パラメータはありません。
応答の書式
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF1 のみ |
2 | uint32 | アプリケーションID | |
6 | uint32 | バージョン番号 | 1.4.7 なら00010407 |
10 | uint8 | 論理デバイスID | |
11 | uint32 | シリアルID | |
15 | uint8 | サイレントモードの状態 | 有効1 , 無効0 |
16 | uint8 | ネットワークの状態 | UP1 , DOWN0 |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
0xF2
:端末設定の適用
設定を適用します。
適用するパラメータは、
下記に記載の識別子とデータの組み合わせで構成します。
応答の書式
成功した場合
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF3 のみ |
2 | [uint8] | 設定内容 | 長さ\(N\)の識別子とデータの繰り返し |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
失敗した場合
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF3 のみ |
2 | uint8 | エラー | 0xFF のみ |
| uint8 | チェックサム | 0x33 :LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
0xF3
:端末設定の取得
設定を取得します。
取得するパラメータは、
下記に記載の識別子で構成します。
応答の書式
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF3 のみ |
2 | [uint8] | 設定内容 | 識別子とデータの繰り返し |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
0xF8
:端末の制御
起動時にサイレントモードを有効としていた場合に、これを解除します。
応答の書式
# | データ | 内容 | 備考 |
---|
| char | ヘッダ | : のみ |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF8 のみ |
2 | uint8 | データ | 0x11 のみ |
3 | uint8 | 状態 | 解除済み1 , 未解除0 |
| uint8 | チェックサム | LRC8 |
| char | フッタ | CR (0x0D /'\r' ) |
| char | フッタ | LF (0x0A /'\n' ) |
0xFD
:端末設定の消去
設定を初期化し、本体をリセットします。
パラメータおよび応答はありません。
0xFE
:端末設定の保存
適用した設定を保存し、本体をリセットします。
パラメータおよび応答はありません。
0xFF
:端末のリセット
適用した設定を破棄し、本体をリセットします。
パラメータおよび応答はありません。
パラメータの一覧(0xF2
/0xF3
)
0xF2
:端末設定の適用 および 0xF3
:端末設定の取得 のパラメータは、識別子とデータ(ビッグエンディアン)の繰り返しで表現します。
0x00
:アプリケーションID
アプリケーションIDを指定します。
0x01
:周波数チャネルマスク
周波数チャネルのビットマスクを指定します。
使用するチャネルのビットを立てます。例えば、11チャネルを使う場合は1<<11
です。
0x02
:再送回数と出力
電波の送信出力と、透過モードおよびヘッダ付き透過モードにおいてパケットを追加で送信する回数を指定します。
下位の1バイトのみを使用します。そのうち上位の4ビットが再送回数(0
-9
)、下位の4ビットが送信出力(0
-3
)です。例えば、8回再送/出力3 であれば 0x0083
です。
0x03
:論理デバイスID
論理デバイスIDを指定します。
0x04
:役割
子機のみ有効です。以下の値を指定します。通常はネットワーク層を利用しない配送方式を選択してください。
ネットワーク層を利用しない配送方式
0
:通常の指定(親機または子機)1
-3
:中継子機(論理デバイスIDを1
-100
または 120
とします)1
-3
の数値は最大中継段数を指します。最大中継段数まで再送を繰り返す方式のため、中継機の配置や数によっては重複したパケットを中継します。
ネットワーク層を利用する配送方式
サイレントモードを有効化するには、上記の数値に80
を足してください。例えば 93
は「ネットワーク層利用かつサイレントモード」です。
0x05
:中継レイヤ
中継レイヤの番号です。中継機は中継レイヤ数の上位(より小さい値)の中継機・親機への接続を試みます。役割を12
としているときにだけ有効です。
0x06
:通信モード
0
:透過モード1
:書式モード(アスキー)2
:書式モード(バイナリ)3
:チャットモード4
:ヘッダ付き透過モード
0x07
:ボーレート
UART ボーレートを指定します。
0x08
:パリティ
以下の設定の組み合わせにおいて、設定値の総和を指定します。
例えば、7-E-1 なら 8+2+0=10(0xA)
を指定します。
0x09
:暗号化機能
暗号化機能の有無を指定します。
0x0A
:暗号化キー
16バイトの暗号化キーを指定します。
インタラクティブモードでは設定できないバイナリ列を格納できます。この場合、インタラクティブモードの表示が崩れる場合があります。
0x0C
:区切り文字
区切り文字列の指定を行います(0x00
-0xFF
)。
サイレントモード
サイレントモードでは、起動後に受信回路を動作させず、解除するまでパケットを受信しません。起動後に外部へ接続したマイコンから0xDB
コマンドによる設定を完了してから受信を始める際に利用します。
設定方法
インタラクティブモードで以下の設定を行います。
r: Role
に 80
を足しておく。例えば、通常の親機や子機なら80
とする。m: UART mode
を書式モード(A
/B
)としておく。
動作確認
起動直後に出力される DB F1 応答の内容を確認します。
解除方法
DB F8 要求を行います(アスキー形式::DBF8101D<CR><LF>
)。
注意点
- サイレントモードの再設定はできません。
- サイレントモードが有効のときに送信コマンドを入力した場合の動作は未定義です。
2 - シリアル通信アプリの書式モード(バイナリ形式)
送受信双方の出力にヘッダを付加するモード(バイナリ形式)
書式モードは、送受信双方の出力にヘッダを付加します。バイナリ形式では、データをそのまま表現します。
概要
送信側の端末へ特定の書式に従ったデータを入力すると、受信側の端末も特定の書式に従ったデータを出力します。
16進数で表すデータは、バイナリデータのまま表現します。
送信側の入力 | | 受信側の出力 |
---|
簡易形式/拡張形式のデータ | → | 簡易形式/拡張形式のデータ |
- TWELITE UART では、
SET
ピンを GND
へ接続して起動すると書式モード(アスキー)が有効となります。 - TWELITE / TWELITE DIP では、
EX1
ピンを GND
へ接続して起動すると書式モード(バイナリ)が有効となります。
扱うことのできる書式の形式は2種類あります。
- 簡易形式:論理デバイスIDだけを使用。超簡単!標準アプリのUART伝送機能と互換性あり
- 拡張形式:論理デバイスIDに加えて、シリアルIDや再送回数などの送信オプションを使用できる
例えば、5バイトのバイナリデータ 0x48 0x45 0x4C 0x4C 0x4F
は、簡易形式を使って次のように送信できます。
以降、バイナリデータ表現の 0x
を省略します。
例えば、0x48 0x45 0x4C 0x4C 0x4F
は 48 45 4C 4C 4F
と表します。
【送信側】
A5 5A 80 07 00 01 48 45 4C 4C 4F 43 04 <- 入力
A5 5A 80 04 DB A1 80 01 FB 04 <- 出力
【受信側】
A5 5A 80 07 78 01 48 45 4C 4C 4F 3B 04 <- 出力
基本の書式
基本形式や拡張形式で表現したデータ列を送信するときは、バイナリデータのまま扱います。
ヘッダ | 長さ | ペイロード | チェックサム | フッタ |
---|
A5 5A | ペイロード長 | 00 -FF の繰り返し | ペイロードのXOR | EOT |
- すべてバイナリ
- 先頭は
A5 5A
の2バイト - ペイロード長はバイト数を2バイトで表現、
0x8000
とORをとる - チェックサムはペイロードのXOR
- 末端は EOT を表す
0x04
(入力時は省略可) - ビッグエンディアン
例えば、バイナリデータ 00 11 22 33 AA BB CC
は次のように表現します。
A5 5A 80 07 00 11 22 33 AA BB CC DD 04
デバッグが面倒ですが、マイコン間の通信では高い効率を誇ります。
親機と子機の区別
書式モードは、親機と子機を区別します。
親子間では、アプリケーションIDと周波数チャネルを合わせる必要があります。
送信元の判別
書式モードでは、受信したデータから送信元を判別できます。
簡易形式の書式では論理デバイスIDを、拡張形式の書式では論理デバイスIDに加えて拡張アドレスを利用します。
拡張アドレスは、TWELITE 本体に記載された7ビットのシリアルIDの先頭へ0x8
を付加したものです。
簡易形式の書式
書式モードの簡易形式を利用する場合は、次の書式に従います。
送信側の入力
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | \(N\)+2 |
0 | uint8 | 送信先の論理デバイスID | 親機0x00 ,子機0x01 -0x64 ,全子機0x78 |
1 | uint8 | コマンド番号 | 0x80 未満の任意の値 |
2 | [uint8] | 任意のデータ | 長さ\(N\)のバイト列(\(N\leqq80\)を推奨) |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
受信側の出力
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | \(N\)+2 |
0 | uint8 | 送信元の論理デバイスID | 親機0x00 ,子機0x01 -0x64 ,未設定子機0x78 |
1 | uint8 | コマンド番号 | 送信側で指定した0x80 未満の値 |
2 | [uint8] | 任意のデータ | 長さ\(N\)のバイト列 |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
送信側の出力(応答メッセージ)
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | 4 |
0 | uint8 | 送信元の論理デバイスID | 0xDB のみ:自身を示す |
1 | uint8 | コマンド番号 | 0xA1 のみ |
2 | uint8 | 応答ID | 128 -255 (0x80 -0xFF )の範囲で続き番号を示す |
3 | uint8 | 処理結果 | 成功1 ,失敗0 |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
使用例
親機から全子機に対してバイト列 11 22 33 AA BB CC
を送信する例を示します。
【送信側:親機】
A5 5A 80 08 78 01 11 22 33 AA BB CC A4 04 <- 入力
A5 5A 80 04 DB A1 80 01 FB 04 <- 出力
末尾の0xA4
はチェックサム:0x78
から0xCC
までのXOR。
【受信側:全子機】
A5 5A 80 08 00 01 11 22 33 AA BB CC DC 04 <- 出力
末尾の0xDC
はチェックサム:0x00
から0xCC
までのXOR。
拡張形式の書式
書式モードの拡張形式を利用する場合は、次の書式に従います。
送信側の入力
送信先の指定に論理デバイスIDを使用する場合
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | \(N\)+\(M\)+3 |
0 | uint8 | 送信先の論理デバイスID | 親機0x00 ,子機0x01 -0x64 ,全子機0x78 |
1 | uint8 | コマンド番号 | 0xA0 のみ |
2 | uint8 | 応答ID | 任意の値 |
3 | [uint8] | オプション | 長さ\(N\)のオプション列 |
3+\(N\) | [uint8] | 任意のデータ | 長さ\(M\)のバイト列(\(M\leqq80\)を推奨) |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
送信先の指定に拡張アドレスを使用する場合
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | \(N\)+\(M\)+7 |
0 | uint8 | 拡張アドレスの指定 | 0x80 のみ |
1 | uint8 | コマンド番号 | 0xA0 のみ |
2 | uint8 | 応答ID | 任意の値 |
3 | uint32 | 送信先の拡張アドレス | シリアルIDの先頭へ0x8 を加えた値 |
7 | [uint8] | オプション | 長さ\(N\)のオプション列 |
7+\(N\) | [uint8] | 任意のデータ | 長さ\(M\)のバイト列(\(M\leqq80\)を推奨) |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
オプション列の詳細
拡張形式では、オプション列を指定することで細かな設定を行うことができます。
オプション列は、オプションのIDと引数の繰り返しで表現します。終端は 0xFF
とします。
オプションを指定しない場合は0xFF
の1バイトだけを指定します。
入力後1秒が経過すると、送信処理はタイムアウトします。また、内部のバッファが処理待ちで埋まってしまい、新しい要求を受け付けることができない場合があります。アプリケーション再送や遅延を設定する場合は、極端な値に設定しないように注意してください。
0x01
:MAC ACKの有効化
MAC層のACK(確認応答)を有効化します。
頻繁にデータを送信する場合には適しませんが、信頼性を向上できる場合があります。
中継機は利用できません。また、送信先を全子機(0x78
)とするときは利用できません。
0x02
:アプリケーション再送の有効化
MAC ACK を使用するときは、0x00
-0x0F
を指定します。送信に成功するまで、それぞれ0-16回の再送を行います。
MAC ACK を使用しないときは、0x81
-0x8F
を指定します。必ず1-16回の再送を行います。
応答メッセージは、すべての再送が終了してから出力します。
0x03
:初回送信の遅延の最小値
初回送信までの遅延の最小値をミリ秒で指定できます。
0x04
:初回送信の遅延の最大値
初回送信までの遅延の最大値をミリ秒で指定できます。
0x05
:アプリケーション再送の間隔
アプリケーション再送を有効化した際の再送間隔をミリ秒で指定します。
0x06
:平行要求の許可
平行要求を許可します。
平行要求を許可すると、要求を完了するまでブロックせず、次の要求処理を受け付けることができるようになります。
例えば 0.5 秒の遅延を設定した要求を3回連続して入力した場合、初期状態では 0.5 秒後、1.0秒後、1.5秒後と順番に処理します。ところが、平行要求を許可した場合は、0.5秒後に順不同で送信要求を処理します。なおパケット分割を必要とする場合は使用できません。
受信側の端末は、常に新しいデータを採用します。平行要求を許可していると、新しいデータのあとに古いデータが届き、古いデータが無視されてしまうことがあります。
0x07
:応答メッセージの無効化
送信側へデータを入力した際に出力される応答メッセージを無効とします。
0x08
:送信後スリープ
送信後、速やかに本体をスリープさせます。
RX
が立ち上がりエッジを検知すると、スリープから復帰します。何か1バイトのデータを入力してください。
スリープ復帰後、UART の初期化が終わると入力を受け付けます。
受信側の出力
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | \(M\)+14 |
0 | uint8 | 送信元の論理デバイスID | 親機0x00 ,子機0x01 -0x64 ,未設定子機0x78 |
1 | uint8 | コマンド番号 | 0xA0 のみ |
2 | uint8 | 応答ID | 送信側で指定した値 |
3 | uint32 | 送信元の拡張アドレス | シリアルIDの先頭へ0x8 を加えた値 |
7 | uint32 | 送信先の拡張アドレス | 論理デバイスID使用時は0xFFFFFFFF |
11 | uint8 | LQI | 受信時の電波通信品質 |
12 | uint16 | 続くバイト列の長さ | バイト数\(M\)を表す |
14 | [uint8] | 任意のデータ | 長さ\(M\)のバイト列 |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
送信側の出力(応答メッセージ)
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | 4 |
0 | uint8 | 送信元の論理デバイスID | 0xDB のみ:自身を示す |
1 | uint8 | コマンド番号 | 0xA1 のみ |
2 | uint8 | 応答ID | 入力時に指定した値 |
3 | uint8 | 処理結果 | 成功1 ,失敗0 |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
使用例
親機から子機に対してバイト列 11 22 33 AA BB CC
を送信する例を示します。
論理デバイスIDを指定する例
親機から論理デバイスID0x01
の子機へ送信する例を示します。
【送信側:親機】
A5 5A 80 0A 01 A0 01 FF 11 22 33 AA BB CC 82 04 <- 入力
A5 5A 80 04 DB A1 01 01 7A 04 <- 出力
末尾の0xC1
はチェックサム:0x42
から0xCC
までのXOR。
【受信側:子機】
A5 5A 80 14 00 A0 01 82 03 68 41 FF FF FF FF FF 00 06 11 22 33 AA BB CC 2D 04 <- 出力
末尾の0x2D
はチェックサム:0x00
から0xCC
までのXOR。
拡張アドレスを指定する例
親機から拡張アドレス0x820163B2
(シリアルID0x20163B2
)の子機へ送信する例を示します。
【送信側:親機】
A5 5A 80 0E 80 A0 01 82 01 63 B2 FF 11 22 33 AA BB CC 51 04 <- 入力
A5 5A 80 04 DB A1 01 01 7A 04 <- 出力
末尾の0x51
はチェックサム:0x80
から0xCC
までのXOR。
【受信側:子機】
A5 5A 80 14 00 A0 01 82 03 68 41 82 01 63 B2 FF 00 06 11 22 33 AA BB CC 7F 04 <- 出力
末尾の0x7F
はチェックサム:0x00
から0xCC
までのXOR。
MAC ACKを使用する例
親機から論理デバイスID0x01
の子機へ MAC ACK を使用して送信する例を示します。
【送信側:親機】
A5 5A 80 0B 01 A0 01 01 FF 11 22 33 AA BB CC 83 04 <- 入力
A5 5A 80 04 DB A1 01 01 7A 04 <- 出力
末尾の0x83
はチェックサム:0x01
から0xCC
までのXOR。
【受信側:子機】
A5 5A 80 14 00 A0 01 82 03 68 41 00 00 01 01 FF 00 06 11 22 33 AA BB CC 2D 04 <- 出力
末尾の0x2D
はチェックサム:0x00
から0xCC
までのXOR。
遅延を設ける例
親機から論理デバイスID0x01
の子機へ 768ms の遅延を設けて送信する例を示します。
【送信側:親機】
A5 5A 80 0D 01 A0 01 03 03 00 FF 11 22 33 AA BB CC 82 04 <- 入力
A5 5A 80 04 DB A1 01 01 7A 04 <- 出力
末尾の0x82
はチェックサム:0x01
から0xCC
までのXOR。
【受信側:子機】
A5 5A 80 14 00 A0 01 82 03 68 41 FF FF FF FF FF 00 06 11 22 33 AA BB CC 2D 04 <- 出力
末尾の0x2D
はチェックサム:0x00
から0xCC
までのXOR。
0xDB
コマンド
インタラクティブモードの設定を行う代わりに、UART から 0xDB
コマンドを入力することでモジュールの操作や設定を行うことができます。
2.1 - シリアル通信アプリ 書式モード(バイナリ)の 0xDB コマンド
書式モード(バイナリ)におけるインタラクティブモードを使用しない設定機能
書式モードでは、インタラクティブモードの代わりに0xDB
コマンドを使うことで、UART接続されたデバイスから動的に設定を行えます。
入力の書式
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | \(N\)+2 |
0 | uint8 | 送信先の論理デバイスID | 自身を示す0xDB のみ |
1 | uint8 | コマンド番号 | 後述の値から選択 |
2 | [uint8] | パラメータ | 設定値を示す長さ\(N\)のバイト列(オプション) |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
コマンド番号の一覧
0xF0
:ACKの有効化
ACK 応答の要求を行います。
パラメータはありません。
応答の書式
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | 3 |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF0 のみ |
2 | uint8 | データ | 0x01 のみ |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
0xF1
:端末情報の取得
アドレス等の情報を表示します。起動時にも出力されます。
パラメータはありません。
応答の書式
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | 17 |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF1 のみ |
2 | uint32 | アプリケーションID | |
6 | uint32 | バージョン番号 | 1.4.7 なら00010407 |
10 | uint8 | 論理デバイスID | |
11 | uint32 | シリアルID | |
15 | uint8 | サイレントモードの状態 | 有効1 , 無効0 |
16 | uint8 | ネットワークの状態 | UP1 , DOWN0 |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
0xF2
:端末設定の適用
設定を適用します。
適用するパラメータは、
下記に記載の識別子とデータの組み合わせで構成します。
応答の書式
成功した場合
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | \(N\)+2 |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF3 のみ |
2 | [uint8] | 設定内容 | 長さ\(N\)の識別子とデータの繰り返し |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
失敗した場合
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | 3 |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF3 のみ |
2 | uint8 | エラー | 0xFF のみ |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
0xF3
:端末設定の取得
設定を取得します。
取得するパラメータは、
下記に記載の識別子で構成します。
応答の書式
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | \(N\)+2 |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF3 のみ |
2 | [uint8] | 設定内容 | 長さ\(N\)の識別子とデータの繰り返し |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
0xF8
:端末の制御
起動時にサイレントモードを有効としていた場合に、これを解除します。
応答の書式
# | データ | 内容 | 備考 |
---|
| uint8 | ヘッダ | 0xA5 のみ |
| uint8 | ヘッダ | 0x5A のみ |
| uint16 | データ長 | 4 |
0 | uint8 | 送信先の論理デバイスID | 0xDB のみ |
1 | uint8 | コマンド番号 | 0xF8 のみ |
2 | uint8 | データ | 0x11 のみ |
3 | uint8 | 状態 | 解除済み1 , 未解除0 |
| uint8 | チェックサム | XOR |
| uint8 | フッタ | EOT (0x04 ) |
0xFD
:端末設定の消去
設定を初期化し、本体をリセットします。
パラメータおよび応答はありません。
0xFE
:端末設定の保存
適用した設定を保存し、本体をリセットします。
パラメータおよび応答はありません。
0xFF
:端末のリセット
適用した設定を破棄し、本体をリセットします。
パラメータおよび応答はありません。
パラメータの一覧(0xF2
/0xF3
)
0xF2
:端末設定の適用 および 0xF3
:端末設定の取得 のパラメータは、識別子とデータ(ビッグエンディアン)の繰り返しで表現します。
0x00
:アプリケーションID
アプリケーションIDを指定します。
0x01
:周波数チャネルマスク
周波数チャネルのビットマスクを指定します。
使用するチャネルのビットを立てます。例えば、11チャネルを使う場合は1<<11
です。
0x02
:再送回数と出力
電波の送信出力と、透過モードおよびヘッダ付き透過モードにおいてパケットを追加で送信する回数を指定します。
下位の1バイトのみを使用します。そのうち上位の4ビットが再送回数(0
-9
)、下位の4ビットが送信出力(0
-3
)です。例えば、8回再送/出力3 であれば 0x0083
です。
0x03
:論理デバイスID
論理デバイスIDを指定します。
0x04
:役割
子機のみ有効です。以下の値を指定します。通常はネットワーク層を利用しない配送方式を選択してください。
ネットワーク層を利用しない配送方式
0
:通常の指定(親機または子機)1
-3
:中継子機(論理デバイスIDを1
-100
または 120
とします)1
-3
の数値は最大中継段数を指します。最大中継段数まで再送を繰り返す方式のため、中継機の配置や数によっては重複したパケットを中継します。
ネットワーク層を利用する配送方式
サイレントモードを有効化するには、上記の数値に80
を足してください。例えば 93
は「ネットワーク層利用かつサイレントモード」です。
0x05
:中継レイヤ
中継レイヤの番号です。中継機は中継レイヤ数の上位(より小さい値)の中継機・親機への接続を試みます。役割を12
としているときにだけ有効です。
0x06
:通信モード
0
:透過モード1
:書式モード(バイナリ)2
:書式モード(バイナリ)3
:チャットモード4
:ヘッダ付き透過モード
0x07
:ボーレート
UART ボーレートを指定します。
0x08
:パリティ
以下の設定の組み合わせにおいて、設定値の総和を指定します。
例えば、7-E-1 なら 8+2+0=10(0xA)
を指定します。
0x09
:暗号化機能
暗号化機能の有無を指定します。
0x0A
:暗号化キー
16バイトの暗号化キーを指定します。
インタラクティブモードでは設定できないバイナリ列を格納できます。この場合、インタラクティブモードの表示が崩れる場合があります。
0x0C
:区切り文字
区切り文字列の指定を行います(0x00
-0xFF
)。
サイレントモード
サイレントモードでは、起動後に受信回路を動作させず、解除するまでパケットを受信しません。起動後に外部へ接続したマイコンから0xDB
コマンドによる設定を完了してから受信を始める際に利用します。
設定方法
インタラクティブモードで以下の設定を行います。
r: Role
に 80
を足しておく。例えば、通常の親機や子機なら80
とする。m: UART mode
を書式モード(A
/B
)としておく。
動作確認
起動直後に出力される DB F1 応答の内容を確認します。
解除方法
DB F8 要求を行います(バイナリ形式:A5 5A 80 03 DB F8 10 33 04
)。
注意点
- サイレントモードの再設定はできません。
- サイレントモードが有効のときに送信コマンドを入力した場合の動作は未定義です。
3 - シリアル通信アプリのチャットモード
プロンプト表示とエコーバックを行うモード
チャットモードは、プロンプト表示とエコーバックによりテキストチャットを実現します。
MONOSTICK を PC 等へ接続することで、複数の端末同士のチャットを行うことができます。
概要
テキストチャットを実現します。
送信側の入力 | | 受信側の出力 |
---|
任意の文字列 | → | 任意の文字列+補助情報 |
プロンプトの表示とエコーバック(入力した文字の出力)を行います。すべての端末は子機として、同報通信を行います。
例えば、ある端末から他の端末へ Hello
という文字列を送信する場合は、次のように振る舞います。
【送信側】
810A4778:0> Hello <- 入力
810A4778:1> <- 出力
【受信側】
[810A4778:0] Hello <- 出力
82018CA0:0> <- 出力
チャットモードは、プロンプトの表示とエコーバック(自身へ入力された文字の出力)を行います。
全ての端末は子機としたうえで、送信内容はブロードキャストします。すべての端末と通信できますが宛て先は指定できません。またバイナリデータは送れません。文字列のみ対応しています(0x00
-0x1F
, 0x7F
は送信不可)。
中継は3段(3ホップ)まで対応しています。初期設定では中継しません。
親機と子機の区別
チャットモードは、親機と子機を区別しません。
アプリケーションIDと周波数チャネルが同一であれば、どの端末へ入力したデータもほかの端末へと送信されます。
送信元の判別
受信側に出力される補助情報の識別情報から送信元を判別できます。
インタラクティブモードのh: Header format
を空欄としたときは、7桁のシリアルIDの先頭へ0x8
を付与した拡張アドレスを使用します。例えば、以下の出力では送信元のシリアルIDが0x10A4778
であったと分かります。
インタラクティブモードのh: Header format
へ任意の文字列を設定したときは、それをハンドル名として利用します。ただし、ハンドル名は無線パケットに格納するデータを消費します。
送信側の入力書式
プロンプトに続けて、メッセージと改行文字を入力します。
データ | 内容 | 備考 |
---|
[char] | メッセージ | 0x00 -0x1F , 0x7F は不可 |
char | CR (0x0D /'\r' ) | 単体でも可 |
char | LF (0x0A /'\n' ) | 単体でも可 |
受信側の出力書式
補助情報に続けて、受信したメッセージを出力します。
補助情報は、モジュールの拡張アドレスまたはハンドル名と、続き番号を含みます。
データ | 内容 | 備考 |
---|
char | 補助情報のヘッダ | [ のみ |
[char] | 識別情報 | 8桁の拡張アドレスまたはハンドル名 |
char | 補助情報の区切り文字 | : のみ |
[char] | 続き番号 | 0 から開始 |
char | 補助情報のフッタ | ] のみ |
char | 区切り文字 | 半角スペースのみ |
[char] | メッセージ | |
char | フッタ | CR (0x0D /'\r' ) |
char | フッタ | LF (0x0A /'\n' ) |
エラー等の場合は、(err)
(canceled)
といった ()
書きのメッセージを出力します。
その他の入力
エスケープシーケンスに対応したターミナルでは、以下の制御コマンドを使用できます。
Ctrl-L
:画面のクリアCtrl-C
:入力のキャンセルBS
/DEL
:カーソルを戻す
4 - シリアル通信アプリの透過モード
純粋にUARTを無線化するモード
透過モードは、ヘッダの付加やエコーバック、プロンプト表示を行わず、有線接続された UART と同じような振る舞いを実現します。
外部マイコン同士を簡単に接続できますが、書式を用いて通信を最適化するには書式モード(アスキー/バイナリ)が適しています。
概要
純粋にUARTを無線化します。
送信側の入力 | | 受信側の出力 |
---|
任意のデータ | → | 任意のデータ |
書式を必要としないため、既存の UART 通信を簡単に無線化できます。
一方で、データの区切りがあいまいになってしまうほか、受信側の出力から送信元を判別できないといった欠点があります。
初期状態では、送信トリガ文字にCRLFを指定しています。したがって、送信側へ入力されたデータをCRLFで区切り、CRLF よりも前のデータを送信します。
例えば、送信側の端末へ Hello<Enter>
と入力すると、受信側の端末はそのまま Hello
を出力します。
【送信側】
【受信側】
連続して入力された文字列を80バイトごとに分割して送信します。トリガ文字までのデータは通常80バイト以下としてください。
全ての端末は子機としたうえで、送信内容はブロードキャストします。すべての端末と通信できますが宛て先は指定できません。アスキー文字だけでなく、バイナリデータも送信できます。
中継は3段(3ホップ)まで対応しています。初期設定では中継しません。
親機と子機の区別
透過モードは、親機と子機を区別しません。
アプリケーションIDと周波数チャネルが同一であれば、どの端末へ入力したデータもほかの端末へと送信されます。
送信元の判別
透過モードでは、送信元を判別できません。
送信元を判別するには、送信側へ入力するデータそのものに送信元の情報を含める必要があります。
送信トリガ
送信側の入力に書式はありませんが、データはある時点で分割されたのち、パケットごとに無線で送信されます。
したがって、次に挙げる送信トリガを意識しなくてはなりません。
- データ入力後のタイムアウトを迎えたとき
- 入力データが最小データサイズを満たしたとき
- 送信トリガ文字を受け取ったとき
送信トリガの優先順位
タイムアウトを迎えたときは、強制的に送信します。また、最小データサイズを設定している場合は、そのサイズを満たしていないと送信トリガ文字は無効となります。
送信トリガの設定は、インタラクティブモードのk
:送信トリガ項目から指定します。
設定例
送信トリガ文字をLF、最小データサイズを8バイト、タイムアウトを30msとする場合は次のように設定します。
m: set UART mode (D)
k: set Tx Trigger (sep=0x0a, min_bytes=8 dly=30[ms])
o: set option bits (0x00000100)
5 - シリアル通信アプリのヘッダ付き透過モード
受信側の出力にだけヘッダを付加するモード
ヘッダ付き透過モードは、受信側の出力にだけ補助情報を付加します。
概要
初期状態で有効となっています。
送信側の端末へ任意のデータを入力すると、受信側の端末は受信した内容に特定の書式で補助情報を付加したデータを出力します。
送信側の入力 | | 受信側の出力 |
---|
任意のデータ | → | 任意のデータ+補助情報 |
初期状態では、送信側へ入力されたデータをCRLFで区切り、CRLF よりも前のデータを送信します。
例えば、送信側の端末へ Hello<Enter>
と入力すると、受信側の端末は補助情報を含んだ書式で Hello
を出力します。送信側の端末も送信完了といったメッセージを伝える書式を出力します。
【送信側】
Hello <- 入力
;U;00004;219;0x820163B2;000;000;0,1,Hel...;6E; <- 出力
【受信側】
;U;00003;000;0x820163B2;255;000;Hello;42; <- 出力
受信側が出力する補助情報は、送信元のアドレスや受信時の電波強度、チェックサム等を含みます。補助情報の書式はカスタマイズできます。
親機と子機の区別
ヘッダ付き透過モードは、親機と子機を区別しません。
アプリケーションIDと周波数チャネルが同一であれば、どの端末へ入力したデータもほかの端末へと送信されます。
送信元の判別
ヘッダ付き透過モードで受信したデータからは、送信元を判別できます。
受信側が出力する補助情報を表すヘッダに含むことのできる論理デバイスIDやシリアルIDのデータを利用します。
宛先を指定することはできません。受信側へ接続されたデバイスが判別しなくてはなりません。
受信側の出力書式
出力書式はセミコロン(;
)区切りとして表現されます。
【初期状態における出力例】
;U;00777;120;0x81025A17;120;013;HELLO;79;
この出力例は、次のように解釈できます。
| データ | 内容 | 値 |
---|
U | char | 固定値 | U |
00777 | uint16 | 出力時のタイムスタンプ | 777 秒 |
120 | uint8 | 送信元の論理デバイスID | 120 IDなし子機 |
0x81025A17 | uint32 | 送信元の拡張アドレス | 81025A17 |
120 | uint8 | LQI(電波通信品質) | 120/255 |
013 | uint8 | 送信元の続き番号 | 13 |
HELLO | [uint8] | 入力データ | HELLO |
79 | uint8 | XORチェックサム | 0x79 |
送信元の論理デバイスIDは、自身の応答メッセージのとき219
となります。
拡張アドレスは、TWELITE 本体に記載された7ビットのシリアルIDの先頭へ0x8
を付加したものです。
ヘッダフォーマットによるカスタマイズ
受信側の出力書式は、ヘッダフォーマットに従います。
ヘッダフォーマットを変更することで、受信側が出力する補助情報の内容やチェックサムの計算範囲をカスタマイズできます。
初期状態では、ヘッダフォーマットを ;U;%t;%i;0x%A;%q;%s;<*;%X;\n
としています。
ヘッダフォーマットの変更は、インタラクティブモードの h: set header format
から行います。
最も簡単な書式
最も簡単な書式を表すヘッダフォーマットは *\n
です。受信したデータへ CRLF の改行文字を付与して出力します。
h: set header format [*\n]
この場合にHELLO
を送信すると、次のように振る舞います。
【受信側】
HELLO<CR><LF> または HELLO<LF>
【送信側】
フォーマットを構成する特殊文字
ヘッダフォーマットに次の特殊文字を含めることで、出力内容をカスタマイズできます。
全般
| 内容 |
---|
* | 受信したデータ |
&hl | 任意の文字(アスキー)(例:&20 は空白) |
< | チェックサム計算の開始位置(未設定で先頭から) |
> | チェックサム計算の終了位置(v1.4.6以降のみ) |
\
(バックスラッシュ・¥)に続くもの
| 内容 |
---|
\n | CRLF (0x0D 0x0A ) |
\t | TAB |
\* | * |
\% | % |
\< | < |
\> | > |
\& | & |
%
に続くもの
| 内容 | 長さ | データ |
---|
%A | 送信元アドレス(32bit) | 8桁 | 16進数 |
%a | 送信元アドレス(32bit) | 10桁 | 16進数 |
%I | 送信元論理アドレス(8bit) | 2桁 | 16進数 |
%i | 送信元論理アドレス(8bit) | 3桁 | 10進数 |
%T | 現在のシステム時間(秒) | 4桁 | 16進数 |
%t | 現在のシステム時間(秒) | 5桁 | 10進数 |
%S | 送信元が設定した続き番号 | 2桁 | 16進数 |
%s | 送信元が設定した続き番号 | 3桁 | 16進数 |
%Q | 受信時の電波強度 | 2桁 | 16進数 |
%q | 受信時の電波強度 | 3桁 | 10進数 |
%X | チェックサム | 2桁 | 16進数 |
%x | チェックサム | 3桁 | 10進数 |
チェックサムの計算
チェックサムはデータの先頭あるいはヘッダフォーマットの<
を指定した箇所から%X
,%x
の直前までを XOR(排他的論理和)にて計算します。
初期状態の例
初期状態ではヘッダフォーマットを ;U;%t;%i;0x%A;%q;%s;<*;%X;\n
としており、チェックサムの計算範囲は*;
です。
すなわち、HELLO
を送信した場合は HELLO;
のバイナリデータを対象とするため、チェックサムは0x79
です。
【Python による検証コード】
from functools import reduce
def main():
data = "HELLO;"
checksum = reduce(lambda x, y: x ^ y, data.encode("ascii"))
print(f"{data} -> {hex(checksum)}")
if __name__ == "__main__":
main() # HELLO; -> 0x79
その他の例
例えば、ヘッダフォーマットを ;%I;*;%X
とした場合を考えます。
<
を指定していないため、チェックサムの計算範囲は;%I;*;
です。
すなわち、HELLO
を送信した場合は ;000;HELLO;
のバイナリデータを対象とするため、チェックサムは 0x49
です。
【Python による検証コード】
from functools import reduce
def main():
data = ";000;HELLO;"
checksum = reduce(lambda x, y: x ^ y, data.encode("ascii"))
print(f"{data} -> {hex(checksum)}")
if __name__ == "__main__":
main() # ;000;HELLO; -> 0x49
送信トリガ
送信側の入力に書式はありませんが、データはある時点で分割されたのち、パケットごとに無線で送信されます。
したがって、次に挙げる送信トリガを意識しなくてはなりません。
- データ入力後のタイムアウトを迎えたとき
- 入力データが最小データサイズを満たしたとき
- 送信トリガ文字を受け取ったとき
送信トリガの優先順位
タイムアウトを迎えたときは、強制的に送信します。また、最小データサイズを設定している場合は、そのサイズを満たしていないと送信トリガ文字は無効となります。
送信トリガの設定は、インタラクティブモードのk
:送信トリガ項目から指定します。
設定例
送信トリガ文字をLF、最小データサイズを8バイト、タイムアウトを30msとする場合は次のように設定します。
m: set UART mode (E)
k: set Tx Trigger (sep=0x0a, min_bytes=8 dly=30[ms])
o: set option bits (0x00000100)