在开始之前,首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中,而是在 System.IO.Ports NuGet 包中。之所以在这里介绍串口通信,是因为在嵌入式中串口通信是与其他设备进行交互的一种重要方式,而且在某些没有屏幕的设备中充当着程序调试的工具。

什么是串口

串口是串行接口的简称,这是一个非常大的概念,在嵌入式中串口通常指 UART (Universal Asynchronous Receiver/Transmitter,通用异步收发器)。使用串口进行的通信叫做串行通信,与之相对的一个概念是并行通信。串行通信是指数据一位一位的按顺序传输,而并行通信则是多位数据同时传输。如图1所示,DATA BUSUART 1 之间是并行通信,UART 1UART 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();
}

串口通信的步骤

  1. 配置串口通信参数,如波特率,内容编码,新行格式,超时时间等。
SerialPort sp = new SerialPort(portName: "/dev/ttyUSB0")
{
BaudRate = 115200,
Encoding = Encoding.UTF8,
ReadTimeout = 500,
WriteTimeout = 500,
}
  1. 打开串口
sp.Open();
  1. 读取和写入文本
sp.WriteLine($"Text content.");
string content = sp.ReadLine();
  1. 关闭串口
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

代码

  1. 打开 Visual Studio ,新建一个 .NET Core 控制台应用程序,项目名称为“SerialCommunication”。
  2. 引入 System.IO.Ports NuGet 包。
  3. 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();
}
}
  1. 发布、拷贝、更改权限、运行

效果图

供参考

  1. Universal asynchronous receiver-transmitter - Wikipedia:https://en.wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter
  2. Serial Communication - Wikipedia:https://en.wikipedia.org/wiki/Serial_communication
  3. BASICS OF UART COMMUNICATION:http://www.circuitbasics.com/basics-uart-communication/
  4. 波特率 - 百度百科:https://baike.baidu.com/item/波特率

张高兴的 .NET Core IoT 入门指南:(五)串口通信入门的更多相关文章

  1. 自动化测试入门指南(3)-- 入门demo

    按照 自动化测试入门指南(2)-- 环境搭建搭建好环境后,我们继续一步步实现一个简单的入门例子 Step0. 安装Firefox浏览器(http://pan.baidu.com/s/1c00bw8g中 ...

  2. 张高兴的 .NET Core IoT 入门指南:(二)GPIO 的使用

    什么是 GPIO GPIO 是 General Purpose Input Output 的缩写,即"通用输入输出". Raspberry Pi 有两行 GPIO 引脚, Rasp ...

  3. 张高兴的 .NET Core IoT 入门指南:(一)环境配置、Blink、部署

    如何在 Raspberry Pi 的 Raspbian 上构建使用 GPIO 引脚的 IoT 程序?你可能会回答使用 C++ 或 Python 去访问 Raspberry Pi 的引脚.现在,C# 程 ...

  4. 张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信

    什么是 SPI 和上一篇文章的 I2C 总线一样,SPI(Serial Peripheral Interface,串行外设接口)也是设备与设备间通信方式的一种.SPI 是一种全双工(数据可以两个方向同 ...

  5. 张高兴的 .NET Core IoT 入门指南:(三)使用 I2C 进行通信

    什么是 I2C 总线 I2C 总线(Inter-Integrated Circuit Bus)是设备与设备间通信方式的一种.它是一种串行通信总线,由飞利浦公司在1980年代为了让主板.嵌入式系统或手机 ...

  6. 张高兴的 .NET Core IoT 入门指南:(五)PWM 信号输出

    什么是 PWM 在解释 PWM 之前首先来了解一下电路中信号的概念,其中包括模拟信号和数字信号.模拟信号是一种连续的信号,与连续函数类似,在图形上表现为一条不间断的连续曲线.数字信号为只能取有限个数值 ...

  7. 张高兴的 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 ...

  8. Maven入门指南① :Maven 快速入门及简单使用

    原文链接:http://www.cnblogs.com/luotaoyeah/archive/2014/06/02/3764533.html 开发环境 MyEclipse 2014 JDK 1.8 M ...

  9. Maven入门指南 :Maven 快速入门及简单使用

    开发环境 MyEclipse 2014 JDK 1.8 Maven 3.2.1 1.什么是Maven? Maven是一个Java语言编写的开源项目管理工具,是Apache软件基金会的顶级项目.主要用于 ...

随机推荐

  1. GO 语言学习笔记--数组切片篇

    1.对于make 数组切片,长度和容量需要理解清楚: 容量表示底层数组的大小,长度是你可以使用的大小: 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否 ...

  2. 【第二十二篇】从客户端中检测到有潜在危险的 Request.Form 值

    提交数据的时候  用js的方法   escape(富文本框的值)    例:escape(UM.getEditor('Content').getContent()); 取值的时候   unescape ...

  3. win7 安装mysql5.7

    Windows 64 位 mysql 5.7以上版本包解压中没有data目录和my-default.ini以及服务无法启动的解决办法以及修改初始密码的方法 LZ初学SQL,本来以为开源的安装很简单,但 ...

  4. 一些简单的Linux命令(centos修改网络ip,修改主机名)

    环境:linux centos 7 vi /etc/sysconfig/network-scripts/ifcfg-enp3s0f0 可以修改网关地址,网络IP地址,子网地址等等 [root@loca ...

  5. SSM相关面试题(简答)

    1.springmvc的执行    流程: 2.mybstis的执行流程: 3.ioc和DI的理解: 4.对aop的理解: 5.spring中常见的设计模式: 6.spring中声明式事务处理的配置: ...

  6. 基于STC89C52的oled红外遥控闹钟

    这个红外遥控主要是程序通过对按下的键的键码进行解析,并运行相应的功能代码 一次按键动作的遥控编码信息为 32 位串行二进制码.对于二进制信号“0”,一个脉冲占 1.2ms:对于二进制信号“1”,一个脉 ...

  7. Visual Studio Code安装以及C/C++运行环境搭建

    众所周知VSCode是全宇宙最好用的编辑器 (雾 配置了很久,今日终于配置完成了,还是有点麻烦的,本文是为了方便一些不懂怎么配置的小白,以及还有一些美化教程. 一.安装 Visual Studio C ...

  8. 04: OpenGL ES 基础教程03 纹理

    前言 1:常用类: 1:纹理的作用 正文 一:常用类 上下文 顶点数据缓存 着色器 baseEffect 一:纹理 1.1:   纹理可以控制渲染的每个像素的颜色. 1.2: 纹素:与像素一样,保存每 ...

  9. 完整SpringBoot Cache整合redis缓存(二)

    缓存注解概念 名称 解释 Cache 缓存接口,定义缓存操作.实现有:RedisCache.EhCacheCache.ConcurrentMapCache等 CacheManager 缓存管理器,管理 ...

  10. 浅谈 Vector

    目录 浅谈Vector 1.容器基本操作 2.vector 初始化 3.vector的赋值与swap 4.vector的增删改除 1.增加元素 2.访问元素 3.删除元素 4.元素的大小 浅谈Vect ...