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. UI控件(UITextField)

    @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UITextField* textField1 = ...

  2. Lesson 6 Percy Buttons

    Text I have just moved to a house in Bridge Street. Yesterday a bagger knocked at my door. He asked ...

  3. spring快速入门(三)

    一.在spring快速入门(二)的基础上,原先我们是采用构造方法完成对象的注入.这里还有其他的方法可以完成注入,通过set方法来完成. 修改UserActionImpl package com.mur ...

  4. Spark算子选择策略

    摘要  1.使用reduceByKey/aggregateByKey替代groupByKey 2.使用mapPartitions替代普通map 3.使用foreachPartitions替代forea ...

  5. windows7查看最近使用记录

    1.看计算机在哪天运行过~运行了多久! C:\Windows\SchedLgU.txt 2.看你最近运行过什么程序: C:\Windows\Prefetch 3.看你最近打开过什么文件(非程序)和文件 ...

  6. DataGrid中的事件和方法

    事件: onLoadSuccess:数据加载成功的时候触发. onLoadError:在载入远程数据产生错误的时候触发. onClickCell:在用户点击一个单元格的时候触发. onDblClick ...

  7. spring4mvc返回json(bean,list,map)

    因为spring3和spring4的mvc在前端返回json所需要的jar包不一样,所以索性写一篇关于spring4mvc在前端返回json的博文. 首先,新建一个web项目,项目格式如图所示: co ...

  8. c# 文件属性读取操作及文件之间操作

    c# 获取文件最后修改日期代码FileInfo f = new FileInfo(@"c:\1.txt");Console.WriteLine(f.LastWriteTime.To ...

  9. 查看Validate Subscription 的结果

    Sql Server Replication Monitor 提供一个feature,能够verify Replication的 Publication 和 Subscription 的数据同步sta ...

  10. bootstrap 学习

    <!DOCTYPE html> <html> <head> <title>Bootstrap</title> <meta name=& ...