文章目录

  • 一、前言
  • 二、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 - 简单的串口回环测试相关推荐

  1. STM32CubeMX与HAL库学习--简单的CAN回环测试

    STM32CubeMX与HAL库学习--简单的CAN回环测试 前言 STM32CubeMX生成初始化代码 在MDK-ARM里编辑代码 其他 后续 前言 本人小白,最近看了CAN协议与STM32的bxC ...

  2. 串口调试助手C++源代码 可接收发送串口数据 带接收Echo回环到发送的功能

    串口调试助手C++源代码 可接收发送串口数据 带接收Echo回环到发送的功能 使用说明介绍 1.功能介绍: 简单地实现了串口通信的功能,主要有发送窗口和接收窗口组成.该代码注释详细,并带有说明文档,适 ...

  3. linux 串口 loopback,友善NanoPC T2 4418开发板Linux下串口回环测试 -申嵌

    注意事项:friendlycore系统下 UART3 对应的设备文件名是 /dev/ttyAMA3 实验目的:实现串口回环测试,即:自己给自己发数据,然后自己接收到自己发送的内容. 实验内容: 1. ...

  4. UART串口通信(回环测试)

    一 UART串口通信简介 UART(Universal Asynchronous Receiver-Transmitter)是采用异步串行通信方式的通用异步收发传输器,在发送数据时将并行数据转换为串行 ...

  5. linux下Qt编写串口调试助手,如何在linux下用QT写一个简单的串口调试助手

    如何在linux下用QT写一个简单的串口调试助手 QT5串口类 在QT5以前,编写串口一般使用的是qextserialport类,但在QT5之后有了QT自带的串口类SerialPort(串口基础类)和 ...

  6. 单片机shell命令_MCU调试大法:使用串口实现简单shell功能

    MCU调试大法:使用串口实现简单shell功能 [复制链接] MCU程序调试方法有很多,比如软/硬件仿真.添加数据打印等. 像Keil MDK就支持不少单片机的软件仿真,在没有拿到单片机的情况下,就可 ...

  7. 友善串口工具接收数据随机换行_使用Python3+PyQT5+Pyserial 实现简单的串口工具方法...

    练手项目,先上图 先实现一个简单的串口工具,为之后的上位机做准备 代码如下: pyserial_demo.py import sys import serial import serial.tools ...

  8. C语言写个简单的串口调试助手

    学习单片机或者嵌入式编程常常要用到超级终端–串口调试助手,但有时需要我们自己做一个终端,用来当上位机.最近课设要求我们自己写个终端来处理串口信息,于是乎,接触了一些windows的串口API,做出了一 ...

  9. VS2013基于对话框的MFC串口通信简单案例教程

    本例程是在VS2013环境下,使用MFC做的是一个简单的串口通信程序. 虚拟的串口软件工具下载地址:https://pan.baidu.com/s/1D-oddZk3Z_ioXBUpXE7ksw 密码 ...

最新文章

  1. Nat. Methods | 学习微生物与代谢产物之间相互作用的神经网络
  2. 一个中科院退学博士生的感想(zz)
  3. 【视频】v-html的使用
  4. vmware centos7 扩展容量
  5. 选择分集matlab程序,瑞利衰落信道下采用MRC分集误码性能Matlab程序
  6. python开启新代码块_20课零基础快速学python完成简单邮件完整邮件代码块
  7. oracle sql不用distinct去除重复,oracle sql 去重复记录不用distinct如何实现
  8. 两数据库Dblink数据抽取blob
  9. 程序猿的爱情--2011-12-27
  10. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第4节 方法引用_3_方法引用_通过类名引用静态成员...
  11. a标签点击中文文件名乱码_a标签文件下载文件名乱码问题
  12. Winner-Take-All Autoencoders ( 赢者通吃自编码器)
  13. visio绘图小技巧
  14. 上海交大 计算机科学家,世界顶尖科学家论坛丨上海交大计算机系教授俞凯:科研经费支持应少些“风险意识”...
  15. PLY文件读取与显示
  16. Bluemix平台打造DC/OS云计算平台(一)
  17. javac编译程序,出现‘javac’不是内部或外部命令,也不是可运行的程序或批处理文件。
  18. Codeforces Round #616 (Div. 2)B. Array Sharpening
  19. selenium中鼠标操作:ActionChains类
  20. DataEase看中国 - 中国影星“成龙”电影票房数据分析

热门文章

  1. JS编程建议——52:建议使用splice删除数组
  2. Codeforces Round #368 (Div. 2) C. Pythagorean Triples
  3. GitHub进一步了解
  4. [zz]Maya C++ API Programming Tips
  5. java selenium (十二) 操作弹出窗口
  6. 第七周项目4-计算一个程序猿的周工资
  7. iOS开发---设计素材篇2
  8. 可能是最强大的【CSS】动画库
  9. 4步精准诊断“门店数字化”问题,助力门店起死回生
  10. 已经显现了出来的飞秋下载