超簡単!標準アプリからの出力(親機・中継機アプリ)
超簡単!標準アプリからデータを受信した際の出力書式
0x81:相手端末からの状態通知
受信した入力信号の状態を出力します。
データ形式
| # | データ | 内容 | 備考 |
|---|---|---|---|
char | ヘッダ | :のみ | |
| 0 | uint8 | 送信元の論理デバイスID | |
| 1 | uint8 | コマンド番号 | 0x81のみ |
| 2 | uint8 | パケット識別子 | アプリケーションIDより生成 |
| 3 | uint8 | プロトコルバージョン | 0x01のみ |
| 4 | uint8 | LQI | 0-255 |
| 5 | uint32 | 送信元のシリアルID | 0x8??????? |
| 9 | uint8 | 送信先の論理デバイスID | |
| 10 | uint16 | タイムスタンプ | 1秒で64カウント |
| 12 | uint8 | 中継回数 | |
| 13 | uint16 | 電源電圧 | 単位はmV |
| 15 | int8 | - | (未使用) |
| 16 | uint8 | デジタル信号 | LSBから順にDIxへ対応、0がHighMSBが 1なら定期送信 |
| 17 | uint8 | デジタル信号マスク | LSBから順にDIxへ対応、1が有効 |
| 18 | uint8 | AI1の変換値 | アナログ信号の計算を参照、0xFFで未使用 |
| 19 | uint8 | AI2の変換値 | アナログ信号の計算を参照、0xFFで未使用 |
| 20 | uint8 | AI3の変換値 | アナログ信号の計算を参照、0xFFで未使用 |
| 21 | uint8 | AI4の変換値 | アナログ信号の計算を参照、0xFFで未使用 |
| 22 | uint8 | AIxの補正値 | LSBから2ビットずつ順にAIxへ対応 |
uint8 | チェックサム | LRC8 | |
char | フッタ | CR (0x0D/'\r') | |
char | フッタ | LF (0x0A/'\n') |
アナログ信号の計算
AIxの入力電圧 \(V\)は、受信した変換値\(e_{r}\)および補正値\(e_{fr}\)を使って次のように表すことができます。
$$\begin{align*}
V &= e+e_f \\
\text{where} \\
e &= 16e_r \\
e_f &= 4e_{fr} \\
\end{align*}$$
単位は mV
出力データの例
:78811501C98201015A000391000C2E00810301FFFFFFFFFB
| # | データ | 内容 | 値 | |
|---|---|---|---|---|
: | char | ヘッダ | : | |
78 | 0 | uint8 | 送信元の論理デバイスID | 0x78 |
81 | 1 | uint8 | コマンド番号 | 0x81 |
15 | 2 | uint8 | パケット識別子 | 0x15 |
01 | 3 | uint8 | プロトコルバージョン | 0x01 |
C9 | 4 | uint8 | LQI | 201/255 |
8201015A | 5 | uint32 | 送信元のシリアルID | 0x201015A |
00 | 9 | uint8 | 送信先の論理デバイスID | 0x00 |
0391 | 10 | uint16 | タイムスタンプ | 約14.27秒 |
00 | 12 | uint8 | 中継回数 | 0 |
0C2E | 13 | uint16 | 電源電圧 | 3118mV |
00 | 15 | int8 | - | |
81 | 16 | uint8 | デジタル信号 | DI1 L DI2 HDI3 H DI4 H(定期送信) |
03 | 17 | uint8 | デジタル信号マスク | DI1 DI2 |
01 | 18 | uint8 | AI1の変換値 | 16mV |
FF | 19 | uint8 | AI2の変換値 | 未使用 |
FF | 20 | uint8 | AI3の変換値 | 未使用 |
FF | 21 | uint8 | AI4の変換値 | 未使用 |
FF | 22 | uint8 | AIxの補正値 | AI1 0x03 |
FB | uint8 | チェックサム | 0xFB | |
char | フッタ | \r | ||
char | フッタ | \n |
データの判別条件
親機・中継機アプリは、さまざまな種類の子機からデータを受信することができます。
出力されたデータが超簡単!標準アプリのものであるかを確認するには、次の箇所を参照してください。
| # | データ | 項目 | 条件 |
|---|---|---|---|
| 1 | uint8 | コマンド番号 | 0x81であること |
| 3 | uint8 | プロトコルバージョン | 0x01であること |
| 5 | uint32 | 送信元のシリアルID | MSBが1であること(0x8???????) |
| - | - | ペイロードのサイズ | 23バイトであること(:とチェックサムの間) |
パーサの実装例
- Python
- Arduino (C++)
0x01:任意のデータの受信
データ形式
| # | データ | 内容 | 備考 |
|---|---|---|---|
char | ヘッダ | :のみ | |
| 0 | uint8 | 送信元の論理デバイスID | 親機0x00,子機0x01-0x64,未設定子機0x78 |
| 1 | uint8 | コマンド番号 | 0x01のみ |
| 2 | [uint8] | 任意のデータ | 長さ\(N\)のバイト列 |
uint8 | チェックサム | LRC8 | |
char | フッタ | CR (0x0D/'\r') | |
char | フッタ | LF (0x0A/'\n') |
シリアル通信アプリの書式モード(アスキー)の簡易形式のコマンド番号が
0x01であった場合と同様です。