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 ...
随机推荐
- C#温故知新:《C#图解教程》读书笔记系列
一.此书到底何方神圣? 本书是广受赞誉C#图解教程的最新版本.作者在本书中创造了一种全新的可视化叙述方式,以图文并茂的形式.朴实简洁的文字,并辅之以大量表格和代码示例,全面.直观地阐述了C#语言的各种 ...
- Jquery UI - DatePicker 在Dialog中无法自动隐藏的解决思路
通过Jquery UI Dialog模态展示如下的一个员工编辑页面,但是遇到一个奇怪的问题:点击Start Date的input元素后,其无法失去焦点.从而导致DatePicker控件在选择日期后无法 ...
- <canvas>设置宽高遇到的问题
在使用<canvas>元素时必须设置宽度和高度,指定可以绘画的区域大小.但是这里设置宽度和高度的时候有一个小问题. 样例代码: <!DOCTYPE html> <html ...
- iOS中怎么存储照片到自定义相册
在市场上主流App中,大多数App都具有存储图片到自己App的相册中.苹果提供的方法只能存储图片到系统相册,下面讲一下怎么实现: 实现思路: 1.对系统相册进行操作的前提必须导入#import &l ...
- Android_安卓为按钮控件绑定事件的五种方式
一.写在最前面 本次,来介绍一下安卓中为控件--Button绑定事件的五种方式. 二.具体的实现 第一种:直接绑定在Button控件上: 步骤1.在Button控件上设置android:onClick ...
- Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例
Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...
- TSQL Merge On子句和When not matched 语义理解
Merge 的On子句指定Match condition,When子句指定过滤条件,如果Source Table和Targe Table匹配的上,很好理解:如果匹配不上,必须深入理解不匹配的条件,否则 ...
- 小谈MVC 模式
MVC (Modal View Controler) 本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使 ...
- OpenCASCADE Quaternion
OpenCASCADE Quaternion eryar@163.com Abstract. The quaternions are members of a noncommutative divis ...
- 学用MVC4做网站六:后台管理(续)
关于后台的说明: 后台将会用easyui + ajax模式. 这里涉及两个问题,一个是使用easyui如何在前台验证模型的问题,另一个是ajax提交后返回数据. 一.Easyui验证 前台验证采用ea ...