|
我现在想用串口中断接收8个数据,然后在中断中将这个数据发到消息队列中,然后在一个任务中接收这个消息队列,就是处理串口接收到的数据。(不知道是不是这样使用的)
/* 创建消息队列*/
xQueue1 = xQueueCreate(8, sizeof(uint8_t));
/* 串口中断处理函数,将串口接收的数据作为信息 */
uint8_t RxData[8];
void HAL_UART_RxCpltCallback (UART_HandleTypeDef *huart)
{
BaseType_t xResult;
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xQueueSendFromISR(xQueue1,
(void *)&RxData, /* RxData保存串口接收的数据 */
&xHigherPriorityTaskWoken);
HAL_UART_Receive_IT(&huart1, RxData,8); /* 使能接收中断 */
/* 消息被成功发出 */
if( xResult != pdFAIL )
{
/* 如果xHigherPriorityTaskWoken = pdTRUE,那么退出中断后切到当前最高优先级任务执行 */
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
uint8_t ucQueueMsgValue[8];
static void vTaskMsgPro(void *pvParameters)
{
BaseType_t xResult;
const TickType_t xMaxBlockTime = pdMS_TO_TICKS(300); /* 设置最大等待时间为300ms */
int i = 0;
while(1)
{
xResult = xQueueReceive(xQueue1, /* 消息队列句柄 */
(void *)&ucQueueMsgValue, /* 存储接收到的数据到变量ucQueueMsgValue中 */
(TickType_t)xMaxBlockTime);/* 设置阻塞时间 */
if(xResult == pdPASS)
{
/* 成功接收,并通过串口将数据打印出来 */
for (i=0; i<8; i++)
{
printf("接收到消息队列数据ucQueueMsgValue = %d\r\n", ucQueueMsgValue);
}
}
}
}
此时打印出来的只有ucQueueMsgValue[0]是对的,其他的7个都是0 |
|