×

ESP32------关于UART(串口)的使用(1)

zxjy辉 zxjy辉 发表于2023-07-10 13:03:21 浏览327 评论0

抢沙发发表评论


这个串口的使用,还是比较容易的,只需要通过一个结构就可以完成简单的串口初始化


  1. 通过 uart_config_t 设置串口参数

    1.  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);         //初始化对应的串口
  2. 分配引脚

    1. 通过 uart_set_pin 方法设置对应的串口编号,以及对应的 tx、rx、rts、cts对应的引脚

    2. Ps:需要注意的是:如果没有用到流控的引脚,那么在方法的参数传递,就不能传输对应的引脚,而是传输一个宏定义 UART_PIN_NO_CHANGE,否则就会导致一个问题,那就是不断的输出

      invalid header: 0xffffffff 导致程序无法执行,如果没有利用矩阵重映射了引脚,那么也可以使用这个宏定义,表示使用串口的默认引脚


    图片.png

  3. 分配资源

    1. 通过为对应的串口控制器安装驱动,以实现资源的分配

    2.  uart_driver_install(UART_NUM_2,1024,1024,10,&uart2_queue,0);

  4. 通过uart_write_bytes 和uart_read_bytes 发送/接收数据


    图片.png

  5. 完整代码

    1. /*===========================================================================
                          这个是关于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来完成
      }
    2. //主函数
      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;
            }
            
          }
      }
  6. 参考链接:ESP-IDF编程指南

#好好学习!

群贤毕至

访客