Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >张高兴的 .NET IoT 入门指南:(六)串口通信入门

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

作者头像
张高兴
发布于 2025-05-21 05:48:28
发布于 2025-05-21 05:48:28
11700
代码可运行
举报
文章被收录于专栏:张高兴的博客张高兴的博客
运行总次数:0
代码可运行

在开始之前,首先要说明的是串口通信所用到的 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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
SerialPort sp = new SerialPort(portName: "/dev/ttyUSB0")
{
    BaudRate = 115200,
    Encoding = Encoding.UTF8,
    ReadTimeout = 500,
    WriteTimeout = 500,
}
  1. 打开串口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sp.Open();
  1. 读取和写入文本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sp.WriteLine($"Text content.");
string content = sp.ReadLine();
  1. 关闭串口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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/波特率
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 土味儿编程 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RS232 串行通信:C++ 实现指南
在现代嵌入式系统和工业控制领域,RS232 串行通信仍然是一种不可或缺的技术。尽管 USB 和以太网等高速通信技术已经广泛应用,但在一些需要低速、简单通信的场景中,RS232 仍然是首选。本文将详细介绍如何在 C++ 中实现与 RS232 的通信,包括 Windows 和 Linux 平台的实现方法。
码事漫谈
2025/04/21
1410
RS232 串行通信:C++ 实现指南
张高兴的 MicroPython 入门指南:(三)使用串口通信
串口是串行接口的简称,这是一个非常大的概念,在嵌入式中串口通常指 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)。使用串口进行的通信叫做串行通信,与之相对的一个概念是并行通信。串行通信是指数据一位一位的按顺序传输,而并行通信则是多位数据同时传输。如下图所示,DATA BUS 到 UART 1 之间是并行通信,UART 1 到 UART 2 之间是串行通信。
张高兴
2025/05/21
1120
张高兴的 MicroPython 入门指南:(三)使用串口通信
Python串口通信案例
本次分享利用Python模拟串口通信案例。当前编程环境,并没有办法接好下位机平台,需要模拟出一个串口,不断发送、接收信息的过程。
用户8949263
2022/11/07
4.4K0
Python串口通信案例
C#实例:串口通讯
 最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信。它很简单的就可以进行连接,由于串口通讯是异步的,也就是说你可以同时向两端或者更多进行数据发送,它们之间的传输数据类型是byte,串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。
zls365
2020/08/19
3.7K1
C#实例:串口通讯
MCU常见通信总线串讲(一)—— UART和USART
首先明确一个概念,关于MCU中通信总线和通信协议,通信总线是一种用于连接各种外设和模块的物理接口,它可以传输数据和控制信息。通信协议则是指在通信总线上传输数据时所遵循的规则和约定,以确保不同设备之间能够正确地交换信息,我们也可以把他叫做通信总线协议。
秋名山码神
2023/11/08
3K0
MCU常见通信总线串讲(一)—— UART和USART
初识Android串口通信(一)
因为平时工作是基于串口通信开发,之前群里有人问串口通信怎么搞,正好自己也想总结一下平时开发经验,便准备写几篇关于串口通信的文章。
Coder昊白
2023/11/22
2.2K0
C#中的串口通信
串行接口按电气标准及协议来分,包括RS-232-C、RS-422、RS485、USB等。 RS-232-C、RS-422与RS-485标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。USB是近几年发展起来的新型接口标准,主要应用于高速数据传输领域。  RS-232-C :也称标准串口,是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。传统的RS-232-C接口标准有22根线,采用标准25芯D型插头座。自IBM PC/AT开始使用简化了的9芯D型插座。至今25芯插头座现代应用中已经很少采用。电脑一般有两个串行口:COM1和COM2,9针D形接口通常在计算机后面能看到。现在有很多手机数据线或者物流接收器都采用COM口与计算机相连。
跟着阿笨一起玩NET
2018/09/20
2.9K0
C#中的串口通信
C# 串口通讯SerialPort
这个只是对SerialPort进行简单的使用,对串口设备进行简单数据的发送和数据的接收,调用几个方法就可以完成串口的通讯,但是没有设备去实验还是感觉不好的。这里我使用了虚拟串口软件和串口调试助手(用来验证串口是否接收到数据)
MaybeHC
2024/04/23
2210
C# 串口通讯SerialPort
C#串口操作类,包括串口读写操作
本文转载自博客园:C#串口操作类,包括串口读写操作 串口进行操作的类,其中包括写和读操作,类可设置串口参数、设置接收函数、打开串口资源、关闭串口资源,操作完成后,一定要关闭串口、接收串口数据事件、接收数据出错事件、获取当前全部串口、把字节型转换成十六进制字符串等功能。这个串口类已经过了调试,可以使用,相关C#代码如下:
ccf19881030
2020/09/17
4.7K0
硬件知识:串口通信基础知识介绍
在通信和计算机科学中,串行通信(Serial Communication)是一个通用概念,泛指所有的串行的通信协议,如RS232、RS422、RS485、USB、I2C、SPI等。
小明互联网技术分享社区
2023/01/08
3.7K0
硬件知识:串口通信基础知识介绍
(十三)STM32——串口通信(UART)
目录 学习目标 内容 通信方法 并行通信 串行通信 通信方向 通信方式  UART 特点 串口参数 通信流程 寄存器 USART_SR USART_DR  USART_BRR 过程 代码 运行结果 运行结果 遇到的问题 总结  ---- 学习目标         本节我们要学习的的是STM32的通信部分,主要介绍UART(通用异步收发器),是一种异步、全双工的通信方式。 内容         首先,我们先来介绍一下通信的基本知识,之前在51单片机的学习中我们也接触过UART,在此就不做详细介绍,感兴
小点点
2022/12/12
1.9K0
(十三)STM32——串口通信(UART)
C#实现Modbus RTU主站通信(一)
编程笔记in
2025/05/07
4170
C#实现Modbus RTU主站通信(一)
一文搞懂UART通信协议
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信总线,仅用一根数据接收线和一根数据发送线就能实现全双工通信。典型的串口通信使用3根线完成,分别是:发送线(TX)、接收线(RX)和地线(GND),通信时必须将双方的TX和RX交叉连接并且GND相连才可正常通信,如下图所示:
不脱发的程序猿
2022/09/23
9.5K0
一文搞懂UART通信协议
Android串口入门
1. Andorid串口开发包一般使用google多年前提供的android-serialport-api, 提供自用分支
Zeal
2020/11/10
3K0
WPF入门到放弃(四)| 给串口调试助手列表赋值(附调试软件)
WPF也是我今年刚开始深入去了解,看了不少的学习视频和书籍,受剑神Python入门到放弃的启发,想把这段时间学习内容做个总结,一是因为我相信技术总是需要不断的总结与练习才能有所进步,二是希望帮助初学者对WPF有个初步的了解,大家一起探讨学习进步。
剑指工控
2021/11/09
1.3K0
树莓派基础实验37:pyserial模块通信实验
  串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种非常通用的设备通信协议,pyserial模块封装了python对串口的访问,为多平台的使用提供了统一的接口。
张国平
2020/09/27
3.1K0
STM32F103学习笔记三 串口通信
本文参照正点原子STM32F1xx官方资料:《STM32中文参考手册V10》-第25章通用同步异步收发器(USART) 及 【STM32】串口通信基本原理(超基础、详细版) 单片机入门学习十 STM32单片机学习七 串口通讯
全栈程序员站长
2022/11/07
2.2K0
【Unity3D】Unity3d 与串口的通信程序的开发,软件硬件结合
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。(至于再详细,自己百度)
恬静的小魔龙
2020/03/11
2.7K0
【Unity3D】Unity3d 与串口的通信程序的开发,软件硬件结合
stm32串口工作原理_rs232串口通信原理
在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通讯中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样。
全栈程序员站长
2022/10/04
1.2K0
stm32串口工作原理_rs232串口通信原理
“Unity开发也能跟硬件联动”--快来看看吧(串口通信)
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。(至于再详细,自己百度)
恬静的小魔龙
2022/08/07
2K0
“Unity开发也能跟硬件联动”--快来看看吧(串口通信)
相关推荐
RS232 串行通信:C++ 实现指南
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验