欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-14 16:49:16
在开始之前,首先要说明的是串口通信所用到的 类并不包含在 NuGet 包中,而是在 NuGet 包中。之所以在这里介绍串口通信,是因为在嵌入式中串口通信是与其他设备进行交互的一种重要方式,而且在某些没有屏幕的设备中充当着程序调试的工具。 什么是串口 串口是串行接口的简称,这是一个非常大的概念,在嵌入 ......

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

什么是串口

串口是串行接口的简称,这是一个非常大的概念,在嵌入式中串口通常指 uart (universal asynchronous receiver/transmitter,通用异步收发器)。使用串口进行的通信叫做串行通信,与之相对的一个概念是并行通信。串行通信是指数据一位一位的按顺序传输,而并行通信则是多位数据同时传输。如图1所示,data busuart 1 之间是并行通信,uart 1uart 2 之间是串行通信。

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

图1:

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

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

图2:串口通信的数据帧

设备进行串口通信时,设备的连线如图3所示,两个设备的信号线,即发送端(txd)与接收端(rxd)交叉相连,并且需要共地。在 raspberry pi 的引脚上共引出了 1 组串口,即 uart 0 ,对应 8 和 10 号引脚。

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

图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

电路

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

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

效果图

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


  备注

下一篇文章将谈谈 iot.device.bindings nuget 包的使用。