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
相关产品推荐
相关产品推荐

