完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我是基于STM32F407上的uCOS-iii的串口中断软件。
1、在中断服务程序中,缓存字符,判断是否接受到回车换符“rn”,如果接收到回车符,中断设置不同的相应标志位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:%drn",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!rn"); // } // else // { // // DRV_PRINT("command line ok! ID:%drn",ComParStruct.CommandId); // if(SET_AD9913_RF ==ComParStruct.CommandId) // { // uint32_t freq = ComParStruct.CommandParameter0*1000000; // //printf("%drn",freq); // AD9913SetRfFrequency(freq); // } // } } } ~~~~求解~~~~~ |
|
相关推荐
3个回答
|
|
,没人顶贴
|
|
|
|
问题找到了。经过2个小时,每次数据20ms间隔测试,OK,继续测试2个钟
初步有两个问题, 1、信号来那个位置错误,回车换行符号'r' 'n', ‘n’数据接受到才是结束 ,信号量应该是这个位置 2、上位机串口工具,发送字符串时,多了一个回车换行符 信号来那个放的位置错了。 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(&ackSemaphore,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; } } 这段代码改为: if(USART_RX_STA&0x4000) { if('n' != Res)USART_RX_STA=0; { 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 |= 0x8000; OSSemPost(&ackSemaphore,OS_OPT_POST_FIFO,&err); } } else { if('r' == Res) //'r' { UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; USART_RX_STA|=0x4000; } else { UART1_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if( USART_RX_STA > (UART1_REC_LEN-5)) USART_RX_STA=0; } } |
|
|
|
还有就是UCOS的任务堆栈溢出。
|
|
|
|
只有小组成员才能发言,加入小组>>
798 浏览 0 评论
1155 浏览 1 评论
2531 浏览 5 评论
2863 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2713 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1086浏览 3评论
195浏览 2评论
461浏览 2评论
374浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
455浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 05:08 , Processed in 1.422360 second(s), Total 82, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号