void USART2_IRQHandler(void)
{ unsigned char msg[20];
OS_CPU_SR cpu_sr;
OS_ENTER_CRITICAL(); //保存全局中断标志,关总中断 Tell uC/OS-II that we are starting an ISR
OSIntNesting++;
OS_EXIT_CRITICAL(); //恢复全局中断标志
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判断读寄存器是否非空
{
msg[RxCount++] = USART_ReceiveData(USART2); //将读寄存器的数据缓存到接收缓冲区里
//USART_SendData(USART2,USART_ReceiveData(USART2));
if(msg[0] != 0xaa)
{
RxCount=0;//判断是否为同步头
}
if(RxCount>3) //整体字节超过3个字节
/*判断结束标志是否为0x02,0x27*/
{
if(msg[RxCount-2] == 0x02&&msg[RxCount-1] == 0x27 )
{
msg[RxCount]=0;
RxCount=0;
OSMboxPost(USART2_MBOX,(void *)&msg);
}
}
}
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET) //这段是为了避免STM32 USART 第一个字节发不出去的BUG
{
USART_ITConfig(USART2, USART_IT_TXE, DISABLE); //禁止发缓冲器空中断,
}
OSIntExit(); //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换
}
static void Task_USART2(void *p_arg){
INT8U err;
unsigned char *msg;
(void)p_arg;
while(1)
{
msg=(unsigned char *)OSMboxPend(USART2_MBOX,0,&err); //等待USART2成功接收一帧的邮箱信息
/* 将接收到的报文保存在显示缓存区里用于显示 */
if(msg[1] == 0x75)
{
memcpy(rx_buf, msg+8, 1);
memcpy(tx_buf, msg+9, 1);
}
}
}
|