单片机/MCUwilliam hill官网
直播中

jf_85110202

未满1年用户 229经验值
擅长:嵌入式技术 开发板 仪表仪器 单片机
私信 关注
[文章]

《DNESP32S3使用指南-IDF版_V1.6》第十三章 UART实验

第十三章 UART实验
本章将介绍使用串口进行数据的收发操作,具体实现ESP32-S3与上位机软件的数据通信ESP32-S3将接受自上位机软件的数据原原本本地发送回给上位机软件。通过本章的学习,开发者将学习到UARTGPIO引脚的使用。
本章分为如下几个小节:
13.1 串口简介
13.2 硬件设计
13.3 程序设计
13.4 下载验证
13.1 串口简介
学习串口前,我们先来了解一下数据通信的一些基础概念。
13.1.1 数据通信的基础概念
单片机的应用中,数据通信是必不可少的一部分,比如:单片机和上位机、单片机和外围器件之间,它们都有数据通信的需求。由于设备之间的电气特性、传输速率、可靠性要求各不相同,于是就有了各种通信类型、通信协议,我们最常的有:USARTIICSPICANUSB等。下面,我们先来学习数据通信的一些基础概念。
1,数据通信方式
按数据通信方式分类,可分为串行通信和并行通信两种。串行和并行的对比如下图所示:
第十三章 UART实验432.png
13.1.1.1 数据传输方式
串行通信的基本特征是数据逐位顺序依次传输,优点是传输线少、布线成本低、灵活度高优点,一般用于近距离人机交互特殊处理后也可以用于远距离,缺点就是传输速率低。
而并行通信是数据各位可以通过多条线同时传输,优点是传输速率高,缺点就是布线成本高,抗干扰能力差因而适用于短距离、高速率的通信。
2,数据传输方向
根据数据传输方向,通信又可分为全双工、半双工和单工通信。全双工、半双工和单工通信的比较如下图所示:
第十三章 UART实验654.png
s13.1.1.2 数据传输方式
单工是指数据传输仅能沿一个方向,不能实现反方向传输,如校园广播
半双工是指数据传输可以沿着两个方向,但是需要分时进行,如对讲机
全双工是指数据可以同时进行双向传输,日常的打电话属于这种情形。
这里注意全双工和半双工通信的区别:半双工通信是共用一条线路实现双向通信,而全双工是利用两条线路,一条用于发送数据,另一条用于接收数据。
3,数据同步方式
根据数据同步方式,通信又可分为同步通信和异步通信。同步通信和异步通信比较如下图所示:
第十三章 UART实验892.png
13.1.1.3 数据同步方式
同步通信要求通信双方共用同一时钟信号,在总线上保持统一的时序和周期完成信息传输。优点:可以实现高速率、大容量的数据传输,以及点对多点传输。缺点:要求发送时钟和接收时钟保持严格同步,收发双方时钟允许的误差较小,同时硬件复杂。
异步通信不需要时钟信号,而是在数据信号中加入开始位和停止位等一些同步信号,以便使接收端能够正确地将每一个字符接收下来,某些通信中还需要双方约定传输速率优点:没有时钟信号硬件简单,双方时钟可允许一定误差。缺点:通信速率较低,只适用点对点传输
4,通信速率
在数字通信系统中,通信速率(传输速率)指数据在信道中传输的速度,它分为两种:传信率和传码率。
传信率:每秒钟传输的信息量,即每秒钟传输的二进制位数,单位为bit/s(即比特每秒),因而又称为比特率
传码率:每秒钟传输的码元个数,单位为Baud(即波特每秒),因而又称为波特率
比特率波特率这两个概念又常常被人们混淆。比特率很好理解,我们来看看波特率,波特率被传输的是码元,码元是信号被调制后的概念,每个码元都可以表示一定bit的数据信息量。举个例子,在TTL电平标准的通信中,用0V表示逻辑05V表示逻辑1,这时候这个码元就可以表示两种状态。如果电平信号0V2V4V6V分别表示二进制数00011011,这时候每一个码元就可以表示四种状态。
由上述可以看出,码元携带一定的比特信息,所以比特率和波特率也是有一定的关系的。
比特率和波特率的关系可以用以下式子表示:
比特率 = 波特率 * log2M
其中M表示码元承载的信息量。我们也可以理解M为码元的进制数。
举个例子:波特率为100 Baud,即每秒传输100个码元,如果码元采用十六进制编码(即M=16,代入上述式子),那么这时候的比特率就是400 bit/s。如果码元采用二进制编码(即M=2,代入上述式子),那么这时候的比特率就是100 bit/s
可以看出采用二进制的时候,波特率和比特率数值上相等。但是这里要注意,它们的相等只是数值相等,其意义上不同,看波特率和波特率单位就知道。由于我们的所用的数字系统都是二进制的,所以有部分人久而久之就直接把波特率和比特率混淆了。
13.1.2 串口通信协议简介
串口通信是一种设备间常用的串行通信方式,串口按位(bit)发送和接收字节。尽管比特字节byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括RS-232RS-422RS-485
随着科技的发展,RS-232在工业上还有广泛的使用,但是在商业技术上,已经慢慢的使用USB转串口取代了RS-232串口。我们只需要在威廉希尔官方网站 中添加一个USB转串口芯片,就可以实现USB通信协议和标准UART串行通信协议的转换,而我们开发板上的USB转串口芯片是CH340C这个芯片。关于USB转串口芯片的原理图请看13.2小节。
下面我们来学习串口通信协议,这里主要学习串口通信的协议层。
串口通信的数据包由发送设备的TXD接口传输到接收设备的RXD接口。在串口通信的协议层中,规定了数据包的内容,它由起始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其组成如图13.1.2.1所示。
第十三章 UART实验2372.png

13.1.2.1 串口通信协议数据帧格式
串口通信协议数据包组成可以分为波特率和数据帧格式两部分。
1,波特率
本章主要讲解的是串口异步通信,异步通信是不需要时钟信号的,但是这里需要我们约定好两个设备的波特率。波特率表示每秒钟传送的码元符号的个数,所以它决定了数据帧里面每一个位的时间长度。两个要通信的设备的波特率一定要设置相同,我们常见的波特率是48009600115200等。
2,数据帧格式
数据帧格式需要我们提前约定好,串口通信的数据帧包括起始位、停止位、有效数据位以及校验位。
①:起始位和停止位
串口通信的一个数据帧是从起始位开始,直到停止位。数据帧中的起始位是由一个逻辑0 的数据位表示,而数据帧的停止位可以是 0.511.52个逻辑1的数据位表示,只要双方约定一致即可。
②:有效数据位
数据帧的起始位之后,就接着是数据位,也称有效数据位,这就是我们真正需要的数据,有效数据位通常会被约定为567或者8个位长。有效数据位是低位(LSB)在前,高位(MSB)在后。
③:校验位
校验位可以认为是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,检验方法有:奇检验、偶检验、0检验、1检验以及无检验。下面分别介绍一下:
奇校验是指有效数据为和校验位中1”的个数为奇数,比如一个8位长的有效数据为:10101001,总共有4个“1”,为达到奇校验效果,校验位设置为“1”,最后传输的数据是8位的有效数据加上1位的校验位总共9位。
偶校验与奇校验要求刚好相反,要求帧数据和校验位中1”的个数为偶数,比如数据帧:11001010,此时数据帧“1”的个数为4个,所以偶校验位为“0”。
0校验是指不管有效数据中的内容是什么,校验位总为0”,1校验是校验位总为1”。
无校验是指数据帧中不包含校验位。
我们一般是使用无校验的情况。
13.1.3 ESP32-S3UART简介
ESP32-S3芯片中有三个UART控制器可供使用,并且兼容不同的UART设备。此外,UART还可以用作红外数据交换(IrDA)RS485调制解调器。三个UART控制器分别有一组功能相同的寄存器,分别为UART0UART1UART2,在该实验中我们用到了UART0
UART是一种以字符为导向的通用数据链,可以实现设备间的通信。异步通信不需要在发送数据的过程中添加时钟信息,但这也要求发送端和接收端的速率、停止位以及奇偶校验位等参数的配置要相同,唯有如此通信才能成功。
UART数据帧始于一个起始位,接着是有效数据,然后是奇偶校验位,最后才是停止位。ESP32-S3芯片上的UART控制器支持多种字符长度和停止位。另外,控制器还支持软、硬件控制流和GDMA,可以实现无缝高速的数据传输。
13.1.4 ESP32-S3UART框架图介绍
下面先来学习如图13.1.4.1所示的UART框架图。通过框架图引出UART的相关知识,从而有一个很好的整体掌握,对之后的代码开发也会有一个清晰的思路。
第十三章 UART实验3632.png
13.1.4.1 UART框架图
为了方便大家理解,我们把整个框图分成几个部分来介绍。
①:RAM
ESP32-S3芯片中三个UART控制器(UART0UART1UART2)共用1024×8-bitRAM空间,图中①处仅列出了UART0的情况。通过配置UART_TX_SIZE可以对三个UART控制器中的其中一个的Tx_FIFO1block为单位进行扩展。同理,配置UART_RX_SIZE也是一样的。具体的请参考《esp32-s3_technical_reference_manual_cn》。
②:Clock
UART作为异步通信的外设,它的寄存器配置模块与TX/RX/FIFO都工作在APB_CLK时钟域内,而控制UART接收与发送的Core模块工作在UARTCore时钟域。Clock有三个时钟源,如图13.1.4.1中的②所示,分别为:APB_CLKRC_FAST_CLK以及晶振时钟XTAL_CLK,他们可以通过配置寄存器UART_SCLK_SEL来选择使用哪个时钟作为时钟源。选择后的时钟源通过预分频器(Divider)分频后进入UART Core模块。该分频器支持小数分频,分频系数为:
第十三章 UART实验4142.png
支持的分频范围为:1~256
③:UART 控制器模块
UART控制器可以分为两个功能块,分别为:发送块(Transmitter)以及接收块(Receiver)
发送块包含一个发送FIFO用于缓存待发送的数据。软件可以通过APB总线向Tx_FIFO写数据,也可以通过GDMA将数据传入Tx_FIFOTx_FIFO_Ctrl,用于控制Tx_FIFO的读写过程,当Tx_FIFO非空时,Tx_FSM通过Tx_FIFO_Ctrl读取数据,并将数据按照配置的帧格式转化成比特流。比特流输出信号txd_out可以通过配置UART_TXD_INV寄存器实现取反功能。
接收块包含一个接收FIFO用于缓存待处理的数据。输入比特流rxd_in可以输入到UART控制器。可以通过UART_RXD_INV寄存器实现取反。Baudrate_Detect通过检测最小比特流输入信号的脉宽来测量输入信号的波特率。Start_Detect用于检测数据的START位,当检测到START位之后,Rx_FSM通过Rx_FIFO_Ctrl将帧解析后的数据存入Rx_FIFO中。软件可以通过APB总线读取Rx_FIFO中的数据也可以使用GDMA方式进行数据接收。
④:UART Core
HW_Flow_Ctrl 通过标准 UART RTS CTSrtsn_out ctsn_in)流控信号来控制 rxd_in txd_out 的数据流。SW_Flow_Ctrl 通过在发送数据流中插入特殊字符以及在接收数据流中检测特殊字符来进行数据流的控制。
13.2 硬件设计
13.2.1 例程功能
1. 回显串口接收到的数据
2. 每间隔一定时间,串口发送一段提示信息
3. LED闪烁,提示程序正在运行
13.2.2 硬件资源
1. LED
LED - IO1
2. UART_NUM_0U0TXU0RX连接至板载USB转串口芯片上)
U0TXD-IO43
U0RXD-IO44
13.2.3 原理图
本章实验使用的UART0通过跳线帽与板载的USB转串口芯片连接,其原理图如下图所示:
第十三章 UART实验5030.png
13.2.3.1 UART0USB转串口芯片跳线帽连接
因此,在进行本章实验之前,需确保上图位置中正确安装了跳线帽,如下图黄色线条区域所示:
第十三章 UART实验5105.png
13.2.3.2 串口通信跳线帽位置
板载的USB转串口芯片的USB接口通过板载的USB UART端口引出,其原理图如下图。
第十三章 UART实验5171.png
13.2.3.3 USB转串口芯片相关原理图
从以上原理图可以看出,TXD引脚和RXD引脚分别作为发送和接收引脚分别与USB转串口芯片的接收和发送引脚进行连接,USB转串口芯片再通过一对USB差分信号连接至USB UART的接口,这样一来,ESP32-S3就可以通过USBPC上位机软件进行串口通信了。
另外ESP32S3有三个串口,即 UART0UART1UART2其中,开发板的串口0已经用于自动下载与调试部分,故在实际应用中不建议使用串口0与其他设备通信。
13.3 程序设计
13.3.1 程序流程图
程序流程图能帮助我们更好的理解一个工程的功能和实现的过程,对学习和设计工程有很好的主导作用。下面看看本实验的程序流程图:
第十三章 UART实验5520.png

13.3.1.1 UART实验程序流程图
针对本章的实验要求,需要将串口发送引脚配置成复用推挽输出模式,而串口接收引脚配置成上拉输入模式。
13.3.2 UART函数解析
ESP-IDF提供了一套API来配置串口。要使用串口功能,需要导入必要的头文件:
#include "driver/uart.h"
接下来,作者将介绍一些常用的UART函数,这些函数的描述及其作用如下:
1,配置UART端口
该函数用来设置指定UART端口的通信参数,该函数原型如下所示:
esp_err_t uart_param_config(uart_port_t uart_num,
                                                         const uart_config_t *uart_config)
该函数的形参描述如下表所示:
形参
描述
uart_num
UART外设端口号
例如:UART_NUM_0UART_NUM_1等(在uart.h文件中有定义)
uart_config
指向uart_config_t结构体的指针,包含了UART的参数配置信息,
需自行定义,并根据UART的参数配置填充结构体中的成员变量
13.3.2.1 函数uart_param_config()形参描述
返回值:ESP_OK表示设置成功,ESP_FAIL表示设置失败。
该函数使用uart_config_t类型的结构体变量传入uart外设的配置参数,该结构体的定义如下所示:
结构体
参数1
可选值
uart_config_t
.baud_rate
它代表串口的波特率,即数据传输速率,具体指的是每秒传输的位数。
常见的波特率值包括9600115200等。
.data_bits
数据位的数量,也就是每个字节中的位数。
UART_DATA_5_BITS
UART_DATA_6_BITS
UART_DATA_7_BITS
UART_DATA_8_BITS
.parity
奇偶校验位的设置。
UART_PARITY_DISABLE
禁用校验位
UART_PARITY_EVEN
偶校验位
UART_PARITY_ODD
奇校验位
.stop_bits
停止位的数量。
UART_STOP_BITS_1
1 个停止位
UART_STOP_BITS_1_5
1.5 个停止位,仅适用于 5 数据位
UART_STOP_BITS_2
2 个停止位
.flow_ctrl
硬件流控制的设置
UART_HW_FLOWCTRL_DISABLE
禁用流控制
UART_HW_FLOWCTRL_RTS
只启用 RTS 信号流控制
UART_HW_FLOWCTRL_CTS
只启用 CTS 信号流控制
.source_clk
配置时钟源
UART_SCLK_APB
选择APB作为时钟源
UART_SCLK_RTC
选择RTC作为时钟源
UART_SCLK_XTAL:
选择XTAL作为时钟源
UART_SCLK_DEFAULT
选择APB时钟源为默认选项
.rx_flow_ctrl_thresh
硬件控制流阈值
例程中我们设置为:122
13.3.2.2 uart_config_t结构体参数值描述
完成上述结构体参数配置之后,可以将结构传递给  uart_param_config () 函数,用以实例化串口并返回串口句柄。
2,配置UART引脚
该函数设置某个管脚的中断服务函数,该函数原型如下所示:
esp_err_t uart_set_pin(uart_port_t uart_num,
                                            int tx_io_num,
                                            int rx_io_num, int rts_io_num,
                                    int cts_io_num);
该函数的形参描述如下表所示:
函数的形参描述如下表所示:
形参
描述
uart_num
UART外设端口号例如:UART_NUM_0UART_NUM_1等(在uart.h文件中有定义)
tx_io_num
UART发送引脚的GPIO号。若不需要此功能,可将此参数设为-1
rx_io_num
UART接收引脚的GPIO号。若不需要此功能,可将此参数设为-1
rts_io_num
UART请求发送(RTS)引脚的GPIO号。若不需要此功能,可将此参数设为-1,例如:UART_PIN_NO_CHANGE = -1
cts_io_num
UART 清除发送(CTS)引脚的GPIO号。若不需要此功能,可将此参数设为-1,例如:UART_PIN_NO_CHANGE = -1
13.3.2.3 uart_set_pin()函数形参描述
返回值:ESP_OK表示设置成功,ESP_FAIL表示设置失败。
该函数可以将UART的发送、接收、RTS以及CTS引脚与指定的GPIO引脚进行连接。
3,安装驱动程序
该函数用于安装UART驱动程序,并指定发送和接收缓冲区的大小,其函数原型如下所示:
esp_err_t uart_driver_install(uart_port_t uart_num,
int rx_buffer_size,
int tx_buffer_size,
int event_queue_size,
QueueHandle_t *uart_queue,
int intr_alloc_flags)
该函数的形参描述,如下表所示:
形参
描述
uart_num
UART外设端口号例如:UART_NUM_0UART_NUM_1等(在uart.h文件中有定义)。
rx_buffer_size
UART 接收环形缓冲区大小,用于存储接收到的数据。
tx_buffer_size
UART发送环形缓冲区大小,用于存储有待发送的数据。
queue_size
UART 驱动程序内部缓冲队列的大小,用于存储待处理的接收和发送数据。
uart_queue
指向用户定义的用于接收数据的队列句柄,在接收数据时,接收到的数据会存储在这个队列中。
intr_alloc_flags
UART 中断分配标志,用于配置中断分配策略。
13.3.2.4 函数uart_driver_install()形参描述
返回值:ESP_OK表示设置成功,ESP_FAIL表示设置失败。
使用 uart_driver_install ()函数可以方便地初始化 UART,并且指定相应的缓冲区和队列大小以及其他参数。
4,获取数据长度
该函数用于获取接收环形缓冲区中缓存的数据长度,其函数原型如下所示:
esp_err_t uart_get_buffered_data_len(uart_port_t uart_num, size_t* size);
该函数的形参描述,如下表所示:
形参
描述
uart_num
UART外设端口号例如:UART_NUM_0UART_NUM_1
size
结构体size_t指针所接受缓存的数据长度
13.3.2.5 函数uart_get_buffered_data_len ()形参描述
返回值:ESP_OK表示设置成功,ESP_FAIL表示设置失败。
5,接收数据
该函数从UART 接收缓冲区中读取数据,其函数原型如下所示:
int uart_read_bytes(uart_port_t uart_num,
void *buf,
uint32_t length,
tickType_t ticks_to_wait)
该函数的形参描述,如下表所示:
形参
描述
uart_num
UART外设端口号
buf
指向缓冲区的指针
length
数据长度
ticks_to_wait
超时等待,RTOS节拍计数
13.3.2.6 函数uart_read_bytes ()形参描述
返回值:ESP_OK表示设置成功,ESP_FAIL表示设置失败。
6,发送数据
该函数将指定的数据写入到 UART 发送缓冲区,并触发数据的发送,其函数原型如下所示:
int uart_write_bytes(uart_port_t uart_num, const void *src, size_t size)
该函数的形参描述,如下表所示:
形参
描述
uart_num
UART外设端口号
例如:UART_NUM_0UART_NUM_1
src
指向源数据缓冲区的指针,包含要发送的数据
size
要发送的数据长度
13.3.2.7 函数uart_write_bytes ()形参描述
返回值:ESP_OK表示设置成功,ESP_FAIL表示设置失败。
使uart_write_bytes()函数发送数据时,重要的是要理解该函数的执行机制:数据首先被复制到UART发送缓冲区,随后函数会返回,并不会等待数据完全发送完。因此,若需确保数据完整无误地发送成功,应当调用uart_wait_tx_done()函数进行同步等待,直至发送过程完全结束。在确认UART已成功初始化,并且已经配置了正确的波特率及其他相关参数之后,即可调用uart_write_bytes()函数,将数据准确无误地发送至UART设备。
13.3.3 UART驱动解析
IDF版的04_uart例程中,作者在04_uart \components\BSP路径下新增了一个UART文件夹,用于存放uart.cuart.h这两个文件。其中,uart.h文件负责声明UART相关的函数和变量,而uart.c文件则实现了UART的驱动代码。下面,我们将详细解析这两个文件的实现内容。
1uart.h文件
/* 引脚和串口定义 */
#define USART_UX                      UART_NUM_0
#define USART_TX_GPIO_PIN           GPIO_NUM_43
#define USART_RX_GPIO_PIN           GPIO_NUM_44
/* 串口接收相关定义 */
#define RX_BUF_SIZE                   1024    /* 环形缓冲区大小 */
2uart.c文件
/**
* @Brief       初始化串口
* @param       baudrate: 波特率, 根据自己需要设置波特率值
* @NOTE        注意: 必须设置正确的时钟源, 否则串口波特率就会设置异常.
* @retval      
*/
void usart_init(uint32_t baudrate)
{
    uart_config_t uart_config;                                  /* 串口配置句柄 */
    uart_config.baud_rate = baudrate;                           /* 波特率 */
    uart_config.data_bits = UART_DATA_8_BITS;                   /* 字长为8位数据格式 */
    uart_config.parity = UART_PARITY_DISABLE;                   /* 无奇偶校验位 */
    uart_config.stop_bits = UART_STOP_BITS_1;                   /* 一个停止位 */
    uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;                /* 无硬件控制流 */
    uart_config.source_clk = UART_SCLK_APB;                     /* 配置时钟源 */
    uart_config.rx_flow_ctrl_thresh = 122;                      /* 硬件控制流阈值 */
    uart_param_config(USART_UX, &uart_config);                  /* 配置uart端口 */
    /* 配置uart引脚 */
uart_set_pin(USART_UX,
         USART_TX_GPIO_PIN,
                                 USART_RX_GPIO_PIN,
                                 UART_PIN_NO_CHANGE,
                                 UART_PIN_NO_CHANGE);
    /* 安装串口驱动 */
uart_driver_install(USART_UX,
                                                RX_BUF_SIZE * 2,
                                                RX_BUF_SIZE * 2,
                                                20,
                                                NULL,
                                                0);
}
uart_config是结构体uart_config_t类型的全局变量,关于uart_config_t结构体成员的含义以及可选陪的参数请回到本章节的13.3.2小节进行回顾。波特率我们通过传参的方式,赋值给uart_config.baud_rate这个成员,其他成员也可以通过相应的步骤进行配置。接着,在配置UART0作为串口通信端口,并且将IO44IO43引脚作为收发引脚后,调用安装串口驱动函数,便完成了UART的初始化配置。
ESP32-S3的串口通讯驱动不需要为UART0编写中断回调函数,因为在ESP32-S3 IDF库中已经封装了数据读写函数。UART0通过函数获取RX环形缓冲区缓存的数据长度,并判断该数据长度非空后,将其逐一通过读写函数进行操作。
13.3.4 CMakeLists.txt文件
打开本实验BSP下的CMakeLists.txt文件,其内容如下所示:
set(src_dirs            
            USART
            LED)
set(include_dirs
            USART
            LED)
set(requires
            driver)
idf_component_register(SRC_DIRS ${src_dirs}
INCLUDE_DIRS ${include_dirs} REQUIRES ${requires})
component_compile_options(-ffast-math -O3 -Wno-error=format=-Wno-format)
上述的红色USART驱动需要由开发者自行添加,以确保USART驱动能够顺利集成到构建系统中。这一步骤是必不可少的,它确保了USART驱动的正确性和可用性,为后续的开发工作提供了坚实的基础。
13.3.5 实验应用代码
打开main/main.c文件,该文件定义了工程入口函数,名为app_main,该函数代码如下:
/**
* @brief       程序入口
* @param      
* @retval      
*/
void app_main(void)
{
    esp_err_t ret;
    uint8_t len = 0;
    uint16_t times = 0;
    unsigned char data[RX_BUF_SIZE] = {0};
    ret = nvs_flash_init();                                   /* 初始化NVS */
if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||
            ret == ESP_ERR_NVS_NEW_VERSION_FOUND)
    {
        ESP_ERROR_CHECK(nvs_flash_erase());
        ret = nvs_flash_init();
    }
   
    led_init();                                               /* 初始化LED */
    usart_init(115200);                                       /* 初始化串口 */
    while(1)
{
           /* 获取环形缓冲区数据长度 */
        uart_get_buffered_data_len(USART_UX, (size_t*) &len);
        if (len > 0)                                          /* 判断数据长度 */
        {
            memset(data, 0, RX_BUF_SIZE);                     /* 对缓冲区清零 */
            printf("\n您发送的消息为:\n");
            uart_read_bytes(USART_UX, data, len, 100);               /* 读数据 */
            uart_write_bytes(USART_UX,
                                                     (const char*)data,
                                                      strlen((const char*)data));           /* 写数据 */
        }
        else
        {
            times++;
            if (times % 5000 == 0)
            {
                printf("\n正点原子 ATK-DNESP32-S3 开发板 串口实验\n");
                printf("正点原子@ALIENTEK\n\n\n");
            }
            if (times % 200 == 0)
            {
                printf("请输入数据,以回车键结束\n");
            }
            if (times % 30 == 0)
            {
                LED_TOGGLE();
            }
            vTaskDelay(10);
        }
    }
}
本实验的实验代码很简单,在完成初始化后,就不断地通过串口通信驱动提供的数据接收并判断数据长度大小,若还未完成数据接收,则每间隔一段时间就使用printf函数通过UART0打印一段提示信息,若数据接收完毕,则将数据原原本本地使用printf函数通过UART0打印出去,实现数据的回显功能。
13.4 下载验证
在完成编译和烧录操作后,需要将开发板的USB UART接口与PCUSB接口通过具有数据传输功能的数据线进行连接,并保证13.2.3小节中指示跳线帽已正确安装。接着打开PC上的ATK-XCOM串口调试助手软件,选择好正确的COM端口和相关的配置后,就能看到串口调试助手上每间隔一段时间就打印一次“请输出数据,以回车键结束”,接下来就可以根据提示通过串口调试助手发送一段任意的数据(以回车换行结束),随后立马就能看到串口调试助手上显示发送出去的数据,这就是本实验实现的数据回显功能。
第十三章 UART实验13682.png
13.4.1 串口调试助手显示的信息

更多回帖

发帖
×
20
完善资料,
赚取积分