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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:43:28