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

Python 3串口发送动态二进制数据问题求助

Python 3 动态构建串口二进制数据发送方案

问题背景

需要通过Python 3串口发送动态构建的二进制数据,已知固定字节序列写法可行:

command = b'\x02\xF6\x44\x46\x31\x03\x3B\x36'
ser.write(command)

但字节序列需根据用户输入或文件数据动态生成,Python 2中习惯将整数列表转成字符串发送:

command_data = [2, 246, 68, 70, 49, 3, 59, 54]
command = ""
for i in range(len(command_data)):
    command += chr(command_data[i])
ser.write(command)

Python 3中尝试用ser.write(bytes(command, 'utf-8'))转换后,发现整数246(对应\xf6)被转成\xc3\xb6双字节序列,导致传输错误。

错误原因

Python 3中字符串是Unicode编码,bytes(command, 'utf-8')会将字符串按UTF-8规则编码。而246对应的Unicode字符ö在UTF-8中是双字节\xc3\xb6,但串口需要的是原始单字节二进制值,编码转换破坏了原数据。

正确实现方法

直接利用Python 3的bytes()构造函数,传入0-255范围的整数列表,即可生成对应的原始字节序列:

方法1:直接转换整数列表

command_data = [2, 246, 68, 70, 49, 3, 59, 54]
command = bytes(command_data)  # 整数列表直接转为字节序列
ser.write(command)

此方法生成的字节序列与固定写法b'\x02\xF6\x44\x46\x31\x03\x3B\x36'完全一致。

方法2:动态逐字节构建(适合实时生成场景)

如果需要逐个添加字节,可使用bytearray(可变字节序列):

command = bytearray()
# 逐个添加字节
command.append(2)
command.append(246)
# 或循环添加整数列表
for num in command_data:
    command.append(num)
ser.write(command)

说明

bytes()和bytearray()处理整数时,会直接将每个整数映射为单字节二进制值(范围0-255),完全跳过编码转换,确保串口传输的是原始二进制数据。

内容的提问来源于stack exchange,提问作者Romano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:52:36