Python读取串口字节转hex失败无法退出while循环如何解决
故障原因
你的代码有3个核心问题,导致永远无法退出循环:
- 循环判断逻辑完全写反:原条件
some_hex_val != 0x0b or some_hex_val != 0x40永远成立——一个字节不可能同时等于两个不同的值,不管读到什么内容,这个判断结果永远是True,循环根本不可能触发退出。正确逻辑应该是:当读到的字节既不是0x0b也不是0x40时,才继续读取下一字节,这里逻辑运算符必须用and而不是or。 - 数据类型不匹配:你一开始给
some_hex_val赋的是整数类型的0x00,但Python里bytes对象调用.hex()返回的是小写格式的十六进制字符串——比如读到0x0b会返回字符串'0b',读到0x40会返回字符串'40',拿整数和字符串做相等判断,永远不可能匹配成功。 - 空读场景没做处理:pyserial的
read()方法如果没配置超时、串口缓冲区暂时没数据时,会返回空字节对象b'',这时候调用.hex()会得到空字符串。你之前观察到的“调用.hex()无有效输出”不是方法返回None,是循环条件恒真导致代码根本走不到后续的打印步骤。
你担心0x0b是不可见控制字符无法直接输入做匹配,这个顾虑完全没问题,用
.hex()转成字符串后再比对的思路是可行的,不需要直接输入不可见控制字符。
可直接运行的修正代码
首先给串口配置加1秒超时,避免无数据时永久阻塞,再修正循环逻辑和类型匹配:
loadcell.reset_input_buffer() # 配置串口读超时,单位为秒,避免无数据时永久卡死 loadcell.timeout = 1 def read_thrust(): while True: # 每次读取1个字节 read_byte = loadcell.read(1) # 跳过空读的异常情况 if len(read_byte) != 1: continue # 转为十六进制字符串后和目标值比对 hex_str = read_byte.hex() if hex_str == '0b' or hex_str == '40': break print('Exited while') read_thrust()
如果你需要匹配连续两个停止位标识0x40后紧跟0x0b作为完整帧结束标记,避免单字节匹配出现误判,可以用下面的逻辑:
loadcell.reset_input_buffer() loadcell.timeout = 1 def read_thrust(): # 缓存前一个读到的字节的十六进制值 last_hex = '' while True: read_byte = loadcell.read(1) if len(read_byte) != 1: continue current_hex = read_byte.hex() # 匹配到连续的0x40 + 0x0b停止位标识 if last_hex == '40' and current_hex == '0b': break last_hex = current_hex print('Exited while, got end flag') read_thrust()
内容的提问来源于stack exchange,提问作者bmw-m8
相关产品推荐
相关产品推荐

