首页 > 解决方案 > Dotnet iot System.Device.Gpio 无法使用输出模式打开引脚

问题描述

我正在尝试在 .NET Core 上使用 System.Device.Gpio 为 PinMode.Output 打开一个引脚,然后想为这个引脚写入一个值,但我得到一个异常,这表明该引脚不是为输出模式打开的,而写入是不允许这样做。

我的代码是:

    [HttpGet("{pinNumber}/{inputPinValue}")]
    public async Task<IActionResult> SetPin(int pinNumber, string inputPinValue)
    {
        PinValue value = inputPinValue == "high" ? PinValue.High : PinValue.Low;

        var controller = new GpioController(PinNumberingScheme.Logical, new GpioDriverMock());
            controller.OpenPin(pinNumber, PinMode.Output);
            controller.Write(pinNumber, value);


        var result = JsonConvert.SerializeObject($"Pin value is {value}");

        return StatusCode(200, result);
    }

例外情况是:
System.InvalidOperationException:无法写入未设置为输出模式的引脚。在 System.Device.Gpio.GpioController.Write(Int32 pinNumber,PinValue 值)

我还有一个单独的方法,它只读取一个引脚值并且工作正常(引脚模式是输入作为默认模式)

只是为了解释:

GpioDriverMock - 是一个模拟驱动程序以便能够在 Win 10 上调试应用程序的类。这个应用程序的目标环境是带有 Docker 的 Raspberry Pi,所以我在将应用程序转移到 Raspberry 之前删除了创建这个模拟类实例。

当我在目标 Raspberry 上运行此应用程序时,它也不起作用并返回相同的异常。

标签: .net-coreoutputgpiomoderaspberry-pi4

解决方案


这个样本对你有用吗?如果不是,那么还有其他问题。

https://github.com/dotnet/iot/blob/master/samples/led-blink/Program.cs

当不在容器中运行时,您的代码是否有效?在某些情况下,容器需要在特权模式下运行才能使用 GPIO 或其他引脚。


推荐阅读