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人材の育成テキスト](https://www.chiba-fjb.ac.jp/www/monka/H29/h29_Report02.pdf)

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

Teraterm
Realterm（バイナリー送受信をするため）

###シリアル通信アプリへの書き換え
下記のWebページを参考に進めます。
参考：[評価開発環境TWELITE STAGE-トワイライトステージ](https://mono-wireless.com/jp/products/stage/index.html)
（1）TWELITE STAGE-トワイライトステージのダウンロード
→私の場合　Windows

（2）書き換えるTWELITE RまたはMONOSTICKをUSBポートに接続
→TWELITE Rの場合　USB端子近くにある黄色いジャンパーピンの位置を確認（3つピンがあるうちUSB端子に近い２つをジャンパーする。そうしないと、DIPに電源が供給されず認識エラーが出る。）
参考：[TWELITE R-トワイライター](https://mono-wireless.com/jp/products/TWE-LITE-R/twelite-r1/index.html)

（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でテスト
[チャットモード](https://mono-wireless.com/jp/products/TWE-APPS/App_Uart/mode_chat.html)
Teratermでシリアル接続を選択
親機、子機がつながっているCOMポートを参照。
Teratermの設定のシリアルポートの設定と接続でスピードを「115200」に設定（この設定にしないとうまくいかない）

![tw01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/13b3a3ba-bdf0-d3d0-2418-dde659a263b0.png)


TereTermでの接続例
COM3が子機、COM4が親機
![tw03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/0c7bb43f-8eda-ad3c-0913-27196993d779.png)

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


（7）バイナリーモード
通信を確認するためにRealtermを利用。
Realtermの設定
Baud：115200
Port:4　もう一つは3を指定
Display As：Hex(space)
![tw011.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/f034d570-6b63-64e3-95b8-d1cf12788485.png)
![tw010.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/e13e9164-c340-1e56-4c5c-57afc2f1fc8a.png)


子機から親機への送信
「0xA5 0x5A 0x80 0x05 <u>0x00</u> 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 <u>0x78</u> 0x00 0x11 0x22 0x33 0x78」
子機
「A5 5A 80 05 00 00 11 22 33 00 04 」を受信

実際に通信してみた例　左が3で子機、右が4で親機
![TW013.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/7cb0c8c7-7f6d-19b0-9ce1-ea65c2867ce3.png)

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

#### Python（Pyserial）で送信
Pythonで送信して、Realtermでモニタリングしてみる
Python=3.7,　
Pyserialをインストール
(Anacondaを使っている場合、condaでインストールする方が良い）
参考：[Anaconda仮想環境の作り方（conda-forge、Jupyter notebook)](https://qiita.com/Gyutan/items/c8f398553566ae580d60)

```python
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('---')
```


実行例
![tw015.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165987/aa77c637-48c6-3dbd-79ee-331a6c8ec3f7.png)