Python串口原始字节传输异常问题求助
问题原因与解决办法
核心问题
你的问题不是serial.read()的问题,而是把bytes对象转成字符串时的默认转义行为导致的显示差异:
- 你发送的第1字节是十进制10,对应ASCII码的换行符
\n,Python把bytes转成str时会自动将0x0A(十进制10)显示为\n; - 第5字节是十进制50,对应ASCII码的字符
2,所以转成字符串后直接显示为2; - 全0xFF时,因为0xFF不属于可打印ASCII字符,Python会用
\xff来表示,和hterm的十六进制显示一致,所以看起来正常。
hterm是按原始字节的十六进制值显示,而Python的str(bytes)会将可打印ASCII字节转换为对应的字符,非可打印字节用转义序列表示,这才是显示差异的根源。
解决方式
直接操作原始的bytes对象,或者将bytes转换为十六进制字符串来查看,避免默认的ASCII转义:
修改后的示例代码
COM_Port = "COM5" Baudrate = 19200 SerialPort = serial.Serial(COM_Port,Baudrate,bytesize=8,parity=serial.PARITY_NONE,stopbits=1,timeout=None) while True: bytestream = SerialPort.read(8)#read 8 bytes # 方式1:转成十六进制字符串,和hterm显示一致 print(bytestream.hex()) # 方式2:逐个打印十进制字节值 print([byte for byte in bytestream]) # 后续处理直接用bytestream这个bytes对象即可,不要转成str # queue_in.put(bytestream)
说明
bytestream.hex()会把8字节转成连续的十六进制字符串,比如你发送的{10,1,0,0,0,50,0,0}会显示为0a01000000320000,和hterm的十六进制显示对应;[byte for byte in bytestream]会生成每个字节的十进制列表,输出[10, 1, 0, 0, 0, 50, 0, 0],和你发送的原始数据完全一致;- 后续处理数据时,直接使用
bytestream这个bytes对象,通过索引访问单个字节(比如bytestream[0]就是第1字节的十进制值),不需要转换成字符串。
内容的提问来源于stack exchange,提问作者user23520951
相关产品推荐
相关产品推荐

