6. 串口通信
6.1 串口通信介绍
串口是指外设和处理器之间通过数据信号线、地线和控制线等,按位进行传输数据的一种通讯方式。尽管传输速度比并行传输低。但串口可以在使用一根线发送数据的同时用另一根线接收数据。 这种通信方式使用的数据线少,在远距离通信中可以节约通信成本。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验位,这些参数在两个通信端口之间必须一致。
6.2 串口通信参数介绍
串口通信参数包括波特率(Baud Rate)、数据位(Data Bits)、校验位(Parity Bits)、停止位(Stop Bits)等。这些参数描述了传输数据的基本规格。例如,波特率定义了数据传输的速率,数据位确定每个数据字节中包含的位数,校验位用于数据的差错检测,停止位表示数据传输结束的标志等。
- 波特率:衡量通信速度的参数,它表示每秒钟传送的 bit 的个数。
- 数据位:衡量通信中实际数据位的参数,表示一个信息包里包含的数据位的个数。
- 停止位:用于表示单个信息包的最后位,典型值为 1、1.5 和 2 位。由于数据是在传输线上传输的,每个设备都有自己的时钟,很有可能在通信过程中出现不同步,停止位不仅仅表示传输的结束,还能提供校正时钟同步的机会。停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率也越慢。
- 奇偶检验位:表示一种简单的检查错误的方式。
关于更为详细的介绍请搜索百度。
6.3 串口工作模式
串口工作模式分为三种:单工、全双工模式和半双工模式。
- 单工:在通信的任意时刻,信息只能由 A 传到 B,或B传到A;
- 半双工:在通信的任意时刻,信息即可由 A 传到 B,又能由 B 传到 A,但同时只能有一个方向上的传输存在;
- 全双工:在通信的任意时刻,通信线路上存在 A 到 B 和 B 到 A 的双向信号传输;
6.4 串口通信协议
串口通信协议定义了在串口上进行数据交换的规则和格式。常见的串口通信协议包括ASCII协议、Modbus协议、RS-232协议等。协议规定了数据的帧结构、数据格式、校验方式等,确保发送和接收双方按照相同的规则进行数据交换,从而实现数据的正确传输和解析。
串口通信是一位一位地传输,每传输一个字符总是以起始位开始,以停止位结束,字符之间没有固定的时间间隔要求。每一个字符的前面都有一位起始位(低电平),后面由 7 位数据位组成,接着是一位校验位,最后是停止位。停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。
6.5 串口通信的作用及优势
串口是计算机和外部设备之间最常见的通信接口之一,具有重要的作用和广泛的应用。在计算机领域,串口的重要性体现在以下几个方面:
- 数据传输:串口是一种常用的数据传输接口。通过串口,计算机可以与各种外部设备进行数据交换和通信。无论是传感器、执行器、显示器、打印机还是其他外部设备,串口通信都可以实现数据的传输和控制。
- 远程控制和监控:串口通信被广泛应用于远程控制和监控领域。通过串口,计算机可以远程控制设备的动作,并实时监测设备的状态和数据信息。这在工业控制、自动化系统、远程监控等场景中具有重要的作用。
- 调试和故障排查:串口通信是调试和故障排查的重要工具。通过串口,计算机可以与嵌入式系统、单片机等进行通信,实时监控和调试程序,输出调试信息,进行错误定位和排查,并对系统进行状态监测和故障诊断。
- 硬件连接:串口可以作为计算机与各种外部设备之间的连接桥梁。通过串口,可以连接和控制各类外部设备,如传感器、执行器、外围设备等。串口能够提供稳定的数据传输和双向通信功能。
- 通信协议:串口通信协议是计算机与外部设备之间数据传输的规范和约定。通过定义不同的协议,可以实现不同设备之间的数据交互和通信。常见的串口通信协议有UART、RS-232、RS-485等。
总之,串口对于计算机和外部设备之间的通信具有重要的作用。它是数据传输、远程控制和监控、调试和故障排查的关键工具,是计算机与外部设备连接和通信的桥梁。通过串口通信,可以实现与各种外部设备的数据交互,提高系统的功能和性能。具体到串口通信的作用和优势,可以总结如下:
- 数据传输:串口通信可以实现双向数据的可靠传输,包括发送和接收各种类型的数据。
- 远程控制和监控:通过串口通信,可以实现远程控制设备的动作,并实时监测设备的状态和数据信息。
- 调试和故障排查:串口通信是调试和故障排查的重要工具,可以实时监控和调试程序,输出调试信息,进行错误定位和排查。
- 灵活性和实时性:串口通信具有较高的灵活性和实时性,可以根据需求调整波特率和参数,并及时处理数据和响应外部事件。
- 成本效益:串口通信使用简单、成本低廉的硬件,并且广泛应用于各个领域,是一种经济实用的通信方式。
总之,串口通信在数据传输、远程控制与监控、调试和故障排查等方面具有重要的作用和诸多优势,是实现设备间数据交互和系统功能的重要手段。
6.6 串口通信原理图
ESP32S3有三个串口,即 UART0、UART1、UART2。其中,开发板的串口0已经用于自动下载与调试部分,故在实际应用中不建议使用串口0与其他设备通信。
我们可以使用 UART1(串口1)、串口2(UART2) 与外部串口设备进行通信。除串口0外,串口引脚与其他外设一样,可以使用任意的GPIO作为通信引脚。
6.7 串口通信驱动流程
在 MicroPython 中,使用 ESP32 进行串口通信的流程如下:
- 导入相应的模块和库
import machine
- 初始化串口对象
uart = machine.UART(uart_number, baudrate=baudrate)
其中 uart_number 是你要使用的 UART 串口号,例如 1 表示 UART1,2 表示 UART2,以此类推。baudrate 是串口波特率,指定通信速率。端口还能支持的其他仅关键字参数包括:
- tx指定要使用的 TX 引脚。
- rx指定要使用的 RX 引脚。
- 例如:
#初始化串口1 波特率为115200 TX引脚为GPIO10 RX引脚为GPIO9
uart1 = UART(1, baudrate=115200, tx=10, rx=9)
2
- 使用 write() 方法向串口发送数据
uart.write(data)
其中 data 是要发送的数据,可以是字符串或字节数据。
- 使用 read() 方法从串口接收数据
data = uart.read(size)
其中 size 是要接收的数据字节数。
完整的串口通信示例代码如下:
import machine
uart = machine.UART(1, baudrate=115200, tx=10, rx=9)
# 发送数据
uart.write("Hello, UART!")
# 接收数据
data = uart.read(10)
print(data)
2
3
4
5
6
7
8
9
10
11
在上述示例中,我们初始化了 UART1 接口,设置波特率为 115200,TXD引脚为GPIO10,RXD引脚为GPIO9。然后,我们使用 write() 方法向串口发送了字符串 “Hello, UART!”。之后,我们使用 read() 方法读取了 10 个字节的数据,并将其打印出来。其他关于串口的详细资料说明见MicroPython官方文档:
http://www.86x.org/en/latet/library/machine.UART.html
6.8 硬件连接与准备
本案例使用常用的模块CH340,将开发板和电脑连接,测试串口通信功能。
CH340是一种USB转串口芯片,常用于微型控制器、单片机、Arduino的USB转串口功能,也可用于USB数据收发。使用CH340模块时,需要安装对应的驱动程序,来使得计算机能够识别CH340芯片的串口输出。对于Windows系统,驱动程序通常会自动安装;对于Mac和Linux系统,需要下载安装相应的驱动程序支持才能使用。
CH340模块通常有CH340G和CH340E两种型号,其中CH340G在0°C到70°C的工作温度范围内工作,而CH340E则在-40°C到85°C的温度范围内工作。这两种型号都支持多种波特率和数据位、停止位的选项,以适应不同的串口通信需求。CH340模块在使用上较为便捷,连接电脑和开发板后后,只需要通过串口发送指令即可实现与单片机的通信。其优点是接口简单、价格低廉、 驱动程序方便使用等,因此在开发过程以及需要与计算机通信的各种项目中被广泛使用。
实物连接如下图:
6.9 串口通信验证
from machine import UART
import time
#初始化串口1 波特率为115200 TX引脚为GPIO10 RX引脚为GPIO9
uart1 = UART(1, baudrate=115200, tx=10, rx=9)
while True:
#通过串口1发送字符串
uart1.write('Hello World!\r\n')
#读取串口1接收的数据量,如果不为0说明接收到数据
while(uart1.any()):
#将串口中的数据读取出来保存到data里
data = uart1.read()
#通过IDE调试器输出串口接收到的值
print(data)
time.sleep_ms(1000)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
6.10 串口通信效果
开发板上电通过串口1输出"Hello World",然后串口0和串口1可以互发数据