新手入门
- 积分
- 15
- 金钱
- 15
- 注册时间
- 2016-10-10
- 在线时间
- 2 小时
|
我是基于STM32F407上的uCOS-iii的串口中断软件。
1、在中断服务程序中,缓存字符,判断是否接受到回车换符“\r\n”,如果接收到回车符,中断设置不同的相应标志位USART_RX_STA(全局变量),软件补充一个字符结束符号 0x0,然后向系统发送一个信号量。
2、任务代码中,接受到信号量,清除USART_RX_STA, 并对串口接收到字符进行解析,对比。
3、现在的异常现象,在接收到随机字符串,时间间隔在20ms~1S时间不等,如果任务中对缓存UART1_RX_BUF读取解析,会随机出现硬件异常中断。
4、如果不执行该段代码,怎么发串口数据都不出现异常,求解。
5、程序代码如下:
串口UART1的中断
void USART1_IRQHandler(void)
{
u8 Res;
OS_ERR err;
OSIntEnter();
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
Res =(USART1->DR);
if((USART_RX_STA&0x8000)==0)
{
if(USART_RX_STA&0x4000)
{
if('\n' != Res)USART_RX_STA=0;
else
{
UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
USART_RX_STA |= 0x8000;
}
else
{
if('\r' == Res) //'\r'
{
UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
UART1_RX_BUF[USART_RX_STA&0X3FFF]= 0x0;
USART_RX_STA++;
USART_RX_STA|=0x4000;
OSSemPost(&PackSemaphore,OS_OPT_POST_FIFO,&err);
}
else
{
UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if( USART_RX_STA > (UART1_REC_LEN-5)) USART_RX_STA=0;
}
}
}
}
OSIntExit();
}
执行的任务代码:
void pack_Pro_task(void *p_arg)
{
OS_ERR err;
uint32_t tick=0x0;
while(1)
{
OSSemPend(&PackSemaphore,0,OS_OPT_PEND_BLOCKING,0,&err);
DRV_PRINT("pktick:%d\r\n",tick++);
if(USART_RX_STA&0x8000)
{
}
USART_RX_STA=0x0;
//DRV_PRINT("%s",UART1_RX_BUF);
// if(COMERR==command_parsing((char *)UART1_RX_BUF,&ComParStruct)) ---------------------------------->执行注释的带,系统会随机出现异常,异常时,执行次数不定
// {
// // DRV_PRINT("command line err!\r\n");
// }
// else
// {
// // DRV_PRINT("command line ok! ID:%d\r\n",ComParStruct.CommandId);
// if(SET_AD9913_RF ==ComParStruct.CommandId)
// {
// uint32_t freq = ComParStruct.CommandParameter0*1000000;
// //printf("%d\r\n",freq);
// AD9913SetRfFrequency(freq);
// }
// }
}
}
~~~~求解~~~~~
|
|