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

Micropython(PICO)负载检测放大器驱动位操作报错求解

解决Micropython适配负载检测放大器驱动时的位操作类型错误

问题场景

把负载检测放大器的驱动从smbus替换为Micropython的machine.I2C后,执行位位移操作时触发类型不兼容错误。

原代码

# Mask & set a given bit within a register
def setBit(self, bitNumber, registerAddress):    # Mask & set a given bit within a register
    value = self.getRegister(registerAddress)
    value |= (1 << bitNumber)    # Set this bit
    return self.setRegister(registerAddress, value)

报错信息

TypeError: unsupported types for __or__: 'bytes', 'int'

问题原因

getRegister()方法返回的是bytes类型数据,而位运算(|、<<)只能对整数类型操作,两者类型不兼容导致报错。

修复方案

先把读取到的bytes转成整数,完成位操作后再转回bytes(如果setRegister要求传入bytes类型的话):

修改后的代码

# Mask & set a given bit within a register
def setBit(self, bitNumber, registerAddress):
    # 将读取到的bytes转为整数,注意根据器件手册选择字节序(little/big)
    reg_value = int.from_bytes(self.getRegister(registerAddress), byteorder='little')
    # 执行位设置操作
    reg_value |= (1 << bitNumber)
    # 将整数转回1字节的bytes,写入寄存器
    return self.setRegister(registerAddress, reg_value.to_bytes(1, byteorder='little'))

关键说明

  • 字节序选择:多数I2C器件使用小端字节序(little),如果你的放大器器件手册指定大端,就改成byteorder='big'。
  • 多字节适配:如果寄存器是多字节宽度,比如2字节,要把to_bytes的第一个参数改成对应字节数(比如2),确保数据长度匹配。

内容的提问来源于stack exchange,提问作者Ryan Barrett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 22:00:58