標籤:dal mat 產品 fun 嵌入 迴圈讀取 using 直接 arw
原文:Win10 IoT C#開發 4 - UART 串口通訊
Windows 10 IoT Core 是微軟針對物聯網市場的一個重要產品,既可以開發裝置UI與使用者互動式操作,又可以控制GPIO等介面,使得原來嵌入式繁瑣的開發變得簡單。通過Remote Debug功能可以進行斷點追蹤調試。C#語言本身也有很好的使用者基礎,相信Win10 IoT 不遠的將來會火起來。
上個月幫朋友解決了關於Win10 IoT 的一些技術問題,當前也有很多公司在嘗試採用Win10 IoT進行開發,可能也會遇到這些問題,相關文檔現在還非常少,這裡寫出來供大家參考。
因為要做一個Java Web與Restful的自宿主架構和其他一大堆事情,這篇文章也拖了半個月,架構剛剛完成,以後可以擺脫Tomcat這些HttpServer了,現在靜下來把這篇文章寫完。
Win10 IoT的安裝部署過程後面我會寫文章進行補充,下面直接介紹串口通訊的開發過程。
1.串連裝置
首先將 Raspberry Pi 2 與感應器串連。GND,5V 對接,TX與RX交叉串連。
Raspberry Pi 2 GPIO 介面
感應器與裝置串連
2.啟動裝置
將Raspberry串連到區域網路並啟動。開啟 Windows IoT Core Watcher 查看裝置的工作狀態。包含名稱,mac地址,ip地址,當前線上等資訊。
3.建立項目
開啟VS2015建立項目,在C#分類下選擇Windows IoT Core 模板。
4.配置許可權
Package.appxmanifest檔案的節點中加入讀取網路與串口通訊的許可權,這步很像Android的uses-permission。
<Capabilities> <Capability Name="internetClient" /> <Capability Name="internetClientServer" /> <Capability Name="privateNetworkClientServer" /> <DeviceCapability Name="serialcommunication"> <Device Id="any"> <Function Type="name:serialPort" /> </Device> </DeviceCapability></Capabilities>
5.模組代碼
建立UART的串口裝置並設定參數。
string aqsFilter = SerialDevice.GetDeviceSelector("UART0");DeviceInformationCollection dis = await DeviceInformation.FindAllAsync(aqsFilter);//擷取串口裝置_derialPort = await SerialDevice.FromIdAsync(dis[0].Id);//串口裝置是否擷取成功if (null != _derialPort){ _derialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);//逾時 _derialPort.BaudRate = 9600;//傳輸速率 _derialPort.Parity = SerialParity.None;//校正檢查 _derialPort.StopBits = SerialStopBitCount.One;//停止位 _derialPort.DataBits = 8;//資料位元 _derialPort.Handshake = SerialHandshake.None;//握手方式 //設定讀取輸入資料流 _dataReader = new DataReader(_derialPort.InputStream);}
讀取串口資料
Task<UInt32> loadAsyncTask;_dataReader.InputStreamOptions = InputStreamOptions.Partial;//讀取資料loadAsyncTask = _dataReader.LoadAsync(_readBufferLength).AsTask();uint bytesRead = await loadAsyncTask;//判斷擷取資料長度if (bytesRead > 0){ //轉換十六進位資料 string res = LoadData(bytesRead); SendMsg(res);}
StringBuilder str_builder = new StringBuilder();//轉換緩衝區資料為16進位while (_dataReader.UnconsumedBufferLength > 0){ str_builder.Append(_dataReader.ReadByte().ToString("x2"));}
推送資料
HttpClient httpClient = new HttpClient();httpClient.GetAsync(new Uri(string.Format("http://192.168.1.9:8099/{0}", res)));
6.調試代碼
在另外一台電腦(ip:192.168.1.9)上先用Nodejs建立了一個http的監聽服務類比伺服器,監聽8099連接埠上裝置發送過來的串口資料,並列印到Console裡。
在VS2015的工具列中選擇Remote Machine進行調試,IP地址輸入裝置對應地址,可以在Windows IoT Core Watcher中查看到。點擊運行後會自動部署到裝置上。
7.運行結果
代碼部署完成後開始執行任務,Output視窗列印擷取到的串口資料。
Nodejs類比的伺服器列印接收到的推送資料。從列印結果上可以看到發送和接收到的資料一致。
與感應器的資料協議約定一致。
完整代碼:
using System;using System.Diagnostics;using System.Text;using System.Threading.Tasks;using Windows.ApplicationModel.Background;using Windows.Devices.Enumeration;using Windows.Devices.SerialCommunication;using Windows.Storage.Streams;using Windows.Web.Http;namespace CloudTechIot3{ //http://www.cnblogs.com/cloudtech //[email protected] public sealed class StartupTask : IBackgroundTask { #region Fileds private DataReader _dataReader; private SerialDevice _derialPort; //緩衝區大小 private uint _readBufferLength = 10; #endregion #region Main Method public async void Run(IBackgroundTaskInstance taskInstance) { await Listen(); Close(); } #endregion #region Private Methods //監聽串口 private async Task Listen() { try { string aqsFilter = SerialDevice.GetDeviceSelector("UART0"); DeviceInformationCollection dis = await DeviceInformation.FindAllAsync(aqsFilter); //擷取串口裝置 _derialPort = await SerialDevice.FromIdAsync(dis[0].Id); //串口裝置是否擷取成功 if (null != _derialPort) { _derialPort.ReadTimeout = TimeSpan.FromMilliseconds(1000);//逾時 _derialPort.BaudRate = 9600;//傳輸速率 _derialPort.Parity = SerialParity.None;//校正檢查 _derialPort.StopBits = SerialStopBitCount.One;//停止位 _derialPort.DataBits = 8;//資料位元 _derialPort.Handshake = SerialHandshake.None;//握手方式 //設定讀取輸入資料流 _dataReader = new DataReader(_derialPort.InputStream); //迴圈讀取資料 while (true) { await ReadAsync(); } } else { //TODO } } catch (Exception ex) { //TODO } finally { Close(); } } //非同步讀取資料 private async Task ReadAsync() { Task<UInt32> loadAsyncTask; _dataReader.InputStreamOptions = InputStreamOptions.Partial; //讀取資料 loadAsyncTask = _dataReader.LoadAsync(_readBufferLength).AsTask(); Task.Delay(TimeSpan.FromSeconds(2.1)).Wait(); uint bytesRead = await loadAsyncTask; //判斷擷取資料長度 if (bytesRead > 0) { //轉換十六進位資料 string res = LoadData(bytesRead); SendMsg(res); } else { //TODO } } //輸出結果 private void SendMsg(string res) { //列印 Debug.WriteLine(res); //推送到伺服器 HttpClient httpClient = new HttpClient(); httpClient.GetAsync(new Uri(string.Format("http://192.168.1.9:8099/{0}", res))); } //轉換資料 private string LoadData(uint bytesRead) { StringBuilder str_builder = new StringBuilder(); //轉換緩衝區資料為16進位 while (_dataReader.UnconsumedBufferLength > 0) { str_builder.Append(_dataReader.ReadByte().ToString("x2")); } return str_builder.ToString().ToUpper(); } //釋放資源 private void Close() { if (null != _dataReader) { _dataReader.DetachStream(); } if (null != _derialPort) { _derialPort.Dispose(); } } #endregion }}
到這裡整個資料讀取發送的過程就完成了,如果對代碼有最佳化的建議,歡迎留言或發郵件給我([email protected])。
也可以加我的號查看以前的文章。
項目源碼 GitHub https://github.com/CloudTechx/CloudTechIot 的 CloudTechIot3 目錄下。
Win10 IoT C#開發 4 - UART 串口通訊