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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:31:01