Как закрыть/утилизировать контакты gpio, открытые в предыдущем экземпляре

Я использую тензодатчик, усилитель HX711 и Raspberry Pi3. Пытаюсь сделать приложение с более чем одним окном на c# uwp, используя библиотеку здесь https://github.com/ms-iot/hx711 Но каждый раз, когда я возвращаюсь на страницу, где я читаю значения, передаваемые усилителем HX711, я получаю эту ошибку:

Возникло исключение: «System.IO.FileLoadException» в Microsoft.Maker.Devices.Hx711.winmd Информация WinRT: PIN-код в настоящее время открыт в несовместимом режиме общего доступа. Убедитесь, что этот контакт еще не используется этим приложением или другим приложением.

Я знаю, что эта ошибка связана с тем, что контакты были открыты в предыдущем экземпляре. Чего я не знаю, так это как проверить, открыты ли они, и если они открыты, я их закрою, или еще, чтобы помочь мне в продолжении приложения.

Ниже приведена страница, где мне нужно прочитать значения:

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

person Ungureanu Victor    schedule 24.07.2018    source источник


Ответы (1)


Во-первых, вы должны проверить, не пытается ли соединение с одним из ваших контактов установиться дважды. Во-вторых, вы можете попробовать добавить следующий метод в библиотеку HX711, а затем вызывать этот метод при выходе из текущего окна.

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

    if(dataPin != null)
    {
        dataPin.Dispose();
    }
}
person Michael Xu - MSFT    schedule 25.07.2018
comment
Спасибо за решение. Я изменил его, потому что хочу закрывать контакты каждый раз, когда покидаю страницу, поэтому код выглядит так: public void Stop (){ available = false; clockPin.Dispose (); dataPin.Dispose (); } - person Ungureanu Victor; 25.07.2018