/

シリアル通信アプリのヘッダ付き透過モード

受信側の出力にだけヘッダを付加するモード
ヘッダ付き透過モードは、受信側の出力にだけ補助情報を付加します。

概要

初期状態で有効となっています。

送信側の端末へ任意のデータを入力すると、受信側の端末は受信した内容に特定の書式で補助情報を付加したデータを出力します。

送信側の入力受信側の出力
任意のデータ任意のデータ+補助情報

初期状態では、送信側へ入力されたデータを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;

この出力例は、次のように解釈できます。

データ内容
Uchar固定値U
00777uint16出力時のタイムスタンプ777
120uint8送信元の論理デバイスID120 IDなし子機
0x81025A17uint32送信元の拡張アドレス81025A17
120uint8LQI(電波通信品質)120/255
013uint8送信元の続き番号13
HELLO[uint8]入力データHELLO
79uint8XORチェックサム0x79

ヘッダフォーマットによるカスタマイズ

受信側の出力書式は、ヘッダフォーマットに従います。

ヘッダフォーマットを変更することで、受信側が出力する補助情報の内容やチェックサムの計算範囲をカスタマイズできます。

ヘッダフォーマットの変更は、インタラクティブモードの h: set header format から行います。

最も簡単な書式

最も簡単な書式を表すヘッダフォーマットは *\n です。受信したデータへ CRLF の改行文字を付与して出力します。

 h: set header format [*\n]

この場合にHELLOを送信すると、次のように振る舞います。

【受信側】

HELLO<CR><LF> または HELLO<LF>

【送信側】

HELLO<CR><LF>

フォーマットを構成する特殊文字

ヘッダフォーマットに次の特殊文字を含めることで、出力内容をカスタマイズできます。

全般
内容
*受信したデータ
&hl任意の文字(アスキー)(例:&20は空白)
<チェックサム計算の開始位置(未設定で先頭から)
>チェックサム計算の終了位置(v1.4.6以降のみ)
\(バックスラッシュ・¥)に続くもの
内容
\nCRLF (0x0D 0x0A)
\tTAB
\**
\%%
\<<
\>>
\&&
%に続くもの
内容長さデータ
%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)