一、需求描述
现有一单片机在通过串口向外发送数据,需要使用Python编写程序进行数据的接收,并根据自定义的协议进行报文的解析。
二、自定义协议
因为单片机在通过串口发送数据时,是以字节为单位进行发送,对于接收方来说,收到的是一个字节一个字节的数据,这就引出了一个问题:接收方怎么知道当前收到的字节数据在原数据中属于哪一部分?
打一个通俗的比方。现在,我们在商场里买了一张大床,但是,因为家门太窄,需要将床先拆成一块块木板,等搬到屋内以后,再进行组装还原。
此时,“床”是需要通过串口发送的数据,而“家门”连接着双方串口的发送端和接收端,“一块块木板搬进房中”是按字节发送数据的过程,而“组装还原”则是接收端对收到的数据进行解析,提取出需要的数据或将数据恢复原样。
为了在组装时能够顺利,需要清楚每一块木板所属的位置,因此,声明了自定义的协议。关于自定义协议,可参考文末的链接进行学习理解。
三、Python读取串口的源码
import serial# 进行串口内容的读取(一次可以读到一个字节的数据)
def recv_data(ser):while True:data = ser.read()# 没读到就接着尝试读,读到了就退出循环并return读取到的内容if data =='':continueelse:breakreturn data# 主函数
if __name__ == '__main__':ser = serial.Serial('COM1',115200,timeout=0.5) # 设置COM口、波特率以及超时参数if ser.isOpen():print('串口打开成功')else:print('串口打开失败')while True:data = recv_data(ser) # 进行串口数据的读取# 如果读到了数据,就进行处理if data !='': """这一块内容是根据自定义协议的内容对本次读取的字节数据进行解析具体包括包头与包尾的判断,数据帧的解析等可参考文末的链接进行学习理解,并使用Python进行处理过程的仿写"""
四、参考链接
本节内容中关于报文解析的部分可参考以下链接进行学习与理解:
STM32入门教程-2023版 细致讲解 中文字幕 [9-4] USART串口数据包
STM32入门教程-2023版 细致讲解 中文字幕 [9-5] 串口收发HEX数据包&串口收发文本数据包