在Raspberry Pi的 I²C通信中,使用PCF8574 LCD时出现System.IO.IOException错误121(.NET)

编程语言 2026-07-10

我正在尝试将树莓派通过I²C连接到带有焊接HW-61板的Midas MCOB21605G1V-EYP显示屏。

HW-61板的VCC引脚连接到一个Wago分线连接器。该连接器有一根来自5V电源的线,另一根线通往Whadda WPI410电平转换器。

HW-61板的GND引脚也连接到另一个Wago分线连接器(不同的一个)。这个连接器有三根额外的GND线:一根来自树莓派,一根来自电源,一根来自Whadda WPI410电平转换器。

HW-61板的SDA和 SCL引脚连接到电平转换器上的相应引脚。在低压侧,电平转换器已经正确连接至树莓派。

如标题所述,我遇到了错误: “System.IO.IOException: Error 121(远程I/O错误)在执行I²C数据传输时。”

不过,I²C地址是正确的,并且树莓派上的I²C已启用。

代码:

using Iot.Device.CharacterLcd;
using Iot.Device.Pcx857x;
using se24_lite_display_manager.Models;
using System.Device.Gpio;
using System.Device.I2c;

namespace se24_lite_display_manager.Services
{
    public class DisplayDriver
    {
        private Lcd1602? _lcd;
        private readonly LiteDisplayManagerSettings _settings;
        private readonly ILogger<DisplayDriver> _logger;

        public DisplayDriver(LiteDisplayManagerSettings settings, ILogger<DisplayDriver> logger)
        {
            _settings = settings;
            _logger = logger;

            Start();
        }

        private void Start()
        {
            _logger.LogInformation("Starting the display...");

            try
            {
                var i2cConnection = new I2cConnectionSettings(busId: 1, deviceAddress: 0x27);
                var i2cDevice = I2cDevice.Create(i2cConnection);
                var driverPcf = new Pcf8574(i2cDevice);

                var gpioController = new GpioController(driverPcf);

                _lcd = new Lcd1602(
                    registerSelectPin: 0,
                    enablePin: 2,
                    dataPins: new int[] { 4, 5, 6, 7 },
                    backlightPin: 3,
                    readWritePin: 1,
                    controller: gpioController
                );

                _lcd.Clear();
                _lcd.Write("Hello World");
            }
            catch (Exception ex)
            {
                _logger.LogError($"{ex}");
                _lcd = null;
            }
        }
    }
}

解决方案

我不记得遇到过这个具体的错误,所以这不是一个简单的连接问题。但你的代码看起来没有道理,因为你先初始化了Pcf8574,但随后却从未使用它,而是以并行访问模式初始化显示(使用GPIO控制器)。

第一:我假设异常发生在 new Pcf8574() 调用处,因为那是唯一会进行I²C通信的地方。第二:Pcf8574是一个I²C GPIO扩展器,可能并不是你用来连接显示屏的设备。第三:Lcd1602类已经包含对常见I²C接口芯片的支持(包括你使用的那个,我相信)。所以你需要做的只有如下:

var i2cConnection = new I2cConnectionSettings(busId: 1, deviceAddress: 0x27);
var i2cDevice = I2cDevice.Create(i2cConnection);

_lcd = new Lcd1602(i2cDevice, true); // Depending on your chip, you might need to try false as the second argument

_lcd.Clear();
_lcd.Write("Hello World");
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章