// 串口1信号量
OS_EVENT *sem_uart1;
// 信号的初始化
sem_uart1 = OSSemCreate(0);
使用stm32平台,下面是串口1中断函数
void USART1_IRQHandler(void)
{
OSIntEnter();
unsigned char clear = clear;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
if(usart1_rx_data == 0) //防止上一帧数据未解析完,又接收到新数据,使数组内容被更改
{
USART1_RX_Buffer[USART1_Number++] = USART1->DR;
if(USART1_RX_Buffer[0] == 0x00)
{
USART1_Number = 0;
}
}
}
if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)
{
clear = USART1->SR;
clear = USART1->DR;
if(usart1_rx_data == 0)
{
usart1_rx_data = 1;
}
OSSemPost(sem_uart1);
}
OSIntExit();
}
串口1数据解析任务
void UDDataProcess_P1_task(void *pdata)
{
//变量定义
unsigned short i = 0;
INT8U err = 0;
pdata = pdata;
for (;;)
{
//任务休眠
//OSTimeDlyHMSM(0, 0, 0, UDDATA_PROCESS_P1_TASK_SLEEP_TIME);
OSSemPend(sem_uart1, 0, &err);
//上位机通信指令
if ((USART1_RX_Buffer[0] == 0x4c) && (USART1_RX_Buffer[1] == 0x44))
{
up_device_data_parse(G_COM1, (char *)USART1_RX_Buffer, &USART1_Number);
}
//收完一帧数据将地址为置0,将数据清空
for (i = 0; i < USART3_RXBUFFER_SIZE; i++)
USART1_RX_Buffer[i] = 0;
//收完一帧数据将地址为置0,将数据清空
USART1_Number = 0;
usart1_rx_data = 0;
}
}
用上述方法代替任务休眠方式,可以显著提高串口数据处理速度。