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[].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 串口通信的更多相关文章
- Win10 IoT C#开发 6 - 4x4矩阵键盘扫描
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我 ...
- Win10 IoT C#开发 5 - 操作 IoT 设备内嵌 SQLite 数据库 CURD
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 前几章我 ...
- Win10 IoT C#开发 3 - GPIO Pin 控制发光二极管
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一篇文 ...
- Win10 IoT C#开发 1 - Raspberry安装IoT系统及搭建开发环境
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. The ...
- Win10 IoT C#开发 2 - 创建基于XAML的UI程序 及 应用的三种部署方法
Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我 ...
- 【C51】UART串口通信
我们常需要单片机和其他模块进行通信,数据传输,常用的方式就是串口通信技术. 常用来 单片机<-->电脑, 单片机<-->单片机之间通信. 串行通信 versus 并行通信 并 ...
- 【ARM】2410裸机系列-uart串口通信
开发环境 (1)硬件平台:FS2410 (2)主机:Ubuntu 12.04 FS2410串口的原理图 串口UART寄存器配置 配置TXD0与RXD0(GPH2.GPH3) 设置波特率(UBRDI ...
- UART串口通信
#include "sys.h" #include "delay.h" #include "usart.h" u8 rdata[]; UAR ...
- 【iCore3 双核心板_FPGA】实验二十五:NIOS II之UART串口通信实验
实验指导书及代码包下载: http://pan.baidu.com/s/1eRMZq18 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
随机推荐
- Javascript闭包和C#匿名函数对比分析
C#中引入匿名函数,多少都是受到Javascript的闭包语法和面向函数编程语言的影响.人们发现,在表达式中直接编写函数代码是一种普遍存在的需求,这种语法将比那种必须在某个特定地方定义函数的方式灵活和 ...
- redis总结
redis总结 redis与memcached redis支持更多的数据结构 redis支持数据持久化 redis支持两种存储方式:snapshot(快照)和aof(append only mode) ...
- Unicode编码解码在线转换工具
// Unicode编码解码在线转换工具 Unicode 是基于通用字符集(Universal Character Set)的标准来发展,并且同时也以书本的形式(The Unicode Standar ...
- ASP.NET MVC 从零开始 - 自动化部署(其二)
这篇文章是从我的 github 博客 http://lxconan.github.io 导入的. 这是这个系列的第五篇了,前四篇请参见: ASP.NET MVC 从零开始 – Create and R ...
- 《Entity Framework 6 Recipes》中文翻译系列 (44) ------ 第八章 POCO之POCO中使用值对象和对象变更通知
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-4 POCO中使用值对象(Complex Type--也叫复合类型)属性 问题 ...
- oracle 备份数据库对象(存储过程PROCEDURE,FUNCTION,VIEW,TRIGGER...)
开发过程中,需要不停的备份数据库对象, 特别是存储过程, 每次手动备份不免很低能啊 历经几次修改终于, 完美了,O(∩_∩)O哈哈~ (当然,你也可以再改简便一点~~~) select db ...
- 考勤系统——代码分析datagrid
datagrid是easyui的控件,DataGrid以表格形式展示数据,并提供了丰富的选择.排序.分组和编辑数据的功能支持.DataGrid的设计用于缩短开发时间,并且使开发人员不需要具备特定的知识 ...
- KnockoutJS 3.X API 第六章 组件(4) 自定义元素
自定义元素提供了一种将组件注入视图的方便方法. 本节目录 介绍 例子 传递参数 父组件和子组件之间的通信 传递监控属性的表达式 将标记传递到组件中 控制自定义元素标记名称 注册自定义元素 备注1:将自 ...
- 设计与开发一款简单易用的Web报表工具(支持常用关系数据及hadoop、hbase等)
EasyReport是一个简单易用的Web报表工具(支持Hadoop,HBase及各种关系型数据库),它的主要功能是把SQL语句查询出的行列结构转换成HTML表格(Table),并支持表格的跨行(Ro ...
- 【转】WPF防止界面卡死并显示加载中效果
原文地址:http://www.cnblogs.com/linyijia/archive/2013/02/06/2900609.html <Window x:Class="Loadin ...