接着上一程序,上一程序是这样,有两个任务一个发消息给消息队列,一个收消息队列并打印,同时串口接收中断。
那么这次我想再增加个消息队列,再增加个任务收串口来的消息,串口收到8个数据后传给消息队列。
由于CMSIS_RTOS是对FREERTOS的封装,其有些函数都变了。优其消息队列的处理我觉得就很不一样。但我觉得CMSIS_RTOS简单,将来有钱途。所以就仍然用CMSIS_RTOS.
至于两者有何区别请看下边的文章:
en.DM00105262(1).pdf
(731.26 KB, 下载次数: 2)
至于这次为什么增加一个队列,一个任务,我这么想地,操作系统之所以用它是给我解决问题地,那么我现在就是要三个任务一个中断,两个消息队列地跑。跑不起就说明不是个好系统。
在串口中断完成回调函数里加入如下语句:
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
uint8_t i;
HAL_UART_Transmit(&huart2, uart2_rxbuf, 1, 100); // 把收到的字节原样发送出去
for(i=0;i<8;i++)
{
osMessagePut(myQueue02Handle,uart2_rxbuf[i],osWaitForever);
}
HAL_UART_Receive_IT(&huart2, uart2_rxbuf, 1); // 重新注册一次,要不然下次收不到了
}
在新增任务里加入如下语句:
void StartTask04(void const * argument)
{
/* USER CODE BEGIN StartTask04 */
osEvent evt;
uint8_t queue_buffer[10];
uint8_t queue_count;
/* Infinite loop */
for(;;)
{
evt = osMessageGet(myQueue02Handle,osWaitForever);
if(queue_count < 8)
{
queue_buffer[queue_count] = evt.value.v;
++queue_count;
if(queue_count == 8)
{
printf("the message is trainslate...");
}
}
osDelay(1);
}
/* USER CODE END StartTask04 */
}
断点打到printf那一行的前面。运行检查发送和接收的,正确!
我发的就是这个:01 03 00 01 00 02 00 11