微軟官方的例子Blinky能夠控制GPIO的輸出並在界面中顯示出來,通過我自己的改造,將這個工程從GPIO輸入來控制輸入LED的狀態並且在界面中顯示出來,而輸入是通過GPIO的事件觸發來完成,並立即刷新界面顯示。
在winform中只要用Invoke即可實現跨線程訪問UI,但是在這個UWP工程里的界面元素沒有Invoke方法,通過葉帆老師的幫助采用C#5.0的新特性async await異步方法解決了跨線程訪問UI的功能。


部分代碼如下:
public sealed partial class MainPage : Page
{
private const int LED_PIN = 5;
private const int SWITCH_PIN = 6;
private GpioPin pinled;
private GpioPin pinswitch;
private SolidColorBrush redBrush = new SolidColorBrush(Windows.UI.Colors.Red);
private SolidColorBrush grayBrush = new SolidColorBrush(Windows.UI.Colors.LightGray);
public MainPage()
{
this.InitializeComponent();
InitGPIO();
}
private void InitGPIO()
{
var gpio = GpioController.GetDefault();
// Show an error if there is no GPIO controller
if (gpio == null)
{
pinled = null;
pinswitch = null;
GpioStatus.Text = "There is no GPIO controller on this device.";
return;
}
pinswitch = gpio.OpenPin(SWITCH_PIN);
pinswitch.DebounceTimeout = new TimeSpan(0, 0, 0, 0, 50);//消抖時間
pinswitch.SetDriveMode(GpioPinDriveMode.Input);
pinled = gpio.OpenPin(LED_PIN);
pinled.SetDriveMode(GpioPinDriveMode.Output);
pinled.Write(pinswitch.Read());
pinswitch.ValueChanged += Pinswitch_ValueChanged;
GpioStatus.Text = "GPIO pin initialized correctly.";
}
private async void Pinswitch_ValueChanged(GpioPin sender, GpioPinValueChangedEventArgs args)
{
GpioPinValue pinvalue = pinswitch.Read();
pinled.Write(pinvalue);
await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
switch (pinvalue)
{
case GpioPinValue.Low:
LED.Fill = redBrush;
break;
case GpioPinValue.High:
LED.Fill = grayBrush;
break;
default:
break;
}
});
}
}
完整程序包連接如下:
http://download.csdn.net/detail/wangji666666/9411014
注意:要將項目屬性頁“Debug”下的Remote machine中內容改成自己的win10iot設備的名稱或者是IP
