Pin当前以不兼容的共享模式打开

问题描述 投票:1回答:2

我目前正在使用UWP Toolkit在应用页面之间导航。有一个页面用于初始化和打开RaspberryPi GPIO引脚。导航离开该页面然后尝试再次导航回到它后发生以下错误。

该进程无法访问该文件,因为该文件正被另一个进程使用。\ r \ n \ r \ n \ n \ n \ n'当前以不兼容的共享模式打开。确保此应用程序或其他应用程序尚未使用此引脚

我可以看到每次访问页面时都会调用构造函数,因此尝试打开已打开的引脚。克服这个问题的最佳方法是什么?

c# uwp raspberry-pi windows-10-iot-core
2个回答
2
投票

您可以将NavigationCacheMode = NavigationCacheMode.Required;添加到页面的actor中,这样当您在那里导航时,您的应用程序将不会创建它的新实例。


0
投票

我总是做的是让一个类处理管脚,以便你的用户代码可以请求引脚作用。

public class IO
{
    private readonly GpioController _gpioController;
    private readonly Dictionary<int, GpioPin> _pins;
    public IO(GpioController gpioController)
    {
        _gpioController = gpioController;
        _pins = new Dictionary<int, GpioPin>();
    }

    public GpioPin OpenPin(int pin, GpioSharingMode mode)
    {
        if (_pins.ContainsKey(pin))
        {
            var gpioPin = _pins[pin];
            if (gpioPin.SharingMode == mode)
            {
                return gpioPin;
            }
            throw new ArgumentException($"Pin '{pin}' is already configured in mode '{gpioPin.SharingMode}'");
        }
        else
        {
            var gpioPin = _gpioController?.OpenPin(pin, mode);
            _pins[pin] = gpioPin;
            return gpioPin;
        }
    }

}

然后我的viewmodels只需要一个如下的引脚

public MainViewModel()
{
    _io = ServiceContainer.Instance.Get<IO>();

    _brakingPin = _io.OpenPin(4, GpioSharingMode.Exclusive);
    _io.SetDriveMode(_brakingPin, GpioPinDriveMode.Output);
    _io.Write(_brakingPin, GpioPinValue.Low);
}
© www.soinside.com 2019 - 2024. All rights reserved.