这个串口的使用,还是比较容易的,只需要通过一个结构就可以完成简单的串口初始化
通过 uart_config_t 设置串口参数
uart_config_t my_uart={ .baud_rate = 115200, //波特率 .data_bits = UART_DATA_8_BITS, //数据位 .stop_bits = UART_STOP_BITS_1, //停止位 .parity = UART_PARITY_DISABLE, //奇偶校验位 .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, //流控 .rx_flow_ctrl_thresh = 122, //触发流控的阈值 .source_clk = UART_SCLK_DEFAULT, //设置时钟源,如果没有特殊指定,可以不写 }; uart_param_config(UART_NUM_2,&my_uart); //初始化对应的串口分配引脚
通过 uart_set_pin 方法设置对应的串口编号,以及对应的 tx、rx、rts、cts对应的引脚
Ps:需要注意的是:如果没有用到流控的引脚,那么在方法的参数传递,就不能传输对应的引脚,而是传输一个宏定义 UART_PIN_NO_CHANGE,否则就会导致一个问题,那就是不断的输出
invalid header: 0xffffffff 导致程序无法执行,如果没有利用矩阵重映射了引脚,那么也可以使用这个宏定义,表示使用串口的默认引脚
分配资源
通过为对应的串口控制器安装驱动,以实现资源的分配
uart_driver_install(UART_NUM_2,1024,1024,10,&uart2_queue,0);
通过uart_write_bytes 和uart_read_bytes 发送/接收数据

完整代码
/*=========================================================================== 这个是关于eps32通用异步收发器 uart 的学习 esp32一共有3个串口收发器 uart0:这个被用于下载固件和调试信息输出 tx:1 rx:3 uart1:这个可能会被用于内部的连接内部的spi flash(引脚复用) tx:10 rx:9 uart2:这个是没有被使用的 tx:17 rx:16 ============================================================================*/ #define Uart2_Tx 17 #define Uart2_Rx 16 #define Uart2_RTS 7 #define Uart2_CTS 8 QueueHandle_t uart2_queue; //串口2的消息队列 /// @brief 串口2的参数配置以及资源分配 /// @param 无 void Uart2_Study_Init( void ) { uart_config_t my_uart={ .baud_rate = 115200, //波特率 .data_bits = UART_DATA_8_BITS, //数据位 .stop_bits = UART_STOP_BITS_1, //停止位 .parity = UART_PARITY_DISABLE, //奇偶校验位 .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, //流控 .rx_flow_ctrl_thresh = 122, //触发流控的阈值 // .source_clk = UART_SCLK_DEFAULT, //设置时钟源 }; //uart_config //设置一个默认的串口,使用串口1 uart_param_config(UART_NUM_2,&my_uart); ///设置了对应的引脚和对应的串口号,因为有可能你并没有使用一些引脚 uart_set_pin(UART_NUM_2,Uart2_Tx,Uart2_Rx,UART_PIN_NO_CHANGE,UART_PIN_NO_CHANGE); ///分配了串口的资源 uart_driver_install(UART_NUM_2,1024,1024,10,&uart2_queue,0); ///串口通信由每一个的控制器的有限状态机(FSM)控制 ///用户发送和接收只需写入和读取对应的FIFO缓冲区即可,其他的通过FSM来完成 }//主函数 void app_main() { char* test_str = "This is a uart2 test string.\n"; // GPIO_Study_Config(); // Timer_Study_Init(); char buf[128]; int length; Uart2_Study_Init(); while(1){ vTaskDelay(1000 / portTICK_PERIOD_MS); printf("System is Running!!\n"); //uart_write_bytes(UART_NUM_2, (const char*)test_str,29); length = uart_read_bytes(UART_NUM_2,buf,10,1000); //uart_read_bytes:参数 10 ,是指:一次从FIFO缓冲区读取的字节数 if (length>0) { uart_write_bytes(UART_NUM_2, buf,length); length=0; } } }参考链接:ESP-IDF编程指南

#好好学习!