微软官方的例子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