前言
在我们学习嵌入式的过程中,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
函数时,需要指定以下参数:
- uart_num:指定UART端口号,例如
UART_NUM_1
或UART_NUM_2
。 - rx_buffer_size:接收环形缓冲区的大小。
- tx_buffer_size:发送环形缓冲区的大小。
- event_queue_size:事件队列的大小,用于存储UART事件。
- uart_queue:指向队列句柄的指针,用于存储UART事件。
- 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);}}