# 書式モード(A, B)

![](https://1052664720-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Mj72hZr93McqHAb2Pg_%2F-Mk6Vj2eddSs625ZFSSD%2F-Mk6WBQa1naQ0ZQrtgSk%2Fuart-format.png?alt=media\&token=7eee2506-9add-4b2a-89c8-8296ab8ffae3)

## 特徴

書式モードはTWELITE-トワイライトのUART（シリアル通信ポート）に所定の書式により入力するモードです。以下の特徴があります。

* チェックサムによるエラーチェックを行う事で UART通信のデータ化けを検出する。
* マイコンからバイナリ形式で直接送受信する。

## 設定方法

書式モードは[インタラクティブモード](https://twelite.gitbook.io/mw-pug-uart/interactive-mode)にてUARTモード（m）をアスキー形式（A）またはバイナリ形式（B）に設定します。

### アスキー形式（A）

送信したいバイナリデータ列をアスキー文字列（0-9,A-F）に変換して無線モジュールに入力します。

Modbus ASCII 形式の書式に倣っています。（例： バイナリ系列 0x00 0x11 0x22 0x33 0xAA 0xBB 0xCC は ":00112233AABBCC69" という文字列で表現されます。）

{% content-ref url="mode\_ab/ascii-format" %}
[ascii-format](https://twelite.gitbook.io/mw-pug-uart/mode_selection/mode_ab/ascii-format)
{% endcontent-ref %}

### バイナリー形式（B）

送信したいバイナリデータ列にヘッダとチェックサムを付加し直接無線モジュールに入力します。

人手による検証は困難になりますが、マイコン間通信では最も効率が良い形式です。

{% content-ref url="mode\_ab/binary-format" %}
[binary-format](https://twelite.gitbook.io/mw-pug-uart/mode_selection/mode_ab/binary-format)
{% endcontent-ref %}

## 送信可能文字数

* 最大送信バイト数は６４０バイトですが、１パケットに収めて送受信する事を推奨します。\
  下記【書式】のAにあたる\[送受信したいデータ]
* １パケットに収めるためには８０バイト以下にしてください。

## 書式

書式モードは、送信コマンドを使用してデータを送信するモードです。このコマンドを送る際にデータ形式をアスキー形式とバイナリ形式の２種類から選択できます。送信コマンドとデータ形式の関係は以下の図の通りです。

本ページでは下図に示す**送信コマンド**について解説します。

```
A: [送受信したいデータ]
 ↓↑
B: [送信コマンド[A: ] ]
 ↓↑
C: 系列Bをアスキー形式またはバイナリ形式に変換
   [形式ヘッダ [B: [A: ] ] 終端]
 ↓↑
マイコンのUART入出力
```

送信コマンドには論理IDのみを使用した簡易形式と、32bitアドレス指定や様々な送信オプションを設定可能な拡張形式が有ります。それぞれの形式を以下で説明します。

## 送信コマンド （簡易形式）

### 入力

| データ形式 | バイト数 | 解説                                                                          |
| ----- | ---- | --------------------------------------------------------------------------- |
| バイト   | 1    | <p>送信先の論理ID。<br>0x00 ⇒ 親機宛<br>0x01 ～ 0x64(100) ⇒ 子機論理ID宛<br>0x78 ⇒ 全子機宛</p> |
| バイト   | 1    | <p>コマンド種別（0x80未満任意）<br>※ データ領域として利用可能だが、0x80以上を入力してはならない。</p>               |
| バイト列  | N    | 送受信したいバイト列。                                                                 |

### 出力

TWELITE-トワイライトから出力される形式は、入力時と同形式です。

| データ形式 | バイト数 | 解説                                                                                |
| ----- | ---- | --------------------------------------------------------------------------------- |
| バイト   | 1    | <p>送信元の論理ID。<br>0x00 ⇒ 親機<br>0x01 ～ 0x64(100) ⇒ 子機論理ID<br>0x78 ⇒ 子機。（論理ID未設定）</p> |
| バイト   | 1    | <p>コマンド種別（0x80未満任意）<br>※ 送信時に指定した値がそのまま入る。</p>                                    |
| バイト列  | N    | 送受信したいバイト列。                                                                       |

### 使用例

以下のコマンドを親機に入力した場合、全子機に対し 0x11 0x22 0x33 0xAA 0xBB 0xCC というバイト列を送信します。

```
  0x78 0x01 0x11 0x22 0x33 0xAA 0xBB 0xCC
```

受信側は、以下のように親機の論理ID (0x00)から以下の バイト列を得ます。

```
  0x00 0x01 0x11 0x22 0x33 0xAA 0xBB 0xCC
```

上記バイト列はTWELITEに直接入力するわけではあり ません。アスキー形式またはバイナリ形式で表現した上、 UARTの入出力を行います。

例えば上記の出力形式の場合、アスキー形式では以下のよう に表現されます。

```
:0001112233AABBCC68[CR][LF]
```

末尾の68はチェックサムです。

## 送信コマンド(拡張形式)

### 入力

| データ形式         | バイト数 | 解説                                                                                                              |
| ------------- | ---- | --------------------------------------------------------------------------------------------------------------- |
| バイト           | 1    | <p>送信先の論理ID。<br>0x00 ⇒ 親機宛<br>0x01 ～ 0x64(100) ⇒ 子機論理ID宛<br>0x78 ⇒ 全子機宛<br>0x80 ⇒ 拡張アドレス</p>                    |
| バイト           | 1    | 0xA0                                                                                                            |
| バイト           | 1    | <p>応答ID。<br>任意に指定できる。後述の応答メッセージ（送信完了などの通知）に使用され、送信コマンドとの対応を付けるために使用する。</p>                                      |
| ビッグエンディアン４バイト | 4    | 先頭バイトが拡張アドレス(0x80)指定の場合、アドレス指定を行います。拡張アドレス指定でない場合は、本領域は0バイトとなります。                                               |
| バイト列          | N    | <p>オプション列。<br>オプションは {オプションバイト} {オプション引数} が連続し、オプションバイトが 0xFF を指定する事で終端します。オプションを指定しない場合は 0xFF の１バイトを指定します。</p> |
| バイト列          | N    | 送受信したいバイト列。                                                                                                     |

### 出力

TWELITE-トワイライトから出力される形式は、宛先の論理IDの次に0xA0バイトが続きます。

| データ形式         | バイト数 | 解説                                                                                 |
| ------------- | ---- | ---------------------------------------------------------------------------------- |
| バイト           | 1    | <p>送信元の論理ID。<br>0x00 ⇒ 親機宛<br>0x01 ～ 0x64(100) ⇒ 子機論理ID宛<br>0x78 ⇒ 子機（論理ID未設定）</p> |
| バイト           | 1    | 0xA0                                                                               |
| バイト           | 1    | 送信元で指定した応答ID。                                                                      |
| ビッグエンディアン４バイト | 4    | 送信元拡張アドレス。                                                                         |
| ビッグエンディアン４バイト | 4    | <p>送信先拡張アドレス。<br>１バイトの論理IDの指定で送信された場合 0xFFFFFFFF が格納される。</p>                       |
| バイト           | 1    | <p>通信品質 LQI 値。<br>0..255 の値を取り、受信時の電波強度に対応する。0が一番弱く、255が一番強い。</p>                  |
| ビッグエンディアン２バイト | 2    | 続くデータ領域のバイト数。                                                                      |
| バイト列          | N    | 送受信したいバイト列。                                                                        |

### オプション

各種送信時のオプションが指定できます。アプリケーション再送や遅延のためのオプションは、１パケットで送信できるデータ量(送受信したいデータが78バイト以内)で使用してください。

※ 本オプションはネットワーク層を利用した送信では使用しないでください。

| オプションバイト | パラメータバイト数 | 規定値v1.2.13以降     | 解説                                                                                                                                                                                                                                              |
| -------- | --------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 0x1      | 0         | 無効               | <p>MAC ACK を設定します。<br>※ 中継機による中継が行われなくなります。<br>※ 送信先が 0x78(子機ブロードキャスト) の場合、この設定は無効になります。</p>                                                                                                                                                    |
| 0x2      | 1         | 0x00             | <p>アプリケーション再送を行います。<br>・0x00 ～ 0x0F: 0 から 16 回の再送を行います。 送信成功を持って終了します。主にMAC ACK 設定時に使用します。<br>・0x81 ～ 0x8F: 1 から 16 回の再送を行います。失敗成功に関わらず指定回数の送信を行います。主に MAC ACK を設定しない場合に利用します。<br>応答メッセージは、全ての再送処理が終わってから処理されます。<br></p>                        |
| 0x3      | 2         | 0x0000           | <p>初回の送信までの遅延を設定し、その最小値を与えます。<br>パラメータはビッグエンディアンの２バイトで、遅延\[ms]を指定します。<br></p>                                                                                                                                                                   |
| 0x4      | 2         | 0x0000           | <p>初回の送信までの遅延を設定し、その最大値を与えます。<br>パラメータはビッグエンディアンの２バイトで、遅延\[ms]を指定します。最小値より小さい値を与えた場合は無効になります。<br><br>結果、送信要求発行からの遅延は (最小値)+(最大値-最小値)x(乱数 0...1) となります。</p>                                                                                      |
| 0x5      | 2         | パケット数 x 10 \[ms] | <p>アプリケーション再送の再送間隔を指定します。<br>パラメータはビッグエンディアンの２バイトで、送信間隔\[ms]を与えます。</p>                                                                                                                                                                          |
| 0x6      | 0         | 無効               | <p>併行要求処理を行う。<br>このオプションが設定された要求は、要求完了までブロックせず、次の要求処理を受け付けます。<br>例えば 0.5 秒の遅延を設定した要求を 3 ヶを連続して投入した場合、本オプションを付けない場合は 0.5 秒後、1.0秒後、1.5秒ごと順次処理されますが、本オプションを付加すると 0.5秒後に３つの送信要求が処理されます。<br>※ パケット分割しない送信処理に限ります。<br>※ 併行動作の最大数は５ヶで、送信順は保証されません。</p> |
| 0x07     | 0         | 無効               | 送信後、応答メッセージを表示しません。                                                                                                                                                                                                                             |
| 0x08     | 0         | 無効               | <p>送信後、速やかにスリープします。<br>※ スリープからの復帰は RX ポート (DIO7) に Lo → Hi への割り込み信号を入力します（何か１バイト入力する）。コマンドはUART初期化が終わってから入力します。</p>                                                                                                                            |

※ 遅延や再送回数などによりコマンド入力から１秒を経過すると、コマンド処理がタイムアウトし、処理待ちのコマンドが処理されます。

※ 遅延処理やアプリケーション再送が行われている間は、内部のパケットバッファー（１０ヶ）が処理待ちで埋まっていて新しい処理要求が実行されない場合が有ります。また同時に平行処理できるパケットは５ヶとなります。

※ パケットの重複確認は、内部で割り振っている連番で新しいものを優先し旧いものは採用しません。新しい要求受け付けのパケットが先に届き、旧い要求受け付けのパケットが後に届くような場合、古いパケットは受信されません。（特に 0x06 オプションを付加した時に、このような現象が発生しやすくなります）

※ パケット分割されるデータサイズの場合に遅延処理やアプリケーション再送処理を行うと、後半のパケットが前半のパケットの処理完了後に処理されるため、大きな時間差が発生し受信側でタイムアウトを起こし受信が失敗します。原則として遅延が発生するオプションはパケット分割しない範囲で使用してください。

## 応答メッセージ

応答メッセージはコマンドの入力に対し、処理結果を通知します。

| データ形式 | バイト数 | 解説                                                                                                                  |
| ----- | ---- | ------------------------------------------------------------------------------------------------------------------- |
| バイト   | 1    | 0xDB                                                                                                                |
| バイト   | 1    | 0xA1                                                                                                                |
| バイト   | 1    | <p>応答ID。<br>拡張形式では指定した応答ID、 簡易形式では続き番号(128～255)が振られます。<br>※ 拡張形式と簡易形式を混在させて利用する場合、応答IDに128以上の値を使用すると識別できなくなります。</p> |
| バイト   | 1    | 0:失敗 1:成功                                                                                                           |

## 使用例

以下の例では、バイトまたはバイト列を 0x を省略して表記します。

```
0x01 0x02 0x0A 0x0B ⇒ 01020A0B
```

※ 以下の例をそのままTWELITEに入力できるわけではなく、アスキーまたはバイナリ形式で表現します。

### 簡易形式

**子機から親機へ（ 0203 の２バイトを送信、コマンドバイトは 01）**

```
	  
・送信コマンド
  00010203
  ^1^2
  
  *1 00:親機宛
  *2 データ
```

```
	  
・応答メッセージ
  DBA18001
        ^1
  *1 01:成功, 00:失敗
```

```
  
・受信
  78010203
  ^1
  
  *1 78:子機(論理ID設定なし)から来た
```

**親機から全子機へ（長い系列）**

```
  
  78020304DB32807005D70101100001000080A005D718DB32807005D7010110
  0001000080A005D718DB32807005D70101100001000080A005D718DB328070
  05D70101100001000080A005D718DB32807005D70101100001000080A005D7
```

### 拡張形式

**子機→親機（単純な送信）**

```
	  
・送信コマンド
  00A012FF123456
      ^1^2^3
      
  *1 応答番号 12
  *2 オプション無し
  *3 データ
```

```
・応答メッセージ
  DBA11201
      ^1^2
   
  *1 応答番号 12
  *2 01:成功
```

```
・受信データ
  78A01286300001FFFFFFFFD80003123456
      ^1^2      ^3      ^4^5  ^6
  
  *1 応答番号 12
  *2 送信元アドレス(86300001)
  *3 送信先アドレス（FFFFFFFF 情報なし）
  *4 通信品質(LQI)
  *5 データ部バイト数 (0003=3バイト)
  *6 データ (3バイトのデータ)
```

**子機→親機（Ack付きの送信）**

```
	  
・送信コマンド
  00A01301FF123456
        ^1
        
   *1 ACK 指定
```

**子機→親機（0.768秒後に送信）**

```
	  
・送信コマンド
  00A01001030300FF123456
          ^1^2  ^3
  
  *1 送信遅延最小の設定
  *2 0300(=768ms)後
  *3 オプション終端
```

## カスタムデフォルト

ファームウェアバイナリに設定情報を付記した設定済みファームウェアバイナリが利用できます。例えば、ボーレートを最初から設定したファームウェアを作成しておけば、毎回インタラクティブモードなどで設定する必要がなくなります。

{% content-ref url="../other-features/custom-defaults" %}
[custom-defaults](https://twelite.gitbook.io/mw-pug-uart/other-features/custom-defaults)
{% endcontent-ref %}

## 0xDB コマンド

インタラクティブモードでの設定を行う替わりに、書式モード（バイナリモード・アスキーモード）では、コマンドによりモジュールの動作（リセット・サイレント解除）や設定を行えます。

{% content-ref url="mode\_ab/0xdb-command" %}
[0xdb-command](https://twelite.gitbook.io/mw-pug-uart/mode_selection/mode_ab/0xdb-command)
{% endcontent-ref %}

## サイレントモード

サイレントモードでは、受信回路を動作させず稼働中にパケット受信を行いません。起動後にマイコン経由で毎回特定の設定を反映させてから、通信を始めるような場合に利用します。

{% content-ref url="mode\_ab/silent-mode" %}
[silent-mode](https://twelite.gitbook.io/mw-pug-uart/mode_selection/mode_ab/silent-mode)
{% endcontent-ref %}
