簡體   English   中英

當前在不兼容的共享模式下打開了圖釘

[英]Pin is currently opened in an incompatible sharing mode

我目前正在使用UWP Toolkit在應用程序頁面之間導航。 有一個頁面用於初始化和打開RaspberryPi GPIO引腳。 離開該頁面然后嘗試再次導航回該頁面后,將發生以下錯誤。

該進程無法訪問該文件,因為該文件正在被另一個進程使用。\\ r \\ n \\ r \\ nPin'當前以不兼容的共享模式打開。 確保此應用程序或其他應用程序尚未使用此引腳

我可以看到每次訪問頁面時都會調用構造函數,因此嘗試打開已經打開的引腳。 解決此問題的最佳方法是什么?

您可以添加NavigationCacheMode = NavigationCacheMode.Required; 到頁面ctor的位置,因此當您瀏覽該頁面時,您的應用不會為其創建新實例。

我一直做的是讓一個類處理管腳,以便您的用戶代碼可以請求管腳進行操作。

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

}

然后我的視圖模型只要求如下圖釘

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

    _brakingPin = _io.OpenPin(4, GpioSharingMode.Exclusive);
    _io.SetDriveMode(_brakingPin, GpioPinDriveMode.Output);
    _io.Write(_brakingPin, GpioPinValue.Low);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM