在开始之前,首先要说明的是串口通信所用到的 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();
}

串口通信的步骤

  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. 发布、拷贝、更改权限、运行

效果图


备注

下一篇文章将谈谈 Iot.Device.Bindings NuGet 包的使用。

张高兴的 .NET Core IoT 入门指南:(五)串口通信入门相关推荐

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

    张高兴的 .NET Core IoT 入门指南:(四)使用 SPI 进行通信 什么是 SPI 和上一篇文章的 I2C 总线一样,SPI(Serial Peripheral Interface,串行外设 ...

  2. 张高兴的 .NET Core IoT 入门指南:(六)串口通信入门

    在开始之前,首先要说明的是串口通信所用到的 SerialPort 类并不包含在 System.Device.Gpio NuGet 包中,而是在 System.IO.Ports NuGet 包中.之所以 ...

  3. 入门指南_Spring Boot2: 快速入门指南

    Spring Boot2: 快速入门指南 简述 对于之前的Spring框架的使用,各种配置文件XML.properties一旦出错之后错误难寻 这也是为什么Spring Boot被推上主流的原因,现在 ...

  4. python入门指南-python3.6.0入门指南(官方版).pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspPython python3.6.0入门指南(官方版).pdf7 ...

  5. python入门指南-Python完全小白入门指南

    前几天整理了Linux的入门材料Linux运维完全小白入门指南,趁着这热乎劲,又整理了一下自己学Python时候的资料,今天也一并分享出来. 还是之前的说过的,这里只适合初级或者未入门的小白,想看高阶 ...

  6. python入门指南-Python 30分钟入门指南

    Part0:环境安装 Windows 访问Python官网,下载并安装. 使用交互式界面,在开始菜单打开Python3 IDLE即可. 您也可以新建一个filename.py的文件,写上Python脚 ...

  7. python3入门指南_Python 3.4入门指南

    Python3.4 入门指南? Release:3.4 Date:March 29, 2014 Python 是一门简单易学且功能强大的编程语言. 它拥有高效的高级数据结构,并且能够用简单而又高效的方 ...

  8. 【Go语言入门指南】零基础入门 go 语言 | Golang 入门指南

    文章目录 写在前面 全部练习项目都在github这个仓库中`https://github.com/CocaineCong/Golang-Learning` 1. [第一轮]基础部分 1.1 教程 1. ...

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

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

最新文章

  1. 继往开来!目标检测二十年技术综述
  2. 夏季编辑系统的联想感觉
  3. VS2013 编译程序时提示 无法查找或打开 PDB 文件
  4. ae saber插件_入门AE:影视特效中的黑洞是怎么做的?附带教程
  5. 人工智能写小说python_1月下旬值得一读的10本技术新书(人工智能、C++、Python数据科学等)!文末有福利!...
  6. 机器学习入门——机器学习基础概念
  7. HTML实现在线取色器
  8. 激光锡焊在SMA连接器领域的应用
  9. 八种颠覆未来作战的前沿技术
  10. Xshell颜色及PS1
  11. python读matlab.fig_从fig文件中读取数据
  12. 智邦国际CRM系统实现企业信息化管理成功实施
  13. Elasticsearch:使用向量搜索来查询及比较文字 - NLP text embedding
  14. 大数据查询语句SQL
  15. 初中不读学计算机难吗,为什么初中生更加适合学习计算机编程?
  16. 服务器新建虚拟机不识别u盘,虚拟机无法识别u盘如何解决_虚拟机中无法识别u盘的处理办法...
  17. CSS font-size单位
  18. 黑客搜索大法(Google Hacking)
  19. PyCharm许可证过期解决方案
  20. 用计算机弹了,如何用计算器弹奏流行歌曲(图文教学),你需要学习了

热门文章

  1. SQL server 2000安装时提示我”以前的某个程序安装已在安装计算机上创建挂起的文件操作....”...
  2. 攻防 logmein_如何使用LogMeIn Hamachi在任何地方访问文件
  3. winform 线程监听两个目录下的文件_vb.net 利用.net自带的GZipStream压缩或者解压文件的代码,不需要任何第三方控件...
  4. 腾讯云DevOps技术揭秘:新时代运维重器Tencent Hub最佳实践
  5. 深度挖掘 Laravel 生命周期
  6. 抽象工厂模式(Absraact Factory)介绍与实现
  7. little tricks(持续更新)【python】
  8. Devuan Jessie beta 释出
  9. Emoji:搜索将与您找到表情符号背后的故事
  10. 【Silverlight5矢量打印】如何用C#代码检测打印机和驱动是否支持PostScript