采用消息队列方式接收,步骤如下:
- 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);
}