Python-PythonまたはMicropythonに基づく上位コンピューターと下位コンピューター間の通信に適したプロトコル

ブロガーが使用するのが好きなシングルチップマイクロコンピューターはmicropythonに基づいて開発されているため、それらはすべてpythonプログラミングを使用しており、python間のデータ形式と互換性があります。同時に、PYBとRaspberry Pi間のシリアル通信に基づいて、通信データの形式を標準化する必要があります。タプルは、Pythonでメモリフットプリントが最小のマルチデータストレージ形式であるため、リストや辞書などよりも優れた選択肢と言えます。したがって、このブログは、通信の主要なデータ形式としてタプルに基づいています。

通信プロセスをシミュレートするためのローカル変換フォーマット

ここでは、PYBのデータをタプルにパックし、改行文字を使用して文字列形式に変換してから、エンコード変換を実行し、UARTシリアル通信を介してホストコンピューターの受信側に送信する必要があります。
ホストコンピュータでは、最初に受信したデータの行全体をデコードしてから、次にデコードする必要があります。

# 源数据
tp = (1, (2,3), 5)
# 测试eval()函数,python内置的eval函数可以将列表、元组格式的字符串转换回原格式。
n = eval(str(tp))
print(n, type(n))
# 编码
n1 = str(n) +"/n"
a = n1.encode("utf-8")

# 上位机端接收到编码后的数据,进行解码操作
a.decode("utf-8")
print(a, type(a))
# 转换回元组格式
a = str(a)[2:-3]
print(a, type(a))
b = eval(a)
print(b, type(b))

# 判断最终的格式是否为元组,且和原来相同
if type(b) == tuple:
    print("is tuple")

実行結果表示

ここに画像の説明を挿入

コード操作に問題がないことを示しています。では、実際のマシン通信プロセスに進みましょう。

PYBとRaspberryPi間の通信により、タプルデータの相互送信が実現します

PYBとRaspberryPiの間の通信に気付いていない場合は、最初にブログ読んでくださいRaspberry PiのGPIOに基づくMicropython-UARTシリアル通信。このデモを実行した後、タプルデータの相互送信のステップに入ります。

コードをアップロードするだけで、最終的なレンダリングを確認できます。コードをコピーして実行するだけです。

ホストコンピューター(Raspberry Pi)

# -*- coding:utf-8 -*-
import serial
import time
ser = serial.Serial("/dev/ttyAMA0", 115200)
ser.flushInput()  
ser.write("begin".encode("utf-8")) 

tp = (12,34, (56,78), 910)

def main():
    while True:
        count = ser.inWaiting() 
        if count != 0:
            recv = ser.read(count) 
            #ser.write("I'm raspberry pi!".encode("utf-8")) 
            ser.write(str(tp).encode("utf-8"))   
            ser.write("\n".encode("utf-8"))  
            try:
                print(ser.readline())
            except:
                pass
            ser.flushInput()

 
if __name__ == '__main__':
    main()

下のコンピューター(ここではPYBが使用されます)

import utime
import serial
from pyb import UART


class Serial:
    def __init__(self, uart):
        self.uart = uart

    def data_check(self):
        '''
        函数功能:返回串口接收状态
        '''
        return self.rev_data()

    def send_data(self, data="hi i'm pyboard!\n"):
        '''
        函数功能:串口发送数据
        入口参数:需要发送的打包好的数据(字符串格式)
        '''
        if type(data) != str:
            data = str(data)
        data.encode("utf-8")
        self.uart.write(data)

    def rev_data(self):
        '''
        函数功能:读取上位机发送的运动控制指令
        入口参数:
        返回值  :接收到的数据
        '''
        start = utime.ticks_ms()
        data = self.uart.readline()
        if data != None:
            # print("get data!!!!!")
            try:
                data = self.analysis_data(data)
            except:
                pass
            end = utime.ticks_ms()
            print("running time:", end - start)
            print(data)    
            return True
        else:
            return False
    
    def format_data(self, motion=0, angle=0, encoders=(0,0), imu=(0,0,0)):
        '''
        函数功能:将需要发送的所有数据封装起来
        入口参数:
        返回值  :封装后的数据元组
        '''
        data = (motion, angle, encoders, imu)
        return str(data + "\n")
    
    def analysis_data(self, data):
        data.decode("utf-8")
        data = str(data)[2:-3] # 将 “\n” 和 b'' 去除
        data = eval(data) # 转化回元组形式
        print(type(data))
        return data
        
uart = UART(2, 115200)
ser = serial.Serial(uart)
while True:
	ser.rev_data()

PYB受信

ここに画像の説明を挿入

参考記事:

おすすめ

転載: blog.csdn.net/qq_45779334/article/details/112797226