当前位置: 首页 > news >正文

ESP32外设学习部分--UART篇

前言

在我们学习嵌入式的过程中,uart算是我们用的非常多的一个外设了,我们可以用串口打印信息,也可以用于设备通信,总之串口的作用非常多,我们也非常有必要熟练地去掌握这个外设。

uart的配置

uart的参数配置

    uart_config_t uart_config = {.baud_rate = ECHO_UART_BAUD_RATE, //波特率.data_bits = UART_DATA_8_BITS, //数据传输大小.parity    = UART_PARITY_DISABLE,//奇偶校验.stop_bits = UART_STOP_BITS_1,//停止位.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,//硬件流.source_clk = UART_SCLK_DEFAULT,};

还是和上一篇我们学习SPI一样,首先需要配置uart的基本参数,像这些参数我们在学习STM32或者其他单片机的时候应该都比较熟悉了,只需要根据我们项目的需求进行配置就OK了。

esp_err_t uart_param_config(uart_port_t uart_num, const uart_config_t *uart_config)

配置完成之后使用上面的函数进行设置即可。

安装 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_driver_install 是ESP-IDF中用于安装UART驱动程序的函数,它为UART驱动程序分配所需的内部资源,包括环形缓冲区和事件队列。以下是该函数的作用和使用方法:

作用

  • 分配UART驱动程序所需的内部资源,包括Tx(发送)和Rx(接收)的环形缓冲区。
  • 创建一个事件队列,用于处理UART事件,如数据接收、缓冲区溢出等。
  • 允许UART驱动程序使用中断,提高数据传输的效率和响应性。

使用方法

使用uart_driver_install函数时,需要指定以下参数:

  1. uart_num:指定UART端口号,例如UART_NUM_1UART_NUM_2
  2. rx_buffer_size:接收环形缓冲区的大小。
  3. tx_buffer_size:发送环形缓冲区的大小。
  4. event_queue_size:事件队列的大小,用于存储UART事件。
  5. uart_queue:指向队列句柄的指针,用于存储UART事件。
  6. flags:标志位,用于指定是否需要中断等。

这里我们可以使用他的uart事件,这样更加方便我们编程,这里我使用读取超时的(timeout_flag)的标志,这个就类似触发我们STM32中的空闲接收,代表数据已经接收完成我们可以进行处理。

ESP_ERROR_CHECK(uart_driver_install(ECHO_UART_PORT_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart1_queue, intr_alloc_flags));

引脚配置

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)

最后使用上面的函数配置我们的引脚即可。

完整代码

#define TAG "tx_usart"#define ECHO_TEST_TXD (21)#define ECHO_TEST_RXD (22)#define ECHO_UART_PORT_NUM      (1)#define ECHO_UART_BAUD_RATE     (115200)#define BUF_SIZE (1024)static QueueHandle_t uart1_queue;void tx_usart_init(void){uart_config_t uart_config = {.baud_rate = ECHO_UART_BAUD_RATE,.data_bits = UART_DATA_8_BITS,.parity    = UART_PARITY_DISABLE,.stop_bits = UART_STOP_BITS_1,.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,.source_clk = UART_SCLK_DEFAULT,};int intr_alloc_flags = 0;uint8_t timer_cnt = 0;ESP_ERROR_CHECK(uart_driver_install(ECHO_UART_PORT_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart1_queue, intr_alloc_flags));ESP_ERROR_CHECK(uart_param_config(ECHO_UART_PORT_NUM, &uart_config));ESP_ERROR_CHECK(uart_set_pin(ECHO_UART_PORT_NUM, ECHO_TEST_TXD, ECHO_TEST_RXD, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));uart_event_t event;// Configure a temporary buffer for the incoming datauint8_t *data = (uint8_t *) malloc(BUF_SIZE);while (1) {// Read data from the UART//Waiting for UART event.if(xQueueReceive(uart1_queue, (void * )&event, (TickType_t)0)) {/*以此判断一帧数据传输完成*/if(event.timeout_flag){ESP_LOGI(TAG,"Recv TimeOUT");}xQueueReset(uart1_queue);}int len = uart_read_bytes(ECHO_UART_PORT_NUM, data, (BUF_SIZE - 1), 0);// Write data back to the UARTuart_write_bytes(ECHO_UART_PORT_NUM, (const char *) data, len);vTaskDelay(10 / portTICK_PERIOD_MS);}}
http://www.lryc.cn/news/504650.html

相关文章:

  • ssm-day04 mybatis
  • es中段是怎么合并的
  • 5、可暂停的线程控制模型
  • sql优化--mysql隐式转换
  • Scratch021(画笔)
  • Leetcode 3387. Maximize Amount After Two Days of Conversions
  • 机器视觉与OpenCV--01篇
  • 简单的Java小项目
  • 使用layui的table提示Could not parse as expression(踩坑记录)
  • 区块链共识机制详解
  • 【Excel】单元格分列
  • 【含开题报告+文档+PPT+源码】基于微信小程序的旅游论坛系统的设计与实现
  • 微软 Phi-4:小型模型的推理能力大突破
  • 操作系统课后习题2.2节
  • [小白系列]安装sentence-transformers
  • Python字符串format方法全面解析
  • 【Reading Notes】Favorite Articles from 2024
  • Python爬虫之Scrapy框架基础入门
  • spring cloud contract mq测试
  • Axure原型设计技巧与经验分享
  • 计算机网络之王道考研读书笔记-1
  • 服务器限制某个端口只允许特定IP访问(处理第三方依赖漏洞)
  • JavaScript--原型与原型链
  • hive—常用的日期函数
  • HTML零基础入门教学
  • vue3 父组件调用子组件 el-drawer 抽屉
  • Java中常用算法之选择排序算法
  • UNIX简史
  • React和Vue中暴露子组件的属性和方法给父组件用,并且控制子组件暴露的颗粒度的做法
  • uniapp 常用的指令语句