高级会员
- 积分
- 839
- 金钱
- 839
- 注册时间
- 2016-8-23
- 在线时间
- 116 小时
|
楼主 |
发表于 2022-4-14 14:00:52
|
显示全部楼层
本帖最后由 紫气东升 于 2022-4-14 14:16 编辑
参照网友的提议,使用消息队列方式处理多线程下同时使用一个串口发送数据。目前测试没出现数据混乱问题。***********************************
程序初始化:
#define QUEUE_RECEIVE_TASK_PRIO (tskIDLE_PRIORITY + 6)
QueueHandle_t usart0_queue = NULL;
usart0_queue = xQueueCreate(50, 20); //创建消息队列
xTaskCreate(queue_receive_task, "QUEUE_RECEIVE", configMINIMAL_STACK_SIZE/2, NULL, QUEUE_RECEIVE_TASK_PRIO, NULL);
*********************************
线程调用的发送数据函数:
/* 串口发送数据 */
void TransmitSocCommand(uint32_t usart_periph, uint8_t* data_buffer, uint16_t length)
{
uint16_t n;
BaseType_t xUsart0_Return = pdFALSE;
switch(usart_periph)
{
case USART0:
xUsart0_Return = xQueueSend(usart0_queue, data_buffer, 0); //将要发送的数据放进消息队列中
if(xUsart0_Return != pdPASS)
{
printf("send err\n"); //消息队列已满,放进数据失败
}
break;
case USART1:
case USART2:
for(n=0; n<length; n++)
{
usart_data_transmit(usart_periph, data_buffer[n]);
while (RESET == usart_flag_get(usart_periph, USART_FLAG_TBE));
}
break;
default:
break;
}
}
*************************************
线程调用的接收数据函数:
uint8_t Queue_RecBuff[20] = {0};
void queue_receive_task(void *pvParameters)
{
BaseType_t xRecResult = pdFALSE;
uint16_t n;
while(1)
{
xRecResult = xQueueReceive(usart0_queue, Queue_RecBuff, portMAX_DELAY); //从消息队列中读取数据放到自己定义的Queue_RecBuff缓存中
if(xRecResult == pdPASS)
{
for(n=0; n<Queue_RecBuff[1]; n++)
{
usart_data_transmit(USART0, Queue_RecBuff[n]);
while (RESET == usart_flag_get(USART0, USART_FLAG_TBE));
}
}
vTaskDelay(2);
}
}
|
|