UMEHOSHI ITA TOP PAGE COMPUTER SHIEN LAB
[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、テスト用プログラムが書き込まれいています。
これを利用したユーザー用のプログラムを「ウメ・エディットプログラム」と呼ぶことにします。
「ウメ・エディットプログラム」の開発では「umehoshiEditツール」が必要で、
その取得や最初の操作情報は、こちらを参照してください。
(他に、アセンブラページ(現在作成中)で作ることもできます。)
以下では、PCと[UMEHOSHI ITA]をUSBで接続して、
PC側のpythonプログラムで[UMEHOSHI ITA]動かします。
その通信例として、コンソールで入力した文字列を送信し、
その応答を受信したPCで文字列を表示する例を示しています。
次に「umehoshiEditツール」のビルドなどで得られる「ウメ・エディットプログラム」のHEXファイルを追加・編集して、
[UMEHOSHI ITA]に転送・実行を指示するファイルを作ります。
そして、そのファイルを転送するPythonプログラム例を示しています。
なお、『pip install serial』などで、python用serialモジュールをインストール した環境で操作してください。
(参考: https://pyserial.readthedocs.io/en/latest/pyserial_api.html)
PCのコンソールでキー入力した文字列を、接続している[UMEHOSHI ITA]へ送信し、 その応答文字列をコンソールに表示するPythonのプログラム例を示します。 「port = 'COM4'」の設定値は、接続したUSBのデバイス識別名に合わせて変更してください。
import threading # key_send_to_ume.py from time import sleep import serial # USBのCDCデバイスを使うため usb= serial.Serial(port = 'COM4', baudrate = 115200,timeout = 10) loop_flag=True def read_loop(): # USBからの受信データを表示するスレッド用関数 global loop_flag while loop_flag: b=usb.readline() # binary入力 if(b == b''): print("End Thread") loop_flag = False return print(b) #print(b.decode('utf-8')) # スレッドに read_loop 関数を渡す t_id = threading.Thread(target=read_loop) # スレッドスタート s = input(">>>") # 例「G1080004000006C」 t_id.start() while s != "" : usb.write(s.encode('utf-8')) # byteに変換して出力 usb.write(b'\r\n') sleep(0.4) s = input(">>>") loop_flag=False usb.close()実行のイメージを示します。USBからのserial入力処理を別スレッド行っています。
(base) >python sendtest.py
>>>G1080004000006C
b'G1080004000006C\r\n'
b':108000400000F0B2009D34A6009D00000000C7580000D0\r\n'
>>>
(キー入力でEnterだけを入力するか。または10秒以上入力しないと受信スレッドが終わります。)
上記では「UME専用Hex」文字列を、キー入力することで、それを[UMEHOSHI ITA]基板に送信するpythonプログラムと動作例を紹介しました。
以下ではキー入力の代わりに、command.txtのファイル内容を送信するpythonプログラムと動作例の紹介します。
command.txtの内容は、
「umehoshiEditツール」でビルドして得られたファイルに
実行指示を追加して作ります。
例として、『実行するごとに、D1のLEDの点灯/消灯を切り替えるプログラム』のプログラムを以下に示します。
#include <xc.h> #include "common.h" __attribute__((address( 0x80005000 ))) void test (void); void test() { _RB15 = ! _RB15;// 出力を反転 ★ _send_string("LED ON/OFF\r\n"); }
以下は、上記をビルドして得られたHEX文字列と、実行時に使う文字列を一つのにまとめたcommand.txtファイル内容です。
S108000500000E8FFBD271400BFAF1000BEAF21F0A00317 S10800050100088BF023C2061428C008042300100422CB7 S108000502000FF00443088BF033C20616294C47B827C63 S108000503000206162A400A0023CA44142340000428CC5 S1080005040000080033C6850642409F8400000000000EC S10800050500021E8C0031400BF8F1000BE8F1800BD275B S0880005060000800E0030000000032 S1080005068004C4544204F4E2F4F46460D0A0000000089 S1080005078000000000022222222222222222222222220 R00800050000061
上記の の部分がビルドで得られたファイルをコピーしたもので、
[UMEHOSHI ITA]へのプログラムやデータを転送する命令です。
また、 の部分が[0x80005000]の絶対番地の関数を実行する命令で、
「umehoshiEditツール」の[Excute]ボタンで得られる文字列です。
つまり、プログラムやデータを転送するSから始まる指示と、Rから始まる指定アドレスの関数を呼び出す指示を含んだもので、
テキストエディタで編集して作ります。
(これを前回のPython実行画面のキー入力画面で貼り付けると、プログラム転送に実行することになります。)
以下で、command.txtのファイル内容を[UMEHOSHI ITA]に転送するPythonのプログラム(instruct.py)を示します。
import sys # instruct.py import serial import threading import numpy as np from time import sleep usb= serial.Serial(port = 'COM4', baudrate = 115200,timeout = 5) def check_sum(s): ck = 0 n = len(s) if n == 0: return for i in range(n-2): ck += ord(s[i]) #print(ck) print(s[i] , end ="") print(' ',s[-2:] , end ="") ck += int(s[-2:] , 16) ck &= 0x0f print("チェックサム:", ck ) if ck != 0 : print("ファイルフォーマット・エラー") exit() def file_send(): fr=open('command.txt') # このファイル内容が転送対象です。 while True: s = fr.readline() if s == "" : break s = s.strip()#前後空白を除く check_sum(s) # ファイルからの1行を確認し、表示 if s.startswith('R'): input("実行スタートの Enter >>") usb.write(s.encode('utf-8')) # byteに変換して出力 usb.write(b'\r\n') # [UMEHOSHI ITA]USBへ送信 sleep(0.1) #usb.flush() fr.close() # ファイル入力、USB送信 スレッドに file_send 関数を渡す t_id = threading.Thread(target=file_send) t_id.start()# ファイル入力、USB送信 スレッドスタート usb_read_loop = True while usb_read_loop: b=usb.readline() # binary入力 if(b == b''): usb_read_loop = False break s = b.decode('utf-8') print("USB受信●",b) #print("USB受信●",s) input("終了確認の Enter >>>") usb.close()
実行前に、USBで[UMEHOSHI ITA]と接続し、そのポートがCOM4の場合のプログラムです。
異なる場合は、プログラムのCOM4を変更してくいださい。
また、このソースと同じ位置にcommand.txtを置かなければなりません。
このファイルを1行ずつ読んでは転送するプログラムです。
スレッドでファイルを1行ごとに読み取って、チェックサムのエラーがなければ、USBで[UMEHOSHI ITA]へ送信しています。
チェックサムエラーがあれば、そこでプログラムは終了します。
また、USBへの送信データが'R'から始まる実行指示の文字列であれば、[Enter]のキー入力を待ちます。
待つ間は、送信が行われないので、応答もありません。応答が無い状態が5秒続くと、プログラムは終わるようにメインのループが作られています。
メインのループで、USBからの応答文字列を受信してコンソール画面に表示しています。
下記にこの実行イメージを示します。
(base) C:\Microchip\umehoshiEdit2\samples\sound>python Instruct.py S108000500000E8FFBD271400BFAF1000BEAF21F0A003 17チェックサム: 0 USB受信● b'S108000500000E8FFBD271400BFAF1000BEAF21F0A00317\r\n' USB受信● b'SET:80005000\r\n' S10800050100088BF023C2061428C008042300100422C B7チェックサム: 0 USB受信● b'S10800050100088BF023C2061428C008042300100422CB7\r\n' USB受信● b'SET:80005010\r\n' S108000502000FF00443088BF033C20616294C47B827C 63チェックサム: 0 USB受信● b'S108000502000FF00443088BF033C20616294C47B827C63\r\n' USB受信● b'SET:80005020\r\n' S108000503000206162A400A0023CA44142340000428C C5チェックサム: 0 USB受信● b'S108000503000206162A400A0023CA44142340000428CC5\r\n' USB受信● b'SET:80005030\r\n' S1080005040000080033C6850642409F8400000000000 ECチェックサム: 0 USB受信● b'S1080005040000080033C6850642409F8400000000000EC\r\n' USB受信● b'SET:80005040\r\n' S10800050500021E8C0031400BF8F1000BE8F1800BD27 5Bチェックサム: 0 USB受信● b'S10800050500021E8C0031400BF8F1000BE8F1800BD275B\r\n' USB受信● b'SET:80005050\r\n' S0880005060000800E00300000000 32チェックサム: 0 USB受信● b'S0880005060000800E0030000000032\r\n' USB受信● b'SET:80005060\r\n' S1080005068004C4544204F4E2F4F46460D0A00000000 89チェックサム: 0 USB受信● b'S1080005068004C4544204F4E2F4F46460D0A0000000089\r\n' USB受信● b'SET:80005068\r\n' S10800050780000000000222222222222222222222222 20チェックサム: 0 USB受信● b'S1080005078000000000022222222222222222222222220\r\n' USB受信● b'SET:80005078\r\n' R008000500000 61チェックサム: 0 実行スタートの Enter >> USB受信● b'R00800050000061\r\n' USB受信● b'START:80005000\r\n' USB受信● b'LED ON/OFF\r\n' 終了確認の Enter >>>
上記では、「python Instruct.py」と実行すると、command.txtファイル内容の命令を
[UMEHOSHI ITA]へ転送しています。
このファイル内の'R'から始まる命令行がある所で、「実行スタートの Enter >>」のキー入力で一時停止します。
ここで、Enterキー入力で、この'R'から始まる'R00800050000061\r\n'が送信され、
[UMEHOSHI ITA]で80005000番地からの実行を始めます。
その実行で、'LED ON/OFF\r\n'の受信文字列を表示しています。