freertos实现串口接收
时间: 2024-12-31 17:37:21 浏览: 13
### FreeRTOS 中实现 UART 串口接收
在嵌入式开发中,利用FreeRTOS操作系统的调度机制可以更高效地管理和响应UART串口通信事件。下面展示的是一个基于STM32微控制器平台,在FreeRTOS环境下的串口接收不定长数据的例子[^1]。
#### 创建任务来处理串口中断服务程序
为了确保不会丢失任何字符,通常会设置一个高优先级的任务专门用来处理来自USART的中断请求。当有新字节到达时触发此ISR函数,并将其存放到缓冲区中等待后续分析。
```c
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
BaseType_t xHigherPriorityTaskWoken;
if (huart->Instance == USARTx) {
// 将接收到的数据放入队列并通知对应的任务
xQueueSendFromISR(rx_queue, &received_char, &xHigherPriorityTaskWoken);
// 继续准备下次接收单个字符
HAL_UART_Receive_IT(&huartHandle, (uint8_t *)&rx_data, 1);
}
}
```
#### 使用队列传递消息给应用程序层
定义全局变量`StaticQueue_t rx_queue_storage;` 和 `QueueHandle_t rx_queue;` 来声明静态分配的消息队列存储空间及其句柄。初始化阶段调用`xQueueCreateStatic()` 函数创建固定大小的第一先进先出(FIFO) 队列用于暂存从硬件接口读取到的信息片段。
```c
// 初始化部分
const uint16_t queue_length = 10;
const uint8_t item_size = sizeof(char);
/* Create the queue to hold received characters */
static StaticQueue_t rx_queue_storage;
static char ucQueueStorageArea[queue_length * item_size];
rx_queue = xQueueCreateStatic(queue_length,
item_size,
ucQueueStorageArea,
&rx_queue_storage);
```
#### 处理接收到的数据
编写另一个较低级别的后台线程负责不断尝试从未满载荷处获取最新可用项直至遇到终止条件为止;期间可能还会涉及解析协议帧边界、校验和验证等工作流程。
```c
void vUartRxTask(void *pvParameters)
{
char ch;
while (true) {
/* Wait indefinitely for data to arrive on the queue */
if (pdPASS == xQueueReceive(rx_queue, &ch, portMAX_DELAY)) {
/* Process each character as it arrives here... */
printf("%c", ch); // 或者其他处理逻辑
/* Check end condition or buffer full etc.*/
} else {
// Handle timeout/error case...
}
}
}
int main() {
...
xTaskCreate(vUartRxTask,"uart_rx_task",configMINIMAL_STACK_SIZE,NULL,tasks_prio,NULL);
...
}
```
上述代码段展示了如何在一个简单的场景下运用FreeRTOS特性完成异步非阻塞式的串行端口输入流捕获过程[^2]。
阅读全文