前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >张高兴的 .NET Core IoT 入门指南:(五)串口通信入门

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

作者头像
张高兴
发布2019-10-21 18:18:22
1.9K0
发布2019-10-21 18:18:22
举报
文章被收录于专栏:张高兴的博客张高兴的博客

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

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

代码语言:javascript
复制
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 中,将主函数代码替换如下:
代码语言:javascript
复制
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. 发布、拷贝、更改权限、运行

效果图

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-10-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是串口
  • 相关类
    • SerialPort
    • 串口通信的步骤
    • USB 串口通信实验
      • 硬件需求
        • 电路
          • 使用 Docker 运行示例
            • 代码
              • 效果图
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档