Python 串口数据打包与解析

  • 介绍
  • 从字符串到字节流
  • 对字节流的解析


介绍

通常用python写好上位机要与板子通过串口通信的时候(比如命令,参数等),对于这之间的数据格式转换是有特定要求的,比如上位机到板子之间是以字节流进行数据传输,而用户输入到上位机的数据通常是字符串;当接收数据时,又需要将字节流进行相应格式的组合解析。

从字符串到字节流

法1:使用bytes(arg)函数,因为参数arg需要时列表[ ]类型,所以需要将传入的数据进行转换,直接上代码,如下:

python的I2C测试上位机串口 python 串口上位机_串口通信


解析:

  • input():获取用户输入的参数,不过此时是字符串的格式
  • split() :以空格为间隔,对该字符串进行分割,转成了列表类型,不过内容都是字符串
  • int() :利用int()函数将list列表里的内容转为整型
  • bytes() :此函数可以直接将内容转化为字节流的类型,这样就可以使用python的serial.write发送数据

法2:使用python的库struct,具有打包和解包的功能,代码如下

python的I2C测试上位机串口 python 串口上位机_python的I2C测试上位机串口_02


struct.pack(fmt,arg1,arg2,),在传入有限个参数(命令,地址,数据长度)进行打包是很好用的,包括对字节流的解析也会用到它关于它的使用建议好好看看,可以参考这个python struct详解以上介绍了两种方法,优缺点如下,二者可以混合使用,以求到达最好效果

python的I2C测试上位机串口 python 串口上位机_python的I2C测试上位机串口_03

对字节流的解析

接收串口发来的数据时,一般时一个字节一个字节传来的,我们可以每读取一个字节就将其存入一个列表中,格式类似如下:

python的I2C测试上位机串口 python 串口上位机_python_04


注意:列表里面都是bytes对象,为了将其解析,需要先转换为int型

data = int.frombytes(m[0] , ‘big’)

关于int.frombytes()函数的用法可以去查查,作用就是将一个bytes类型的数据转换为int类型转换后的m如下:

python的I2C测试上位机串口 python 串口上位机_串口通信_05


因为struct.unpack()函数是针对字节流处理的,故需要将m由一个列表类型转换为字节流

python的I2C测试上位机串口 python 串口上位机_串口通信_06


就能用struct.unpack对字节流按照用户设定的格式进行解析,如下

python的I2C测试上位机串口 python 串口上位机_字符串_07