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
相关产品推荐
相关产品推荐

