在开始之前,首先要说明的是串口通信所用到的 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. 实验吧CTF练习题---WEB---FALSE解析

    实验吧web之FALSE 地址:http://www.shiyanbar.com/ctf/1787 flag值:CTF{t3st_th3_Sha1}   解题步骤: 1.点开题目链接,观察题意 2.题 ...

  2. MySQL5.7初始化后5种密码重置方法

    前言:由于好几次安装MySQL5.7后一直被重置密码所困扰,因此特意整理重置的方法 安装MySQL5.7 [root@node1 db]# ll 以下的rpm安装包可以随处下载 total 40235 ...

  3. Python中使用pip安装库时指定镜像源为豆瓣镜像源

    场景 在使用pip进行安装库时,使用默认的库会很慢,甚至有时会出现远程主机中断了一个现有连接. 怎样在使用pip install 时指定镜像源为豆瓣镜像源. 实现 pip install moviep ...

  4. 控制执行流程之ForEach语法

    1.定义 : 一种更加简洁的for语法,用于数组和容器===>>>foreach,无需创建int类型变量对被访问项构建的序列进行计数. 2.经典应用:  对于数组的初始化,如果选用f ...

  5. 关于读写APP.config文件能读却写不了的问题

    今天要求用winform写一个窗口用来读写一个App.config,要对  <appSettings>里面的add key和value进行添加和修改.要实现的效果图如下: -------- ...

  6. js/jquery去掉空格,回车,换行

    Jquery:$("#accuracy").val($("#accuracy").val().replace(/\ +/g,""));//去 ...

  7. 使用Nexus3搭建Maven私服

    1.搭建Maven私服背景 公司还是按捺不住,要搭建一个自己的Maven本地仓库,可以让开发人员down架包,从内网还是快很多. 这样公司的maven本地仓库就是 开发人员自己电脑上的maven仓库 ...

  8. 从 Int 到 Integer 对象,细细品来还是有不少东西

    int 是 Java 八大原始类型之一,是 Java 语言中为数不多不是对象的东西,Integer 是 int 的包装类,里面使用了一个 int 类型的变量来存储数据,提供了一些整数之间的常用操作,常 ...

  9. sublime_REPL使用及安装教程(解决Sublime无交互问题)

    谈到python编程工具能想到那些? pycharm?IDLE? Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等,还可自定义键绑定,菜单和工具栏. ...

  10. Spring MVC-从零开始-view-向页面传递data(ModelAndView与ModelMap的区别)

    1.ModelMap的用法 package com.jt; import org.springframework.stereotype.Controller; import org.springfra ...