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[].Id);
//串口设备是否获取成功
if (null != _derialPort)
{
_derialPort.ReadTimeout = TimeSpan.FromMilliseconds();//超时
_derialPort.BaudRate = ;//波特率
_derialPort.Parity = SerialParity.None;//校验检查
_derialPort.StopBits = SerialStopBitCount.One;//停止位
_derialPort.DataBits = ;//数据位
_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 > )
{
//转换十六进制数据
string res = LoadData(bytesRead);
SendMsg(res);
}
StringBuilder str_builder = new StringBuilder();
//转换缓冲区数据为16进制
while (_dataReader.UnconsumedBufferLength > )
{
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
//librastarwing@hotmail.com
public sealed class StartupTask : IBackgroundTask
{
#region Fileds private DataReader _dataReader;
private SerialDevice _derialPort;
//缓冲区大小
private uint _readBufferLength = ; #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[].Id);
//串口设备是否获取成功
if (null != _derialPort)
{
_derialPort.ReadTimeout = TimeSpan.FromMilliseconds();//超时
_derialPort.BaudRate = ;//波特率
_derialPort.Parity = SerialParity.None;//校验检查
_derialPort.StopBits = SerialStopBitCount.One;//停止位
_derialPort.DataBits = ;//数据位
_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 > )
{
//转换十六进制数据
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 > )
{
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
}
}

到这里整个数据读取发送的过程就完成了,如果对代码有优化的建议,欢迎留言或发邮件给我(librastarwing@hotmail.com)。
也可以加我的微信号查看以前的文章。

项目源码 GitHub https://github.com/CloudTechx/CloudTechIot 的 CloudTechIot3 目录下。

Win10 IoT C#开发 4 - UART 串口通信的更多相关文章

  1. Win10 IoT C#开发 6 - 4x4矩阵键盘扫描

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我 ...

  2. Win10 IoT C#开发 5 - 操作 IoT 设备内嵌 SQLite 数据库 CURD

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 前几章我 ...

  3. Win10 IoT C#开发 3 - GPIO Pin 控制发光二极管

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一篇文 ...

  4. Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. The ...

  5. Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我 ...

  6. 【C51】UART串口通信

    我们常需要单片机和其他模块进行通信,数据传输,常用的方式就是串口通信技术. 常用来 单片机<-->电脑,  单片机<-->单片机之间通信. 串行通信 versus 并行通信 并 ...

  7. 【ARM】2410裸机系列-uart串口通信

    开发环境 (1)硬件平台:FS2410 (2)主机:Ubuntu 12.04 FS2410串口的原理图 串口UART寄存器配置   配置TXD0与RXD0(GPH2.GPH3) 设置波特率(UBRDI ...

  8. UART串口通信

    #include "sys.h" #include "delay.h" #include "usart.h" u8 rdata[]; UAR ...

  9. 【iCore3 双核心板_FPGA】实验二十五:NIOS II之UART串口通信实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1eRMZq18 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

随机推荐

  1. 我只是想开个饭店—— JavaIO模型的演变

    Java的IO...真的是我所见过的高级语言中.最最复杂的... 看着这个图我也是醉了. 但是不知不觉间,java的IO已经更新到了NIO.2了,IO库早已经不止是这个样子了,那么这个过程中,它们经历 ...

  2. Android学习第二天-android常用命令

    上一篇文章中,我们重点讲解了adb的常用命令,下面我们一起来看看其它常用的命令 2 android 2.1 查看机器上所有已经安装的Android版本和AVD设备 2.1.1查看机器上已经安装的AVD ...

  3. Java接口总结

    接口的定义: 使用interface来定义一个接口.接口定义与类的定义类似,也是分为接口的声明和接口体,其中接口体由变量定义和方法定义两部分组成,定义接口的基本语法如下: [修饰符] interfac ...

  4. selenium的安装

    一.安装selenium 通过pip命令安装selenium包:(pip的安装方法:http://www.cnblogs.com/zhengyihan1216/articles/6011640.htm ...

  5. jQuery DateTimePicker 日期和时间插件

    jQuery UI很强大,其中的日期选择插件Datepicker是一个配置灵活的插件,我们可以自定义其展示方式,包括日期格式.语言.限制选择日期范围.添加相关按钮以及其它导航等. 日期选择插件是一个配 ...

  6. WPF入门教程系列二十一——DataGrid示例(一)

    前面我们学习了ListView控件的使用示例,今天我们来学习DataGrid的有关知识.提到DataGrid 不管是Asp.Net中的网页开发还是WinForm应用程序开发都会频繁使用.通过它我们可以 ...

  7. 深入理解ajax系列第一篇——XHR对象

    × 目录 [1]创建对象 [2]发送请求 [3]接收响应[4]异步处理[5]实例演示 前面的话 ajax是asynchronous javascript and XML的简写,中文翻译是异步的java ...

  8. 借助node实战WebSocket

    一.WebSocket概述 WebSocket协议,是建立在TCP协议上的,而非HTTP协议. 如下: ws://127.0.0.1或wss://127.0.0.1就是WebSocket请求. 注:w ...

  9. Java 8新特性-4 方法引用

    对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMetho ...

  10. Windows 使用 Yeoman generators 创建 ASP.NET 应用程序

    上一篇:<Windows 搭建 .NET 跨平台环境并运行应用程序> 阅读目录: Install Node.js Install yeoman-generators Create ASP. ...