张高兴的 .NET Core IoT 入门指南:(五)串口通信入门
在开始之前,首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中,而是在 System.IO.Ports NuGet 包中。之所以在这里介绍串口通信,是因为在嵌入式中串口通信是与其他设备进行交互的一种重要方式,而且在某些没有屏幕的设备中充当着程序调试的工具。
什么是串口
串口是串行接口的简称,这是一个非常大的概念,在嵌入式中串口通常指 UART (Universal Asynchronous Receiver/Transmitter,通用异步收发器)。使用串口进行的通信叫做串行通信,与之相对的一个概念是并行通信。串行通信是指数据一位一位的按顺序传输,而并行通信则是多位数据同时传输。如图1所示,DATA BUS 到 UART 1 之间是并行通信,UART 1 到 UART 2 之间是串行通信。

图1:串行通信与并行通信
串口通信的数据帧格式如图2所示,通常一帧共包括 10 位:1 个起始位,8 个数据位和 1 个停止位。有一些特殊的数据帧在停止位前面包含 1 位的奇偶校验位,还有的停止位有 2 个比特。其中起始位为低电平(0),标志着数据传输的开始;停止位为高电平(1),表示数据帧传输结束;数据位则为实际发送的数据,使用高低电平来表示比特信息,如果发送的内容是文本,那么这段数据为字符的二进制编码(ASCII,UTF-8……)。数据传输的速率我们使用波特率(Baud Rate)来表示,即每秒钟传送的码元符号的个数[1]。比如数据传输速率为 9600 字符/s,那么这时的波特率为 9600。

图2:串口通信的数据帧
设备进行串口通信时,设备的连线如图3所示,两个设备的信号线,即发送端(TXD)与接收端(RXD)交叉相连,并且需要共地。在 Raspberry Pi 的引脚上共引出了 1 组串口,即 UART 0 ,对应 8 和 10 号引脚。

图3:串口设备的连接
相关类
串口操作的相关类位于 System.IO.Ports 命名空间下。
SerialPort
public class SerialPort : Component
{
// portName 为串口的名称,可以使用静态方法 GetPortNames() 获取
public SerialPort(string portName);
// 传输的波特率
public int BaudRate { get; set; }
// 指定传输内容的编码
public Encoding Encoding { get; set; }
// 新行格式,即设置换行的字符
public string NewLine { get; set; }
// 设置停止位的格式
public StopBits StopBits { get; set; }
// 设置校验位的格式
public Parity Parity { get; set; }
// 打开串口通信流
public void Open();
// 关闭串口通信流
public void Close();
// 向串口通信流中写一行字符
public void WriteLine(string text);
// 从串口通信流中读一行字符
public string ReadLine();
// 读取缓冲区中的所有可用内容,一般用于清空缓冲区,防止读取旧的内容
public string ReadExisting();
// 获取可用的串口名称
public static string[] GetPortNames();
}
串口通信的步骤
- 配置串口通信参数,如波特率,内容编码,新行格式,超时时间等。
SerialPort sp = new SerialPort(portName: "/dev/ttyUSB0")
{
BaudRate = 115200,
Encoding = Encoding.UTF8,
ReadTimeout = 500,
WriteTimeout = 500,
}
- 打开串口
sp.Open();
- 读取和写入文本
sp.WriteLine($"Text content.");
string content = sp.ReadLine();
- 关闭串口
sp.Close();
USB 串口通信实验
硬件需求
| 名称 | 数量 |
|---|---|
| USB 串口 | x1 |
| 杜邦线 | 若干 |
USB 串口设备只要 Raspberry Pi 支持即可,这里使用的是 FT232RL。
电路

- GND - GND
- RX - TX (Pin 8)
- TX - RX (Pin 10)
- USB - USB
使用 Docker 运行示例
示例地址:https://github.com/ZhangGaoxing/dotnet-core-iot-demo/tree/master/src/SerialCommunication
docker build -t serial-sample -f Dockerfile .
docker run --rm -it --device /dev/ttyUSB0 --device /dev/ttyS0 serial-sample
代码
- 打开 Visual Studio ,新建一个 .NET Core 控制台应用程序,项目名称为“SerialCommunication”。
- 引入 System.IO.Ports NuGet 包。
- 在 Program.cs 中,将主函数代码替换如下:
static void Main(string[] args)
{
using (SerialPort usb = new SerialPort(portName: "/dev/ttyUSB0"))
{
usb.BaudRate = 115200;
usb.Encoding = Encoding.UTF8;
usb.ReadTimeout = 500;
usb.WriteTimeout = 500;
usb.Open();
using (SerialPort rpi = new SerialPort(portName: "/dev/ttyS0"))
{
rpi.BaudRate = 115200;
rpi.Encoding = Encoding.UTF8;
rpi.ReadTimeout = 500;
rpi.WriteTimeout = 500;
rpi.Open();
for (int i = 0; i < 10; i++)
{
rpi.WriteLine($"Hello {i}!");
Console.WriteLine($"USB receive: {usb.ReadLine()}");
}
rpi.Close();
}
usb.Close();
}
}
- 发布、拷贝、更改权限、运行
效果图

供参考
- Universal asynchronous receiver-transmitter - Wikipedia:https://en.wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter
- Serial Communication - Wikipedia:https://en.wikipedia.org/wiki/Serial_communication
- BASICS OF UART COMMUNICATION:http://www.circuitbasics.com/basics-uart-communication/
- 波特率 - 百度百科:https://baike.baidu.com/item/波特率
张高兴的 .NET Core IoT 入门指南:(五)串口通信入门的更多相关文章
- 自动化测试入门指南(3)-- 入门demo
按照 自动化测试入门指南(2)-- 环境搭建搭建好环境后,我们继续一步步实现一个简单的入门例子 Step0. 安装Firefox浏览器(http://pan.baidu.com/s/1c00bw8g中 ...
- 张高兴的 .NET Core IoT 入门指南:(二)GPIO 的使用
什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即"通用输入输出". Raspberry Pi 有两行 GPIO 引脚, Rasp ...
- 张高兴的 .NET Core IoT 入门指南:(一)环境配置、Blink、部署
如何在 Raspberry Pi 的 Raspbian 上构建使用 GPIO 引脚的 IoT 程序?你可能会回答使用 C++ 或 Python 去访问 Raspberry Pi 的引脚.现在,C# 程 ...
- 张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信
什么是 SPI 和上一篇文章的 I2C 总线一样,SPI(Serial Peripheral Interface,串行外设接口)也是设备与设备间通信方式的一种.SPI 是一种全双工(数据可以两个方向同 ...
- 张高兴的 .NET Core IoT 入门指南:(三)使用 I2C 进行通信
什么是 I2C 总线 I2C 总线(Inter-Integrated Circuit Bus)是设备与设备间通信方式的一种.它是一种串行通信总线,由飞利浦公司在1980年代为了让主板.嵌入式系统或手机 ...
- 张高兴的 .NET Core IoT 入门指南:(五)PWM 信号输出
什么是 PWM 在解释 PWM 之前首先来了解一下电路中信号的概念,其中包括模拟信号和数字信号.模拟信号是一种连续的信号,与连续函数类似,在图形上表现为一条不间断的连续曲线.数字信号为只能取有限个数值 ...
- 张高兴的 Windows 10 IoT 开发笔记:串口红外编解码模块 YS-IRTM
This is a Windows 10 IoT Core project on the Raspberry Pi 2/3, coded by C#. GitHub: https://github.c ...
- Maven入门指南① :Maven 快速入门及简单使用
原文链接:http://www.cnblogs.com/luotaoyeah/archive/2014/06/02/3764533.html 开发环境 MyEclipse 2014 JDK 1.8 M ...
- Maven入门指南 :Maven 快速入门及简单使用
开发环境 MyEclipse 2014 JDK 1.8 Maven 3.2.1 1.什么是Maven? Maven是一个Java语言编写的开源项目管理工具,是Apache软件基金会的顶级项目.主要用于 ...
随机推荐
- Android数据列表展示之 RecylerView
一.概述 1.RecyclerView是什么? RecyclerView是一种新的视图组,目标是为任何基于适配器的视图提供相似的渲染方式.该控件用于在有限的窗口中展示大量数据集,它被作为ListVie ...
- nexus 私服 低配置服务器启动不能访问的问题
1核1G的渣渣服务器启动无法访问. 请更换更高配置的服务器.
- Netty源码分析 (九)----- 拆包器的奥秘
Netty 的解码器有很多种,比如基于长度的,基于分割符的,私有协议的.但是,总体的思路都是一致的. 拆包思路:当数据满足了 解码条件时,将其拆开.放到数组.然后发送到业务 handler 处理. 半 ...
- [VB.NET Tips]再谈字符串连接之内置池
CLR自动维护一个称为"内置池"(暂存池)(intern pool)的表,在编译时此表包含程序中声明的每个唯一的字符串常量的单个实例,以及以编程方式创建的String类的任何唯一实 ...
- loadrunner12下载、安装、认证、汉化
友情提示 推荐工具pandownload下载 本文尽可能地写得详细一些,有不懂的请先自行百度 安装过程中会有大量英文,可以用有道词典截图翻译 若你的电脑只有一个分区,则建议所有位置选择默认,或者根据个 ...
- 快速入门和使用HTML–使用Django建立你的第一个网站
一 前记 你每天浏览的网页,通过网络看的新闻,看着淘宝京东的绚丽多彩的界面.是否想过这个问题,它是怎么实现的呢?有没有搜过相关的知识呢?假如没有,假如你是一位对事物好奇的主或者是做计算机相关东西的人. ...
- Spring Boot 2.x基础教程:构建RESTful API与单元测试
首先,回顾并详细说明一下在快速入门中使用的@Controller.@RestController.@RequestMapping注解.如果您对Spring MVC不熟悉并且还没有尝试过快速入门案例,建 ...
- CF #579 (Div. 3) B.Equal Rectangles
B.Equal Rectangles time limit per test2 seconds memory limit per test256 megabytes inputstandard inp ...
- opencv边缘检测
人眼怎么识别图像边缘? 比如有一幅图,图里面有一条线,左边很亮,右边很暗,那人眼就很容易识别这条线作为边缘.也就是像素的灰度值快速变化的地方. sobel算子 sobel算子是一个离散差分算子. 图像 ...
- Python学习笔记整理总结【Django】【MVC/MTV/路由分配系统(URL)/视图函数 (views)/表单交互】
一.Web框架概述 Web框架本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python # -*- coding:utf-8 ...