Windows 物联网 UWP - 中继

Windows IOT UWP - Relay

晚上好,

我正在对我的家庭自动化系统进行一些故障排除。我正在尝试在 C# 中使用 Raspberry PI 3 和 Windows IOT 切换继电器。我一直在玩代码,我可以看到继电器切换一两次,但随后应用程序崩溃了。我是物联网菜鸟,请问这段代码有问题吗? (变量名称在别处定义,我下面的奇怪变量名称是我的 WIP 项目...我更喜欢用英语进行故障排除)...

private void BtnTempFan_Click(object sender, RoutedEventArgs e)
    {
        if (BtnTempFan.IsChecked == true)
        {
            TogglePin(TempFan, TempFan_PIN, BtnTempFan, GpioPinValue.High);
        }
        else
        {
            TempFan.Dispose();
        }
    }
    private void TogglePin(GpioPin PinName, int PinNumber, ToggleButton Name, GpioPinValue value)
    {
        int pinnumber = PinNumber;
        GpioPinValue pinvalue;
        var gpio = GpioController.GetDefault();
        PinName = gpio.OpenPin(pinnumber);

        if (gpio == null)
        {
            PinName = null;
            LblError.Text = "We can't find the controller on the device" + PinName;
            LblError.Visibility = Visibility.Visible;
            return;
        }
        if (PinName == null)
        {
            LblError.Text = "We can't find the pin on the device. Pin number " + PinNumber + "does not exist";
            LblError.Visibility = Visibility.Visible;
            return;
        }
        if (Name.IsChecked == true)
        {
            pinvalue = value;
            PinName.Write(pinvalue);
            PinName.SetDriveMode(GpioPinDriveMode.Output);
        }

你不说异常是什么。但是,我相信您应该只为每个应用打开一次 GPIO 引脚:

var gpio = GpioController.GetDefault();
PinName = gpio.OpenPin(pinnumber);

您在每次单击按钮时调用一次的方法中拥有它。通过多次打开图钉,您会遇到图钉已经打开的情况,我相信这就是抛出异常并导致应用程序崩溃的原因。


在我的代码中,我在 "driver" class 中处理引脚状态,并有一个名为 Connect 的方法,我在启动应用程序时调用一次。例如:

public async Task Connect()
{
    var gpioController = await GpioController.GetDefaultAsync();

    try
    {
        _openPin = gpioController.OpenPin(_doorMotorOpenPin);
        _closePin = gpioController.OpenPin(_doorMotorClosePin);
    }
}

这封装了 2 个引脚:_openPin_closePin 到我可以管理其生命周期的 class。

Codekaizen 是正确的。我将 pin 打开到一个只被调用一次并解决问题的方法中。

private void BtnTempFan_Click(object sender, RoutedEventArgs e)
    {
        if (BtnTempFan.IsChecked == false)
        {
            TogglePin(TempFan, TempFan_PIN, BtnTempFan, GpioPinValue.High);
        }
        if (BtnTempFan.IsChecked == true)
        {
            TogglePin(TempFan, TempFan_PIN, BtnTempFan, GpioPinValue.Low);
        }

    }

    private void InitializePins()
    {
        var gpio = GpioController.GetDefault();
        //   Show an error if there is no GPIO controller

        if (gpio == null)
        {
            TempFan = null;
            LblError.Text = "We can't find the controller on the device";
            LblError.Visibility = Visibility.Visible;
            return;
        }

        TempFan = gpio.OpenPin(TempFan_PIN);
        TempFan.SetDriveMode(GpioPinDriveMode.Output);
    }


    private void TogglePin(GpioPin PinName, int PinNumber, ToggleButton Name, GpioPinValue value)
    {
        int pinnumber = PinNumber;
        GpioPinValue pinvalue;
        pinvalue = value;
        PinName.Write(pinvalue);
    }