OS_EVENT *Sem_Usart;
void TaskUsart(void *pdata)
{
u8 len=0;
u8 i;
INT8U err;
Sem_Usart=OSSemCreate(0);
while(1)
{
OSSemPend(Sem_Usart,0,&err);
len=USART_RX_STA&0x03f;
printf("This is you send information:\n");
while((USART1->SR&0X40)==0);
for(i=0;i<len;i++)
{
USART1->DR=USART_RX_BUF;
while((USART1->SR&0X40)==0);
}
OSTimeDlyHMSM(0,0,0,20);
}
}
extern OS_EVENT *Sem_Usart;
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
OSIntEnter();
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
// printf("%d",Res);
if((USART_RX_STA&0x80)==0)//接收未完成
{
if(USART_RX_STA&0x40)//接收到了0x0d
{
if(Res!=0x0a)
USART_RX_STA=0;//接收错误,重新开始
else
{
USART_RX_STA|=0x80; //接收完成了
OSSemPost(Sem_Usart);
}
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x40;
else
{
USART_RX_BUF[USART_RX_STA&0X3F]=Res ;
USART_RX_STA++;
if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
OSIntExit();
}
这个任务优先级不管多少都会进硬fault,然后就死机了。。
想法是在串口中断里面判断是否接收到了0X0D 0X0A(回车键),然后就发送一个信号量。 |