You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 00:36:18