Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
;U;%t;%i;0x%A;%q;%s;<*>;%X;\n;U;00777;120;0x81025A17;120;013;HELLO;79;
;1;2----;3--;4---------;5--;6--;7----;8-;--- CONFIG/TWE UART APP V1-04-5/SID=0x82018ca0/LID=0x78 -- ---
...
h: set header format [%A,%q,%s,*\n]
...
---
S: save Configuration
R: reset to Defaults81025A17,120,013,HELLO[送信側]
HELLO <- 入力
;U;00818;219;0x81025A17;000;013;13,1,HEL...;55; <- 出力
[受信側]
;U;00777;120;0x81025A17;120;013;HELLO;26; <-出力--- CONFIG/TWE UART APP V1-04-5/SID=0x810a479c/LID=0x01 -E ---
...
h: set header format [*\n]
受信側で上記の設定を行うと、以下のように表示されます。
[送信側] HELLO<CR><LF> または HELLO<LF>
[受信側] HELLO<CR><LF> h: set header format [;%I;*;%X]
上記のように設定した場合、
受信側で上記の設定を行うと、以下のように表示されます。
[送信側] HELLO<CR><LF> または HELLO<LF>
[受信側] ;000;HELLO;49
送信側のアドレスはでHELLOという文字が届きチェックサムが0x49です。
チェックサムの計算範囲は ;000;HELLO; です。#include <stdio.h>
int main() {
unsigned char x = 0;
char *p = ";000;HELLO;";
while(*p) {
x ^= *p;
p++;
}
printf("%s -> %02x\n", argv[1], x);
}
// ;000;HELLO; -> 49:00A01301FF123456B1[CR][LF]:00A01301FF123456B1[CR][LF] ⇒ :00A01301FF123456X--- CONFIG/TWE UART APP V1-04-5/SID=0x82018ca0/LID=0x78 -- ---
a: set Application ID (0x67720103)
i: set Device ID (120=0x78)
c: set Channels (18)
x: set RF Conf (3)
r: set Role (0x0)
l: set Layer (0x1)
b: set UART baud (38400)
B: set UART option (8N1)
m: set UART mode (E)
k: set Tx Trigger (sep=0x0d0a, min_bytes=0 dly=0[ms])
h: set header format [;%A;%q;*;\n] <- ここを変更(書式の変更)
C: set crypt mode (0)
o: set option bits (0x00010100) <- ここを変更(ボーレートの変更)
---
S: save Configuration
R: reset to Defaults#include <SoftwareSerial.h>
SoftwareSerial MWSerial(2, 3); // RX, TX
#define BLOCK_MAX 10
char *p;
char buf[256];
// データ列を区切り文字で分割してString型の配列に入れる。
int split( char* source, char delimiter, String* result ){
char* p = source;
char tmp[81];
memset(tmp, 0, sizeof(tmp));
int n = 0;
int block = 0;
// ヌル文字が来るか分けたブロック数がBLOCK_MAXになったらやめる。
while( *p != 0 && block < BLOCK_MAX ){
// 区切り文字が来たら、String型に変換する。
if( *p == delimiter ){
// 分割したデータが0バイトの時は何もしない。
if( n > 0 ){
// 念のためヌル文字を末尾に代入。
tmp[n] = 0;
result[block] = String(tmp);
block++;
n = 0;
memset(tmp, 0, sizeof(tmp));
}
}else{
tmp[n] = *p;
n++;
}
p++;
}
return block;
}
void setup() {
Serial.begin(38400);
MWSerial.begin(38400);
p = buf;
memset(buf, 0, sizeof(buf));
}
void loop() {
while (MWSerial.available()) {
char before = *p;
*p = MWSerial.read();
if( before=='\r' && *p=='\n' ){
*p = 0; // 末尾をNull文字にする
String str[BLOCK_MAX]; // 区切り文字で分割した文字列を入れる
int len = p-buf; // シリアルで読み込んだデータ量の計算
int block = split( buf, ';', str ); // データの分割
if( block == 3 ){
Serial.print("Message: ");
Serial.println(buf);
Serial.print("Serial No.: ");
Serial.println(str[0]);
Serial.print("LQI: ");
Serial.println(str[1]);
Serial.print("Data: ");
Serial.println(str[2]);
Serial.println();
}
p = buf;
memset(buf, 0, sizeof(buf));
}else{
if( *p >= 0x20 ){
p++;
}
}
}
while(Serial.available()){
MWSerial.write(Serial.read());
}
}[送信側]
HELLO <- 入力
Message: ;820109F1;000;12,1,HEL...; <- 出力
Serial No.: 820109F1 <- 出力
LQI: 000 <- 出力
Data: 12,1,HEL... <- 出力
[受信側]
Message: ;820109F1;177;HELLO; <- 出力
Serial No.: 820109F1 <- 出力
LQI: 177 <- 出力
Data: HELLO <- 出力
void loop() {
while (MWSerial.available()) {
char before = *p;
*p = MWSerial.read();
if( before=='\r' && *p=='\n' ){
*p = 0; // 末尾をNull文字にする
String str[BLOCK_MAX]; // 区切り文字で分割した文字列を入れる
int len = p-buf; // シリアルで読み込んだデータ量の計算
int block = split( buf, ';', str ); // データの分割
if( block == 3 ){
Serial.println(buf);
Serial.print("Serial No.: ");
Serial.println(str[0]);
Serial.print("LQI: ");
Serial.println(str[1]);
Serial.print("Data: ");
Serial.println(str[2]);
Serial.println();
}
p = buf;
memset(buf, 0, sizeof(buf));
}else{
if( *p >= 0x20 ){
p++;
}
}
}
while(Serial.available()){
MWSerial.write(Serial.read());
}
}int split( char* source, char delimiter, String* result ){
char* p = source;
char tmp[81];
memset(tmp, 0, sizeof(tmp));
int n = 0;
int block = 0;
// ヌル文字が来るか分けたブロック数がBLOCK_MAXになったらやめる。
while( *p != 0 && block < BLOCK_MAX ){
// 区切り文字が来たら、String型に変換する。
if( *p == delimiter ){
// 分割したデータが0バイトの時は何もしない。
if( n > 0 ){
// 念のためヌル文字を末尾に代入。
tmp[n] = 0;
result[block] = String(tmp);
block++;
n = 0;
memset(tmp, 0, sizeof(tmp));
}
}else{
tmp[n] = *p;
n++;
}
p++;
}
return block;
}A: [送受信したいデータ]
↓↑
B: [送信コマンド[A: ] ]
↓↑
C: 系列Bをアスキー形式またはバイナリ形式に変換
[形式ヘッダ [B: [A: ] ] 終端]
↓↑
マイコンのUART入出力 0x78 0x01 0x11 0x22 0x33 0xAA 0xBB 0xCC 0x00 0x01 0x11 0x22 0x33 0xAA 0xBB 0xCC:0001112233AABBCC68[CR][LF]0x01 0x02 0x0A 0x0B ⇒ 01020A0B
・送信コマンド
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バイトのデータ)
・送信コマンド
00A01301FF123456
^1
*1 ACK 指定
・送信コマンド
00A01001030300FF123456
^1^2 ^3
*1 送信遅延最小の設定
*2 0300(=768ms)後
*3 オプション終端[送信側]
HELLO <- 入力
;U;00818;219;0x81025A17;000;013;13,1,HEL...;67; <- 出力
[受信側]
;U;00777;120;0x81025A17;120;013;HELLO;79; <-出力[送信側]
:000148454C4C4F8B <-入力
:DBA1800103 <-出力
[受信側]
:780148454C4C4F13 <-出力[送信側]
810A4778:0> Hello <-入力
810A4778:1> <-出力
[受信側]
[810A4778:0] Hello <-出力
82018CA0:0> <-出力[送信側]
Hello <-入力
[受信側]
Hello <-出力 Windows でのコマンドラインの実行例:
C:\work> copy App_Uart_Master_JN5164_1_2_X.bin App_Uart_custom_1_2_X.bin
C:\work> type conf.bin >> App_Uart_custom_1_2_X.bin
Linux, macOS では、
$ cat App_Uart_Master_JN5164_1_2_X.bin conf.bin > App_Uart_custom_1_2_X.bin --- CONFIG/TWE UART APP V1-02-2/SID=0x81001f1c/LID=0x78 C- --- --- CONFIG/TWE UART APP V1-02-2/SID=0x81001f1c/LID=0x78 CE ------ CONFIG/TWE UART APP V1-02-3/SID=0x81001f1c/LID=0x78 -- ---
...
i: set Device ID (121=0x79)*
...
m: set UART mode (A)*
---
S: save Configuration
R: reset to Defaults!INF Write config Success
!INF RESET SYSTEM...(再起動中)
:DB6772010300010203F181001F1C0095 (再起動後の始動メッセージ) 子機から親機
:0000112233X
↓
親機の受信メッセージ
:780011223322 親機から親機
:7800112233X
↓
子機の受信メッセージ
:00001122339A 子機から親機(アスキー形式)
:0000112233X
↓
親機の受信メッセージ(バイナリ形式)
A5 5A 80 05 78 00 11 22 33 78 04 子機から親機(バイナリ形式)
A5 5A 80 05 00 00 11 22 33 00
↓
親機の受信メッセージ(バイナリ形式)
A5 5A 80 05 78 00 11 22 33 78 04 親機から子機 (バイナリ形式)
A5 5A 80 05 78 00 11 22 33 78
↓
子機の受信メッセージ(バイナリ形式)
A5 5A 80 05 00 00 11 22 33 00 04r: set Role (0x0) m: set UART mode (D)
k: set Tx Trigger (sep=0x0a, min_bytes=8 dly=30[ms])
o: set option bits (0x00000100)r: set Role (0x0)--- CONFIG/TWE UART APP V1-00-0/SID=0x81001f57/LID=0x78 ---
a: set Application ID (0x67720103)
i: set Device ID (--)
c: set Channels (18)
o: set Output Tx Power (3)
r: set Role (0x0)
b: set UART baud (38400)
p: set parity (N)
m: set uart mode (C)
h: set handle name []
C: set crypt mode (0)
K: set crypt key []
---
S: save Configuration
R: reset to Defaults[送信側]
HELLO <- 入力
;U;00818;219;0x81025A17;000;013;13,1,HEL...;67; <- 出力
[受信側]
;U;00777;120;0x81025A17;120;013;HELLO;79; <-出力;U;00777;120;0x81025A17;120;013;HELLO;79;
;1;2----;3--;4---------;5--;6--;7----;8-;
--- CONFIG/TWE UART APP V1-04-5/SID=0x82018ca0/LID=0x78 -- ---
a: set Application ID (0x67720103)
i: set Device ID (120=0x78)
c: set Channels (18)
x: set RF Conf (3)
r: set Role (0x0)
l: set Layer (0x1)
b: set UART baud (38400)
B: set UART option (8N1)
m: set UART mode (E)
k: set Tx Trigger (sep=0x0d0a, min_bytes=0 dly=0[ms])
h: set header format [;U;%t;%i;0x%A;%q;%s;<*>;%X;\n]
C: set crypt mode (0)
o: set option bits (0x00000100)
---
S: save Configuration
R: reset to Defaults
r: set Role (0x0)A: [送受信したいデータ]
↓↑
B: [コマンド表現 [A: ] ]
↓↑
C: 系列Bをアスキー形式またはバイナリ形式に変換
[形式ヘッダ [B: [A: ] ] 終端]
↓↑
マイコンのUART入出力






















