Python 串口数据打包与解析

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对字节流按照用户设定的格式进行解析,如下
在这里插入图片描述

  • 4
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例代码,演示了如何在OpenMV上接收来自K210芯片串口打包数据: ```python import sensor, image, time, pyb # 初始化串口 uart = pyb.UART(3, 115200) while(True): # 读取串口数据 data = uart.read(8) # 假设数据长度为8字节 # 检查是否接收到完整的数据包 if data is not None: # 解析数据 # 假设数据格式为:[start_byte, data1, data2, ..., dataN, end_byte] start_byte = data[0] end_byte = data[-1] payload = data[1:-1] # 检查起始字节和结束字节是否正确 if start_byte == 0xAA and end_byte == 0xBB: # 处理数据 # 在这里添加你的代码,根据需要处理payload数据 # 打印接收到的数据 print(payload) # 延时一段时间,避免CPU占用过高 time.sleep(10) ``` 此示例代码使用了OpenMV自带的`pyb`模块来进行串口通信。首先通过`pyb.UART()`初始化串口对象,参数`3`表示使用UART3,`115200`表示波特率为115200。然后在一个无限循环中,使用`uart.read()`读取串口数据。如果读取到了完整的数据包(假设数据长度为8字节),则进行数据解析和处理。在这个示例中,假设数据包的格式为`[start_byte, data1, data2, ..., dataN, end_byte]`,其中起始字节为`0xAA`,结束字节为`0xBB`,有效数据为`payload`。你可以根据你的需求修改数据格式和处理逻辑。最后,通过`print()`函数打印接收到的数据。 请注意,此示例代码仅供参考,你需要根据实际情况进行适当的修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值