Uwp 无法在Windows 10 Iot Core中打开(GPIO)引脚6

Uwp 无法在Windows 10 Iot Core中打开(GPIO)引脚6,uwp,raspberry-pi,gpio,windows-10-iot-core,Uwp,Raspberry Pi,Gpio,Windows 10 Iot Core,我想让我的彩虹帽的红色发光二极管发光。这要求我向车身控制模块6的针脚发送一个高电平信号 (短端)来源 /// <summary> /// Private singelton instance. /// </summary> private static RainbowHAT instance; /// <summary> /// Default instance of RainbowHAT. /// &

我想让我的彩虹帽的红色发光二极管发光。这要求我向车身控制模块6的针脚发送一个高电平信号

(短端)来源

    /// <summary>
    /// Private singelton instance.
    /// </summary>
    private static RainbowHAT instance;

    /// <summary>
    /// Default instance of RainbowHAT.
    /// </summary>
    public static RainbowHAT Default
    {
        get
        {
            if (instance == null)
            {
                instance = new RainbowHAT();
            }

            return instance;
        }
    }

    private RainbowHAT()
    {
        gpioController = GpioController.GetDefault();

        // Ensure that we have a valid gpio connection
        if (gpioController == null)
        {
            throw new OperationCanceledException("Operation canceled due missing GPIO controller");
        }

        Init();
    }


    public void PerformAction(RainbowHATAction action)
    {
        switch(action)
        {
            case RainbowHATAction.TurnOnRed:
                redPin.Write(GpioPinValue.High);
                break;

            case RainbowHATAction.TurnOffRed:
                redPin.Write(GpioPinValue.Low);
                break;

            case RainbowHATAction.LEDsOn:
                apa102.TurnOn();
                break;

            case RainbowHATAction.LEDsOff:
                apa102.TurnOff();
                break;

            default:
                break;
        }
    }
类常数:

private static readonly int GPIO_NUMBER_RED = 22;
在构造函数中调用:

    var gpioController = GpioController.GetDefault();

    redPin = gpioController.OpenPin(GPIO_NUMBER_RED);
    redPin.Write(GpioPinValue.High);
    redPin.SetDriveMode(GpioPinDriveMode.Output);
我尝试了我的类全局常数的值6(BCM)、31(管脚编号)和22(接线管脚编号)
GPIO\u number\u RED
,但我总是得到错误:

    WinRT information: Pin ' is not available. It is reserved by the system or in use for another function.
引脚布局

完整来源

    /// <summary>
    /// Private singelton instance.
    /// </summary>
    private static RainbowHAT instance;

    /// <summary>
    /// Default instance of RainbowHAT.
    /// </summary>
    public static RainbowHAT Default
    {
        get
        {
            if (instance == null)
            {
                instance = new RainbowHAT();
            }

            return instance;
        }
    }

    private RainbowHAT()
    {
        gpioController = GpioController.GetDefault();

        // Ensure that we have a valid gpio connection
        if (gpioController == null)
        {
            throw new OperationCanceledException("Operation canceled due missing GPIO controller");
        }

        Init();
    }


    public void PerformAction(RainbowHATAction action)
    {
        switch(action)
        {
            case RainbowHATAction.TurnOnRed:
                redPin.Write(GpioPinValue.High);
                break;

            case RainbowHATAction.TurnOffRed:
                redPin.Write(GpioPinValue.Low);
                break;

            case RainbowHATAction.LEDsOn:
                apa102.TurnOn();
                break;

            case RainbowHATAction.LEDsOff:
                apa102.TurnOff();
                break;

            default:
                break;
        }
    }

套餐信息

    <Capabilities>
        <Capability Name="internetClient" />
        <DeviceCapability Name="lowLevel"/>
    </Capabilities>


我还重新启动了Pi以“重置”可能是访问此Pin的其他应用程序,但没有成功。

解决方案

如果不在构造函数中调用
gpioController
,而是在Init之后调用另一个方法,则一切正常


现在的问题是,为什么不可能在init中实现呢?

解决方案

如果不在构造函数中调用
gpioController
,而是在Init之后调用另一个方法,则一切正常


现在的问题是,为什么不可能在init中执行呢?

我已经下载了repo并查看了代码。我不确定为什么需要在MainPageViewModel的构造函数中添加Init方法。但不建议在模型的构造函数方法中添加singleton实例,因为该模型用于绑定到视图以显示数据。重用GPIO pin资源时,应在另一个页面中释放并处置它。此外,当您不需要使用GpioPin时,应该手动处理GpioPin。您可以尝试在RainbowHAT的构造函数中移动Init方法,如下面的代码所示

RainbowHAT.cs(更新)


我已经下载了回购协议并查看了代码。我不确定为什么需要在MainPageViewModel的构造函数中添加Init方法。但不建议在模型的构造函数方法中添加singleton实例,因为该模型用于绑定到视图以显示数据。重用GPIO pin资源时,应在另一个页面中释放并处置它。此外,当您不需要使用GpioPin时,应该手动处理GpioPin。您可以尝试在RainbowHAT的构造函数中移动Init方法,如下面的代码所示

RainbowHAT.cs(更新)

解决方案#2

在@michaelxu msft指出我没有使用
Singelton
模式之后,我删除了它,瞧,现在我可以从构造函数中调用Init了。我必须研究原因。

解决方案#2


在@michaelxu msft指出我没有使用
Singelton
模式之后,我删除了它,瞧,现在我可以从构造函数中调用Init了。我必须研究一下原因。

GPIO\U NUMBER\U RED是局部变量吗?如果是这样的话,我们可以看到任何设置“GPIO_NUMBER_RED”值的行@Jamesm,这是一个类常量。我更新了我的问题。GPIO_NUMBER_RED是局部变量吗?如果是这样的话,我们可以看到任何设置“GPIO_NUMBER_RED”值的行@Jamesm,这是一个类常量。我更新了我的问题。你提到这个了吗?
gpioController
在页面的构造函数中初始化。所以我认为你的问题与此无关。你能提供更多的代码吗?如果可能,您可以提供该项目。@MichaelXu MSFT是的,我提供了。我的问题的意思是“我可能做错了”。这是源类。请查看构造函数下面的
Init()
方法。你提到过这个吗?
gpioController
在页面的构造函数中初始化。所以我认为你的问题与此无关。你能提供更多的代码吗?如果可能,您可以提供该项目。@MichaelXu MSFT是的,我提供了。我的问题的意思是“我可能做错了”。这是源类。请查看构造函数下面的
Init()
方法。这是我第一次尝试。但是不,我将获得一个
WinRT信息:Pin'不可用。它由系统保留或用于其他功能。
异常。你的意思是,我不应该使用Singelton模式吗?@Tobonaut,Singelton模式可以用于彩虹帽课程。但在您的代码中,它似乎不适用于GpioController。我对它进行了修改,效果很好。这是我有史以来的第一个方法。但是不,我将获得一个
WinRT信息:Pin'不可用。它由系统保留或用于其他功能。
异常。你的意思是,我不应该使用Singelton模式吗?@Tobonaut,Singelton模式可以用于彩虹帽课程。但在您的代码中,它似乎不适用于GpioController。我已经修改过了,效果很好。