【问题标题】:Windows IOT UWP - RelayWindows IOT UWP - 中继
【发布时间】:2018-03-10 01:56:23
【问题描述】:

晚上好,

我正在对我的家庭自动化系统开始进行一些故障排除。我正在尝试使用 C# 中的 Raspberry PI 3 和 Windows IOT 切换继电器。我一直在玩代码,我可以看到继电器切换一次或两次,但随后应用程序崩溃了。我是一个 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);
        }

【问题讨论】:

  • 我看到的两件事看起来不正确,但我不能确定这是问题所在。您在切换按钮中调用TempFan.Dispose();这意味着当您取消切换按钮时,它将尝试使用 TempFan(但它已经被处理掉了。)另一件事是您正在调用 var gpio = GpioController.GetDefault();,然后立即尝试使用 PinName = gpio.OpenPin(pinnumber); 分配引脚。然后,您正在检查 gpio 是否为空。赋值后立即检查null,否则赋值PinName会报错。

标签: c# raspberry-pi3 windows-iot-core-10


【解决方案1】:

你没有说例外是什么。但是,我相信您应该只为每个应用打开一次 GPIO 引脚:

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

你有一个方法,每次点击按钮都会调用一次。通过多次打开 pin,您会遇到 pin 已经打开,我相信这就是引发异常并使应用程序崩溃的原因。


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

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

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

这将 2 个引脚:_openPin_closePin 封装到一个我可以管理其生命周期的类中。

【讨论】:

  • 这可能就是答案。我将为每个应用方法创建 1x。这很有意义,因为它当前在引脚切换一次并且继电器单击一次后崩溃。我希望这个周末能测试一下,完成这个反云智能家居的恒温器部分(或者我希望是这样)。
【解决方案2】:

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);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2021-02-17
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多