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

USB转I2C适配器B0CFK14PVS与PCF8574 Windows下通信故障求助

问题分析与解决方案

核心问题拆解

你遇到的问题本质是树莓派原生I2C总线操作逻辑,无法直接套用到RS232转I2C模块上:树莓派可以直接控制I2C电平信号,但Windows下的RS232转I2C模块(B0CFK14PVS)需要接收特定格式的串口命令,才能将串口指令转换为I2C总线操作。你的代码直接模拟I2C起始/停止信号的字节(\x02/\x03),模块无法识别,自然无法通信。

此外代码本身还有几处明显错误:

  1. 循环打印笔误:print ("i " + str (1))应为print("i " + str(i))
  2. PCF8574写入逻辑错误:PCF8574是8位端口,需将8个bit拼成1字节发送,而非发送8个字节的列表
  3. 串口初始化缺少关键参数:未设置奇偶校验、停止位、超时等模块要求的参数

分步解决方案

1. 先确认RS232转I2C模块的通信协议

必须找到该模块的官方指令文档,不同厂商的RS232转I2C模块命令格式差异极大,常见格式示例:

  • 写操作命令帧:[起始符] [操作码(写)] [I2C设备地址左移1位+写位] [数据长度] [数据字节] [结束符]
  • 例如某模块用0xAA作为起始符,0x00为写操作码,0x0D为结束符,命令格式为:0xAA 0x00 0x40 0x01 0x00 0x0D(对应地址0x20的PCF8574写入0x00)

如果找不到官方文档,可用串口助手(如SSCOM)手动发送测试命令,验证模块响应逻辑。

2. 修正后的Python代码示例

以下代码基于通用RS232转I2C模块协议编写,需根据你的模块指令格式调整命令帧:

import serial
import time

# 设备管理器中确认正确的COM口
port = "COM1"
baud_rate = 115200
# 按模块要求设置串口参数(通常为8N1)
ser = serial.Serial(
    port=port,
    baudrate=baud_rate,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=1  # 添加超时避免阻塞
)
pcf8574_address = 0x20  # 根据A0-A2接线调整

def pcf8574_write(output_byte):
    """向PCF8574写入1字节数据,需替换为你的模块命令格式"""
    # 示例命令帧(需根据模块文档修改)
    command = bytearray([
        0xAA,  # 模块命令起始符
        0x00,  # I2C写操作码
        (pcf8574_address << 1) | 0x00,  # I2C写地址(左移1位+写位0)
        0x01,  # 数据长度(PCF8574仅需1字节)
        output_byte,  # 要写入的8位端口值
        0x0D   # 命令结束符(回车)
    ])
    ser.write(command)
    # 可选:读取模块响应,调试用
    response = ser.read(ser.in_waiting)
    if response:
        print(f"模块响应: {response.hex()}")

def write_coils(vector):
    """将8位继电器状态转换为PCF8574的输出字节"""
    try:
        # PCF8574通常为灌电流输出,低电平触发继电器,这里反转输入状态
        output_byte = 0
        for bit in reversed(vector):
            output_byte = (output_byte << 1) | (1 - bit)
        print(f"待写入字节: 0x{output_byte:02X}")
        pcf8574_write(output_byte)
    except Exception as e:
        print(f"write_coils错误: {str(e)}")

# 主循环,交替切换继电器状态
try:
    while True:
        write_coils([1,0,1,0,1,0,1,0])
        time.sleep(0.5)
        write_coils([0,1,0,1,0,1,0,1])
        time.sleep(0.5)
finally:
    ser.close()  # 程序结束时关闭串口

3. 硬件与调试排查

  • 串口驱动与端口检查:确认CH341SER驱动安装正常,设备管理器中COM口无黄色感叹号,且端口号与代码一致
  • 硬件接线验证:确认PCF8574的A0-A2接线对应地址0x20,继电器板电源、信号线连接正确
  • 串口助手调试:先用串口助手发送手动构造的写命令,验证继电器是否动作,确认协议正确后再写入代码

内容的提问来源于stack exchange,提问作者F Casian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:57:06