pythonを使用してstm 32シリアルポートをテストする


本文は在下の個人ブログblogに先発した.keysking.com
この間、あるプロジェクトがあって、stm 32で比較的に大きくて、比較的重い設備と頻繁なシリアル通信を行います.設備が移動するのが不便なので、スクリプトを書きたいです.設備の代わりに、stm 32の通信ロジックをテストします.
次のコードがあります.
# coding=utf-8
import serial
import threading
import csv
import random

identitys_csv = csv.reader(open('./identitys.csv','r'))
# identitys_csv = csv.reader(open('./identitys_less.csv','r'))
identitys = list()
ser = serial.Serial("COM13",9600)

askData = bytes([0xA0, 0x0D, 0x01, 0x8A, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0x00, 0x0A, 0xB4])



def receiveFunc():
    print("---------------    --------------")
    serData = bytes()
    while len(identitys) != 0:
        if ser.inWaiting() > 0 :
            out = ser.read(1)
            serData += out
            if len(serData) == 15:
                if serData == askData:
                    print("-------------      ------------")
                    num = random.randint(5,15)
                    if num > len(identitys):
                        num = len(identitys)
                    print("--------------  "+str(num)+"   ------------")
                    for identity in identitys[0:num]:
                        print(identity)
                        identityFormatData = transToFormat(identity)
                        ser.write(identityFormatData)
                        for i in identityFormatData:
                            print('0x%02x'%i,end=' ')
                        print("")
                    del identitys[0:num]
                else:
                    print("------------       -----------")
                    for i in out:
                        print('0x%02x'%i,end=' ')
                    print("")
                serData = bytes()
    print("---------------    --------------")

def transToFormat(identity):
    if identity[-1] == "X":
        identity = identity.replace("X",":")
    formatData = bytes([0xA0,0x13,0x01,0x8A,0x00,0x00,0x00])
    for i in range(len(identity)//2):
        temp = ((identity[2*i].encode('utf-8')[0] - 0x30) << 4) + (identity[2*i+1].encode('utf-8')[0] - 0x30)
        formatData += bytes([temp])
    formatData += bytes([0x00,0x00,0x00,0x00])
    checkSum = 0
    for i in formatData:
        checkSum += i
    checkSum = checkSum & 0x00FF
    checkSum = 0x100 - checkSum
    if checkSum == 256:
        checkSum = 0
    formatData += bytes([checkSum])
    return formatData

if __name__== '__main__':
    print("---------          --------")
    for i in identitys_csv:
        identitys.append(i[0])
    print("--------- "+str(len(identitys))+"     --------")

    receiveThread = threading.Thread(target=receiveFunc,name="receive")
    receiveThread.start()

主な役割はcsvファイルに存在する多くの身分証明書情報を取り出し、stm 32側からシリアルポートを介して要求情報(ackData)が送信されると、ランダムに5~15個の身分証明書情報を取り出し、一定のデータフォーマットでstm 32に送信することである.