Python I2C SMBus向OLED发数据遇TypeError错误求助
解决I2C OLED设备通信中的TypeError问题
问题根源
报错明确指出write_i2c_block_data的第三个参数必须是1-32个整数组成的列表,而你打印的第二个命令序列中存在浮点数7.0,这是触发类型错误的直接原因——I2C设备命令仅接受整数格式的指令字节。
解决方案
1. 从源头修正参数类型
找到生成该命令序列的代码位置,排查浮点数产生的原因并修正:
- 如果是除法运算得到
7.0,将普通除法/改为整数除法//,或者对结果做强制整数转换:int(计算结果)。 - 如果是手动传入的参数,直接把
7.0替换为整数7。
2. 给命令方法加参数校验(可选)
为避免后续再出现类似类型问题,可在device.py的command方法中添加参数转换和校验逻辑,确保所有指令都是整数:
def command(self, *cmd): # 将所有参数转换为整数,过滤非数字类型 cmd_list = [] for val in cmd: if isinstance(val, (int, float)): cmd_list.append(int(val)) else: raise TypeError(f"Command value {val} must be integer or float") # 校验参数数量合法性 if len(cmd_list) < 1 or len(cmd_list) > 32: raise ValueError("Command list must contain 1-32 integers") self.bus.write_i2c_block_data(self.addr, self.cmd_mode, cmd_list)
验证步骤
修改后重新运行代码,检查打印的命令参数序列,确保所有元素都是整数(比如第二个序列变为(33, 0, 127, 34, 0, 7)),此时write_i2c_block_data即可正常执行,不会再触发TypeError。
内容的提问来源于stack exchange,提问作者james
相关产品推荐
相关产品推荐

