UMEHOSHI ITA TOP PAGE    COMPUTER SHIEN LAB

[UMEHOSHI ITA]の制御で使っているIC「PIC32MX270F256B-I/SO」のフラッシュメモリには、テスト用プログラムが書き込まれいています。
これを利用したユーザー用のプログラムを「ウメ・エディットプログラム」と呼ぶことにします。
「ウメ・エディットプログラム」の開発では「umehoshiEditツール」が必要で、 その取得や最初の操作情報は、こちらを参照してください。
(他に、アセンブラページ(現在作成中)で作ることもできます。)

PC側のpythonで「UMEHOSHI ITA」へプログラムを送り実行

以下では、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]に送信して制御する。

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入力処理を別スレッド行っています。
そしてキー入力文字列を、USBのserialへ出力する繰り返しを行っています。
(下記「G1080004000006C」がキー入力した部分で、0x80004000番地のメモリ表示指示です)
(base) >python sendtest.py
>>>G1080004000006C
b'G1080004000006C\r\n'
b':108000400000F0B2009D34A6009D00000000C7580000D0\r\n'
>>>
(キー入力でEnterだけを入力するか。または10秒以上入力しないと受信スレッドが終わります。)

「umehoshiEditツール」などで作った「UME専用Hexファイル」をPythonプログラムで転送・実行する

上記では「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'の受信文字列を表示しています。