TWE-Lite シリアル通信アプリ Byteモードの設定(Pythonで送信)


はじめに

MonowirelessのTWE-Liteシリアル通信アプリ「Byteモード」の送受信でつまずいた個所を、覚えとして残します。

環境

Windows 10
MONOSTIC
TWI-LITE DSP(TWELITE R)

Anconda
python 3.7
pyserial

参考までに、TWE-Liteを使った例(標準モード)がこちらのサイトにありました。(使っているのがPython2なのでByteの扱いには注意が必要です。)
農業IT人材の育成テキスト

インストールしておいたほうが良いソフト(シリアル通信の確認)

Teraterm
Realterm(バイナリー送受信をするため)

シリアル通信アプリへの書き換え

下記のWebページを参考に進めます。
参考:評価開発環境TWELITE STAGE-トワイライトステージ
(1)TWELITE STAGE-トワイライトステージのダウンロード
→私の場合 Windows

(2)書き換えるTWELITE RまたはMONOSTICKをUSBポートに接続
→TWELITE Rの場合 USB端子近くにある黄色いジャンパーピンの位置を確認(3つピンがあるうちUSB端子に近い2つをジャンパーする。そうしないと、DIPに電源が供給されず認識エラーが出る。)
参考:TWELITE R-トワイライター

(3)MWSTAGEフォルダ内のTWELITE_stage.exe(Windows)の起動と書き換え
→2.のアプリの書き換えを選択 
TWELITEプログラマーに画面が移る。
→3.のTWELITE APPSビルド&書換を選択
App_Uartを選択

(4)インタラクティブモードで内容の書き換え
TWELITE STAGEに戻りインタラクティブモードを選択
Set Device IDを変更
親機:121 = 0x79
子機:120 = 0x78(デフォルト)
「i」 を押す 「121」 または「0」と入力
大文字の「S」(Shift+S)を入力すると変更が保存される。

(5)chat modeでテスト
チャットモード
Teratermでシリアル接続を選択
親機、子機がつながっているCOMポートを参照。
Teratermの設定のシリアルポートの設定と接続でスピードを「115200」に設定(この設定にしないとうまくいかない)

TereTermでの接続例
COM3が子機、COM4が親機

(6)アスキーモード
今回省略
設定はインタラクティブモードに入り
「m」を押す。「a」と入力
大文字の「S」(Shift+S)を入力すると変更が保存される。

(7)バイナリーモード
通信を確認するためにRealtermを利用。
Realtermの設定
Baud:115200
Port:4 もう一つは3を指定
Display As:Hex(space)

子機から親機への送信
「0xA5 0x5A 0x80 0x05 0x00 0x00 0x11 0x22 0x33 0x78」を送信
※RealtermのSendタグ内のSerial Numbersに上記の16進数を入れる。
親機
「A5 5A 80 05 78 00 11 22 33 78 04 」を受信

親機から子機へ
「0xA5 0x5A 0x80 0x05 0x78 0x00 0x11 0x22 0x33 0x78」
子機
「A5 5A 80 05 00 00 11 22 33 00 04 」を受信

実際に通信してみた例 左が3で子機、右が4で親機

「0xA5 0x5A 0x80 0x05 0x00・・・」
5byte目の数字で送り先を指定
00:親機、78:子機 

Python(Pyserial)で送信

Pythonで送信して、Realtermでモニタリングしてみる
Python=3.7, 
Pyserialをインストール
(Anacondaを使っている場合、condaでインストールする方が良い)
参考:Anaconda仮想環境の作り方(conda-forge、Jupyter notebook)

import serial

# 親機:COM4、子機:COM3
# 親機から子機へ送信 0x78 を指定 
data=[0xA5, 0x5A, 0x80, 0x05, 0x78, 0x00, 0x11, 0x22, 0x33] 

# 子機から親機へ送信 0x00 を指定 '
# data=[0xA5, 0x5A, 0x80, 0x05, 0x00, 0x00, 0x11, 0x22, 0x33] 

# チェックサムの計算
chs = 0
for i in data[4:]:
    print(hex(i))
    chs = chs ^ i
print('check sum xor:',hex(chs))
data.append(chs)

# borate 115200
b_data = bytearray(data)
# 親機から子機へ送る場合。子機から親機への場合はCOM3にする。
with serial.Serial('COM4', 115200) as ser:
    print('---')
    ser.write(b_data)
    print('---')

実行例