如何 close/dispose gpio 在之前的实例中打开引脚

How to close/dispose gpio opened pins in a previous instance

我使用称重传感器杆、HX711 放大器和树莓派 pi3。 我正在尝试使用此处的库 https://github.com/ms-iot/hx711 在 c # uwp 中制作一个包含多个 window 的应用程序 但是每次我返回读取 HX711 放大器传输的值的页面时,我都会收到此错误:

Exception thrown: 'System.IO.FileLoadException' in Microsoft.Maker.Devices.Hx711.winmd WinRT information: Pin 'is currently opened in an incompatible sharing mode. Make sure this pin is not already in use by this application or other application.

我知道这个错误是由于在之前的实例中打开了引脚。不知道怎么查看是否打开,如果打开我就关闭,不然帮我继续申请。

下面是我需要读取值的页面:

using System;
using System.Linq;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Windows.System;
using Windows.UI;
using Windows.UI.Xaml.Automation.Provider;
using Windows.UI.Xaml.Automation.Peers;
using Windows.Storage;
using Microsoft.Maker.Devices.Hx711;

namespace push_csharp_universal
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
            ApplicationView view = ApplicationView.GetForCurrentView();
            //view.TryEnterFullScreenMode();
            MainPage_Loaded();
        }

        public string epn = "";
        public string op = "";
        public string f1 = null;
        public string f2 = null;
        public double r = 0;
        public float s = 0;
        public int x = 1;
        Hx711 device;

        protected async override void OnNavigatedFrom(NavigationEventArgs e)
        {
            Main_page.Background = new SolidColorBrush(Colors.Green);
            device = null;
            device = new Hx711();
            op_text_view.Text = "";
            pn_text_view.Text = "";
            op_text_box_scan.Text = "";
            pn_text_box_scan.Text = "";
            op_text_box_scan.Opacity = 1;
            op_text_box_scan.Focus(FocusState.Programmatic);
            op_text_view.Opacity = 0;
            op_view_lbl.Opacity = 0;
            pn_text_box_scan.Opacity = 0;
            pn_view_lbl.Opacity = 0;
            pn_text_view.Opacity = 0;
        }

        private async void MainPage_Loaded()
        {
            Main_page.Background = new SolidColorBrush(Colors.Green);
            op_text_view.Text = "";
            pn_text_view.Text = "";
            op_text_box_scan.Text = "";
            pn_text_box_scan.Text = "";
            op_text_box_scan.Opacity=1;
            op_text_box_scan.Focus(FocusState.Programmatic);
            op_text_view.Opacity = 0;
            op_view_lbl.Opacity = 0;
            pn_text_box_scan.Opacity = 0;
            pn_view_lbl.Opacity = 0;
            pn_text_view.Opacity = 0;
            f_citit.Text = s.ToString();

            device = new Hx711();
            device.Begin();

            while (r < 9.00)
            {
                double g = device.Grams;

                r = ((g / 5546704.667) - 0.03) / 0.029078887;
                s = (float)(Math.Round((double)r, 2));
                f_citit.Text = s.ToString();
                await System.Threading.Tasks.Task.Delay(TimeSpan.FromSeconds(.2));
                x++;
            }
        }

这里是我使用的 hx711 库代码:

using Windows.Devices.Gpio;

namespace Microsoft.Maker.Devices.Hx711
{
    public sealed class Hx711
    {
        int clockPinNumber=23;
        int dataPinNumber=24;
        GpioPin clockPin;
        GpioPin dataPin;

        bool available = false;
        public bool Begin()
        {
            GpioController gpio = GpioController.GetDefault();
            if (gpio == null)
            {
                available = false;
                return false;
            }
                clockPin = gpio.OpenPin(23, GpioSharingMode.Exclusive);
                clockPin.SetDriveMode(GpioPinDriveMode.Output);
                clockPin.Write(GpioPinValue.Low);
                dataPin = gpio.OpenPin(24, GpioSharingMode.Exclusive);
                dataPin.SetDriveMode(GpioPinDriveMode.Input);

            available = true;
            return true;
        }


        public double Grams
        {
            private set { }
            get
            {
                if (!available) { return 0.0f; }
                lock (this)
                {
                    //TODO: Figure out how mystic ADC units converts to Grams
                    return ReadData();
                }
            }
        }

        private int ReadData()
        {
            uint value = 0;
            byte[] data = new byte[4];
            for (; GpioPinValue.Low != dataPin.Read() ;);
            data[1] = ShiftInByte();
            data[2] = ShiftInByte();
            data[3] = ShiftInByte();
            clockPin.Write(GpioPinValue.High);
            clockPin.Write(GpioPinValue.Low);
            if (0x80 == (data[1] & 0x80))
            {
                data[0] = 0xFF;
            } else {
                data[0] = 0x00;
            }
            value = (uint)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]);
            value = ~value;

            return (int)(++value);
        }

        private byte ShiftInByte()
        {
            byte value = 0x00;
            clockPin.Write(GpioPinValue.High);
            value |= (byte)((byte)(dataPin.Read()) << 7);
            clockPin.Write(GpioPinValue.Low);
            clockPin.Write(GpioPinValue.High);
            value |= (byte)((byte)(dataPin.Read()) << 6);
            clockPin.Write(GpioPinValue.Low);
            clockPin.Write(GpioPinValue.High);
            value |= (byte)((byte)(dataPin.Read()) << 5);
            clockPin.Write(GpioPinValue.Low);
            clockPin.Write(GpioPinValue.High);
            value |= (byte)((byte)(dataPin.Read()) << 4);
            clockPin.Write(GpioPinValue.Low);
            clockPin.Write(GpioPinValue.High);
            value |= (byte)((byte)(dataPin.Read()) << 3);
            clockPin.Write(GpioPinValue.Low);
            clockPin.Write(GpioPinValue.High);
            value |= (byte)((byte)(dataPin.Read()) << 2);
            clockPin.Write(GpioPinValue.Low);
            clockPin.Write(GpioPinValue.High);
            value |= (byte)((byte)(dataPin.Read()) << 1);
            clockPin.Write(GpioPinValue.Low);
            clockPin.Write(GpioPinValue.High);
            value |= (byte)dataPin.Read();
            clockPin.Write(GpioPinValue.Low);

            return value;
        }
    }
}

首先,您应该检查与您的某个引脚的连接是否尝试建立两次。其次,可以尝试在HX711库中加入如下方法,离开当前window时再调用该方法。

public void Stop()
{
    if(clockPin != null )
    {
        clockPin.Dispose();
    }

    if(dataPin != null)
    {
        dataPin.Dispose();
    }
}