怎么看网站发的外链,wordpress首页最新文章,网站建设企业需要准备资料,百度下载并安装到桌面前言
在我们学习嵌入式的过程中#xff0c;uart算是我们用的非常多的一个外设了#xff0c;我们可以用串口打印信息#xff0c;也可以用于设备通信#xff0c;总之串口的作用非常多#xff0c;我们也非常有必要熟练地去掌握这个外设。
uart的配置
uart的参数配置 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函数时需要指定以下参数
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);}}