Win10 IoT C#開發 3 - UART 串口通訊

來源:互聯網
上載者:User

標籤:

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.調試代碼
先用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])。
也可以加我的號查看以前的文章。

Win10 IoT C#開發 3 - UART 串口通訊

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.