ESP3 + ESP-IDF | 串口1 - 简单的串口回环测试
文章目录
- 一、前言
- 二、VSCODE + ESP-IDF
- 2.1、快速创建项目
- 2.2、选择串口通道,ESP芯片型号
- 三、代码
- 3.1、头文件
- 3.2、全局变量
- 3.3、app_main( )函数
- 3.4、实验代码
- 四、相关API
- 4.1、uart_param_config( )
- 4.2、uart_set_pin( )
- 4.3、uart_driver_install( )
- 4.4、uart_write_bytes( )
- 4.5、uart_read_bytes( )
一、前言
测试串口外设最省事的方法是串口回环测试,因为串口回环测试不需要外部串口工具。本实验使用GPIO23作为UART1_TX,GPIO18作为UART1_RX,然后在电路上只需用一根杜邦线将GPIO23与GPIO18连接起来即可。
ESP-IDF打印的信息:
从Monitor反馈的logo可以看到,串口1接收到字符串“hello,world”,然后通过函数strlen( )获取收到的字符串的长度(长度是11)。
串口0(UART0)一般被用于下载与监控程序,所以最好不要用于开发功能。
二、VSCODE + ESP-IDF
2.1、快速创建项目
按照第一章节的方式创建一个sample_project的模版。ESP32 + ESP-IDF |GPIO 01 - 驱动外部两个LED灯,以每300ms的时间间隔闪烁
2.2、选择串口通道,ESP芯片型号
还是按照第一章节的方式来选择串口通道与ESP芯片信号
三、代码
官方文档:https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/uart.html
3.1、头文件
使用ESP32的串口外设时,需要包含头文件“driver/uart.h”.
3.2、全局变量
- 数组msg_test[] :其实就是一个字符串,这个数组将被uart1发送出去,然后被uart1接收回来(回环测试)。
- 数组buffer[UART1_RX_BUF_SIZE]:用于暂时存储uart1接收回来的字符串。
- 结构体uart1_config:用于初始化uart1的功能(波特率,数据位的个数等)。
3.3、app_main( )函数
3.4、实验代码
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "driver/uart.h"
#include "esp_log.h"
#include "esp_err.h"#define UART1_TX_BUF_SIZE 256 /* 256个字节 */
#define UART1_RX_BUF_SIZE 256 /* 256个字节 */static const char *TAG = "UART section0";
static uint8_t s_led_state = 0;static char msg_test[] = "hello,world"; /* 测试使用的字符串 */
static char buffer[UART1_RX_BUF_SIZE]; /* 暂时存储从串口接收到的字符串 *//* 串口1的配置 */
const uart_config_t uart1_config =
{.baud_rate = 115200, /* 通讯波特率 */.data_bits = UART_DATA_8_BITS, /* 每一个数据是8位 */.parity = UART_PARITY_DISABLE, /* 关闭奇偶校验 */.stop_bits = UART_STOP_BITS_1, /* 停止位是1位 */.flow_ctrl = UART_HW_FLOWCTRL_DISABLE, /* 软件控流 */.source_clk = UART_SCLK_APB, /* APB时钟 */
};void app_main(void)
{ESP_LOGI(TAG, "Example configured to uart communication");/* 复位GPIO的状态 */gpio_reset_pin(26);/* 设置GPIO26为输出模式 */gpio_set_direction(26,GPIO_MODE_OUTPUT);/* 设置串口1的参数 */ESP_ERROR_CHECK(uart_param_config(UART_NUM_1,&uart1_config));/* 设置串口的gpio口,esp32支持gpio口动态设置,这一次先使用默认的串口gpio */ESP_ERROR_CHECK(uart_set_pin(UART_NUM_1,GPIO_NUM_23,GPIO_NUM_18,UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE));/* 启动串口1 */ESP_ERROR_CHECK(uart_driver_install(UART_NUM_1, /* 串口1 */UART1_TX_BUF_SIZE, /* 发送FIFO的大小 */UART1_RX_BUF_SIZE, /* 接受FIFO的大小 */0, /* 不使用queue */NULL, /* 因为不使用queue,所以NULL */0) /* 不分配中断标志 */ ); while(1){uart_write_bytes(UART_NUM_1,msg_test,strlen(msg_test)); /* 将字符串“hello,world"放入串口1的TX_FIFO */s_led_state = !s_led_state; /* 将电平取反 */vTaskDelay(500 / portTICK_PERIOD_MS); /* 延时300ms */gpio_set_level(26,s_led_state); /* gpio输出电平 */int len = uart_read_bytes(UART_NUM_1,buffer,(UART1_RX_BUF_SIZE - 1), 20 / portTICK_PERIOD_MS); /* 从串口1的RX_FIFO获取字符串 *//* 如果读到包的话 */if(len){buffer[len] = '\0'; /* 在结尾加入字符'\0', */ESP_LOGI(TAG,"Recv str -> %s , and the length is:%d",buffer,strlen(buffer)); /* 打印logo */ESP_LOGI(TAG,"The size of buffer is %d,and ready to clear this buffer.",sizeof(buffer)); /* 打印logo */memset(buffer,0,sizeof(buffer)); /* 清空内存,等待下一次的串口保文。 */}}
}
四、相关API
4.1、uart_param_config( )
- uart_num : 很简单,就是uart的端口号。这一次实验使用uart1,对应的宏是UART_NUM_1。
- uart_config
从上图可以看到,结构体uart_config_t里的成员变量基本都是枚举类型,除了成员变量baud_rate与成员变量use_ref_tick。
4.2、uart_set_pin( )
有意思的是,esp32支持通过软件来设置uart的硬件引脚,真的非常方便!!
4.3、uart_driver_install( )
刚开始没有注意到笔记:Rx_buffer_size应该大于UART_FIFO_LEN。Tx_buffer_size应该为零或者大于UART_FIFO_LEN。
导致程序编译不成功!!!
从上图可以看到,Rx_buffer_size应该大于128字节,Tx_buffer_size应该为零或者大于128字节。
4.4、uart_write_bytes( )
如果tx_buffer_size设置为0,那么uart_write_bytes将会“阻塞”程序(就是程序会卡在这个函数,直到所有数据都发送出去)。不管怎样,在我看来都不应该将tx_buffer_size设置为0而影响整个程序的实时性,毕竟ESP-IDF框架是基于freertos实时系统。
4.5、uart_read_bytes( )
函数很简单,值得注意的是uart_read_bytes( )接收完字符串后,最好在字符串的最后加入字符‘\0’,这是一个很好的C代码习惯(可以避免strlen等C标准库的一些bug)。详细可以阅读《C和指针》这本书。
还有另外一个好习惯就是使用memset( )函数清除整个buffer内存,避免影响下一次字符串读取与判断。
ESP3 + ESP-IDF | 串口1 - 简单的串口回环测试相关推荐
- STM32CubeMX与HAL库学习--简单的CAN回环测试
STM32CubeMX与HAL库学习--简单的CAN回环测试 前言 STM32CubeMX生成初始化代码 在MDK-ARM里编辑代码 其他 后续 前言 本人小白,最近看了CAN协议与STM32的bxC ...
- 串口调试助手C++源代码 可接收发送串口数据 带接收Echo回环到发送的功能
串口调试助手C++源代码 可接收发送串口数据 带接收Echo回环到发送的功能 使用说明介绍 1.功能介绍: 简单地实现了串口通信的功能,主要有发送窗口和接收窗口组成.该代码注释详细,并带有说明文档,适 ...
- linux 串口 loopback,友善NanoPC T2 4418开发板Linux下串口回环测试 -申嵌
注意事项:friendlycore系统下 UART3 对应的设备文件名是 /dev/ttyAMA3 实验目的:实现串口回环测试,即:自己给自己发数据,然后自己接收到自己发送的内容. 实验内容: 1. ...
- UART串口通信(回环测试)
一 UART串口通信简介 UART(Universal Asynchronous Receiver-Transmitter)是采用异步串行通信方式的通用异步收发传输器,在发送数据时将并行数据转换为串行 ...
- linux下Qt编写串口调试助手,如何在linux下用QT写一个简单的串口调试助手
如何在linux下用QT写一个简单的串口调试助手 QT5串口类 在QT5以前,编写串口一般使用的是qextserialport类,但在QT5之后有了QT自带的串口类SerialPort(串口基础类)和 ...
- 单片机shell命令_MCU调试大法:使用串口实现简单shell功能
MCU调试大法:使用串口实现简单shell功能 [复制链接] MCU程序调试方法有很多,比如软/硬件仿真.添加数据打印等. 像Keil MDK就支持不少单片机的软件仿真,在没有拿到单片机的情况下,就可 ...
- 友善串口工具接收数据随机换行_使用Python3+PyQT5+Pyserial 实现简单的串口工具方法...
练手项目,先上图 先实现一个简单的串口工具,为之后的上位机做准备 代码如下: pyserial_demo.py import sys import serial import serial.tools ...
- C语言写个简单的串口调试助手
学习单片机或者嵌入式编程常常要用到超级终端–串口调试助手,但有时需要我们自己做一个终端,用来当上位机.最近课设要求我们自己写个终端来处理串口信息,于是乎,接触了一些windows的串口API,做出了一 ...
- VS2013基于对话框的MFC串口通信简单案例教程
本例程是在VS2013环境下,使用MFC做的是一个简单的串口通信程序. 虚拟的串口软件工具下载地址:https://pan.baidu.com/s/1D-oddZk3Z_ioXBUpXE7ksw 密码 ...
最新文章
- Nat. Methods | 学习微生物与代谢产物之间相互作用的神经网络
- 一个中科院退学博士生的感想(zz)
- 【视频】v-html的使用
- vmware centos7 扩展容量
- 选择分集matlab程序,瑞利衰落信道下采用MRC分集误码性能Matlab程序
- python开启新代码块_20课零基础快速学python完成简单邮件完整邮件代码块
- oracle sql不用distinct去除重复,oracle sql 去重复记录不用distinct如何实现
- 两数据库Dblink数据抽取blob
- 程序猿的爱情--2011-12-27
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第4节 方法引用_3_方法引用_通过类名引用静态成员...
- a标签点击中文文件名乱码_a标签文件下载文件名乱码问题
- Winner-Take-All Autoencoders ( 赢者通吃自编码器)
- visio绘图小技巧
- 上海交大 计算机科学家,世界顶尖科学家论坛丨上海交大计算机系教授俞凯:科研经费支持应少些“风险意识”...
- PLY文件读取与显示
- Bluemix平台打造DC/OS云计算平台(一)
- javac编译程序,出现‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件。
- Codeforces Round #616 (Div. 2)B. Array Sharpening
- selenium中鼠标操作:ActionChains类
- DataEase看中国 - 中国影星“成龙”电影票房数据分析
热门文章
- JS编程建议——52:建议使用splice删除数组
- Codeforces Round #368 (Div. 2) C. Pythagorean Triples
- GitHub进一步了解
- [zz]Maya C++ API Programming Tips
- java selenium (十二) 操作弹出窗口
- 第七周项目4-计算一个程序猿的周工资
- iOS开发---设计素材篇2
- 可能是最强大的【CSS】动画库
- 4步精准诊断“门店数字化”问题,助力门店起死回生
- 已经显现了出来的飞秋下载