Python串口通信中如何将int/float写入bytearray指定位置
4字节高度值填充实现方法
核心实现逻辑
接收端要求的4字节整数传输,直接用Python内置的整数转字节方法就行,不用手动移位、按位与拆分字节,能避免手动计算出问题:
- 先统一数值类型:不管altitude传进来是整数还是浮点数,先转成整数,要直接截断小数就用
int(),要四舍五入就套round() - 确认字节序:绝大多数工业串口协议默认用小端序(低字节存在靠前的索引位,也就是索引6放最低位字节),如果接收端明确要求大端序,改对应参数就行
- 直接给bytearray的预留切片位置赋值,不用逐个下标写值
- 顺手改下你原代码里的两个bug:
- 原代码重复给索引17、19赋值,漏了索引18的赋值,虽然bytearray初始化默认是0不影响结果,但属于笔误
- 原代码算校验和的时候写了
check_sum % 256但没把结果赋值回变量,最后check_sum会超过255,往字节位赋值的时候直接报错
可直接运行的修正代码
import serial ser = serial.Serial('COM16', 19200, serial.EIGHTBITS, serial.PARITY_NONE, serial.STOPBITS_ONE) size = 78 array1 = bytearray(size) altitude = 2800.0 # 固定帧头 array1[0] = 0xFF array1[1] = 0xFF array1[2] = 0x54 array1[3] = 0x52 array1[4] = 15 array1[5] = 27 # 填充索引6-9共4字节的高度位 # 如果传的是可能为负的有符号整数,把signed改成True alt_int = round(altitude) # 不需要四舍五入就换成int(altitude) array1[6:10] = alt_int.to_bytes(length=4, byteorder='little', signed=False) # 固定帧位 array1[74] = 1 array1[76] = 0x0D array1[77] = 0x0A # 计算校验和,记得把取模结果存回变量 check_sum = 0 for x in range(4, 75): check_sum += array1[x] check_sum %= 256 array1[75] = check_sum ser.write(array1)
结果校验
拿altitude=2800举例:
- 2800转十六进制是
0x00000AF0 - 小端序拆分后4个字节依次是
0xF0、0x0A、0x00、0x00,对应索引6到9的值,接收端按小端规则重组后算出来就是2800,完全匹配 - 如果测下来接收端解析的数值不对,把
byteorder='little'改成byteorder='big'再试就行,大概率是字节序不匹配。
内容的提问来源于stack exchange,提问作者Inertial Measurement Unit
相关产品推荐
相关产品推荐

