記事のディレクトリ
ブロガーが使用するのが好きなシングルチップマイクロコンピューターは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受信
参考記事:
- 文字列形式のリストをリストに変換する
このeval()
関数は本当に香りがよいです!!! 暗記する。 - Pythonの文字列操作(切片/置換/検索/セグメント)では
、小さな知識ポイントの多くは本当に忘れがちですが、それでもさらに確認する必要があります。