
在Python中通过serial库向微控制器发送含ASCII扩展字符和十六进制转义序列(如\xAE、\xC7\xB4)的AT指令时,必须确保传入write()方法的是bytes对象而非字符串,否则会触发TypeError。
在python中通过serial库向微控制器发送含ascii扩展字符和十六进制转义序列(如\xae、\xc7\xb4)的at指令时,必须确保传入`write()`方法的是`bytes`对象而非字符串,否则会触发typeerror。
在嵌入式串口通信开发中,常需向MCU或模组(如4G模块)发送包含非ASCII控制字符的AT指令——例如AT+CGMM\xC7\xB4\r中的\xC7\xB4代表特定厂商扩展指令的二进制字节。但Python 3严格区分str(Unicode文本)与bytes(原始字节序列),而serial.Serial.write()仅接受bytes类型参数。若直接传入字符串(如'AT+CGMM\xC7\xB4\r'),将报错:TypeError: expected bytes, got str。
以下是三种经过验证的可靠处理方式,适用于Python 3.13.2及所有现代Python 3.x版本:
✅ 方法一:运行时编码(推荐用于动态/混合内容)
对已定义的Unicode字符串调用.encode(),明确指定编码格式(通常为'utf-8';若指令严格遵循ASCII+Latin-1扩展,也可用'latin-1'以确保\xC7等字节原样映射):
import serial
command = {
"cmd_a": 'AT\r',
"cmd_b": 'AT+HTTPINIT\xAE\r',
"cmd_c": 'AT+CGMM\xC7\xB4\r',
}
comport = serial.Serial("/dev/ttyUSB0", 115200, timeout=1)
cmd_to_send = command.get("cmd_c")
if isinstance(cmd_to_send, str):
comport.write(cmd_to_send.encode('latin-1')) # ✅ 关键:latin-1保证\xXX字节1:1转换
⚠️ 注意:
'utf-8'对\xAE等单字节扩展码点可能生成多字节序列(如\xAE在UTF-8中非法),故强烈建议使用'latin-1'编码——它将每个0x00–0xFF字节直接映射为对应Unicode码点,完美兼容AT指令中的十六进制字节。
✅ 方法二:字面量定义为bytes(推荐用于静态指令集)
在字典初始化时直接使用b''前缀声明字节字符串,避免运行时转换开销且语义清晰:
command = {
"cmd_a": b'AT\r',
"cmd_b": b'AT+HTTPINIT\xAE\r', # \xAE → 单字节0xAE
"cmd_c": b'AT+CGMM\xC7\xB4\r', # \xC7\xB4 → 连续两字节0xC7 0xB4
}
cmd_to_send = command.get("cmd_c")
if isinstance(cmd_to_send, bytes):
comport.write(cmd_to_send) # 直接写入,零额外转换
✅ 方法三:显式构造bytes对象(灵活性高)
使用bytes(string, encoding)构造,逻辑同方法一,但显式强调类型意图:
cmd_to_send = command.get("cmd_c")
if isinstance(cmd_to_send, str):
comport.write(bytes(cmd_to_send, 'latin-1'))
? 验证与调试技巧
发送前可通过print(repr(cmd_to_send))检查类型与内容:
print(repr(command["cmd_c"])) # 若为str → 'AT+CGMM\xc7\xb4\r'
print(repr(command["cmd_c"].encode('latin-1'))) # → b'AT+CGMM\xc7\xb4\r'
同时建议添加基础错误防护:
try:
comport.write(cmd_to_send if isinstance(cmd_to_send, bytes)
else cmd_to_send.encode('latin-1'))
except (TypeError, serial.SerialException) as e:
print(f"Serial write failed: {e}")
总结:处理含十六进制转义的AT指令时,核心原则是确保最终写入串口的数据为bytes类型;优先选用'latin-1'编码(而非UTF-8)可100%保真还原\xXX字节,这是与底层硬件通信稳定性的关键保障。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











