ESP32串口接收不定长数据·

ESP32串口接收不定长数据方法

Hugh

Hugh

511 0

采用消息队列方式接收,步骤如下:

  • 1.创建消息队列
  • 2.串口初始化,并关联消息队列
  • 3.创建串口数据处理线程,并在线程函数中等待消息 伪代码如下:
1.创建消息队列
 static QueueHandle_t uart1_queue;
2.串口初始化,并关联消息队列
void uart_init(void){
uart_config_t uart_config =
{
.baud_rate = 115200,
.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_APB,
};
uart_driver_install(EX_UART_NUM, BUF_SIZE * 2, BUF_SIZE * 2, 20, &uart1_queue, 0); // 安装串口驱动,并关联队列uart1_queue
uart_param_config(EX_UART_NUM, &uart_config);

uart_set_pin(EX_UART_NUM, UART_PIN_TX, UART_PIN_RX, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); // 设置串口引脚(TX:18,RX:19)
uart_enable_pattern_det_baud_intr(EX_UART_NUM, '+', PATTERN_CHR_NUM, 9, 0, 0);               // Set uart pattern detect function.
uart_pattern_queue_reset(EX_UART_NUM, 20);                                                   // Reset the pattern queue length to record at most 20 pattern positions.
}
3.创建串口数据处理线程,并在线程函数中等待消息
void setup()
{
    xTaskCreate(uart_event_task, "uart_event_task", 2048, NULL, 12, NULL); // 串口中断处理线程
}

static void uart_event_task(void *pvParameters)
{
uart_event_t event;
size_t buffered_size;
uint8_t *dtmp = (uint8_t *)malloc(RD_BUF_SIZE);
while (1)
 {
   if (xQueueReceive(uart1_queue, (void *)&event, (TickType_t)portMAX_DELAY))
   {
       bzero(dtmp, RD_BUF_SIZE);
       switch (event.type)
       {
           case UART_DATA:
                  uart_read_bytes(EX_UART_NUM, dtmp, event.size, portMAX_DELAY); // 读出接收到的数据
                  do_something(dtmp);//处理数据
                   break;
           default:
                   break;
       }
   }
   taskYIELD();
 }
free(dtmp);
dtmp = NULL;
vTaskDelete(NULL);
}

相关文章

优先推荐同专题、同标签和同作者内容,补足热门文章。

评论 0

登录 后参与评论

评论

成为第一个评论的人