Python 串口数据打包与解析
- 介绍
- 从字符串到字节流
- 对字节流的解析
介绍
通常用python写好上位机要与板子通过串口通信的时候(比如命令,参数等),对于这之间的数据格式转换是有特定要求的,比如上位机到板子之间是以字节流进行数据传输,而用户输入到上位机的数据通常是字符串;当接收数据时,又需要将字节流进行相应格式的组合解析。
从字符串到字节流
法1:使用bytes(arg)函数,因为参数arg需要时列表[ ]类型,所以需要将传入的数据进行转换,直接上代码,如下:
解析:
- input():获取用户输入的参数,不过此时是字符串的格式
- split() :以空格为间隔,对该字符串进行分割,转成了列表类型,不过内容都是字符串
- int() :利用int()函数将list列表里的内容转为整型
- bytes() :此函数可以直接将内容转化为字节流的类型,这样就可以使用python的serial.write发送数据
法2:使用python的库struct,具有打包和解包的功能,代码如下
struct.pack(fmt,arg1,arg2,),在传入有限个参数(命令,地址,数据长度)进行打包是很好用的,包括对字节流的解析也会用到它关于它的使用建议好好看看,可以参考这个python struct详解以上介绍了两种方法,优缺点如下,二者可以混合使用,以求到达最好效果
对字节流的解析
接收串口发来的数据时,一般时一个字节一个字节传来的,我们可以每读取一个字节就将其存入一个列表中,格式类似如下:
注意:列表里面都是bytes对象,为了将其解析,需要先转换为int型
data = int.frombytes(m[0] , ‘big’)
关于int.frombytes()函数的用法可以去查查,作用就是将一个bytes类型的数据转换为int类型转换后的m如下:
因为struct.unpack()函数是针对字节流处理的,故需要将m由一个列表类型转换为字节流
就能用struct.unpack对字节流按照用户设定的格式进行解析,如下