OpenEdv-开源电子网

标题: STM32移植UC/OS-II后,多串口接收中断问题。 [打印本页]

作者: 行者川    时间: 2017-11-22 16:43
标题: STM32移植UC/OS-II后,多串口接收中断问题。
STM32移植UC/OS-II后,同时使用三个串口,串口1打印调试信息,串口2、3分别接收传感器数据,出现卡顿现象,接收不了传感器数据。

作者: 1547674987    时间: 2017-11-22 16:43
行者川 发表于 2017-12-4 17:40
串口3控制GPRS模块,如果不加串口3,系统能正常运行。加了串口3之后,增加了一个SIM900A_task任务,可能 ...

那你仿真看一下,加了串口3之后程序跑哪去了
作者: 正点原子    时间: 2017-11-23 01:05
尽量精简串口中断服务函数的代码
作者: 行者川    时间: 2017-11-23 09:36
正点原子 发表于 2017-11-23 01:05
尽量精简串口中断服务函数的代码

void USART2_IRQHandler(void)    //串口2接收中断入口函数
{
     static int ucRxCnt = 0;
         OSIntEnter();
     USART_ClearFlag(USART2,USART_FLAG_TC);
     if(USART_GetITStatus(USART2,USART_IT_RXNE)!=Bit_RESET)
     {
                 USART_ClearFlag(USART2,USART_IT_RXNE);
                 ucRxBuffer[ucRxCnt++] = USART_ReceiveData(USART2);
                 if(ucRxCnt== 32)
                 {
                        OSQPost(PM25_MsgQueue, (void*)ucRxBuffer);
                        ucRxCnt = 0;
                        delay_ms(100);
                 }       
     }
         OSIntExit();
}


void USART3_IRQHandler(void)         //串口3中断入口函数              
{
        u8 Res=0;
        OSIntEnter();
        Res =USART_ReceiveData(USART3);
        Uart3_Buf[First_Int] = Res;                            //将接收到的字符串存到缓存中
        First_Int++;                                        //缓存指针向后移动
        if(First_Int > Buf3_Max)                               //如果缓存满,将缓存指针指向缓存的首地址
        {
                First_Int = 0;
        }   
        OSIntExit();
}        

void TIM2_IRQHandler(void) //定时器2中断入口函数
{
        static u8 flag =1;
        OSIntEnter();
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //检查TIM2更新中断是否发生
        {
               
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx中断标志位
               
                if(Timer0_start)
                        Times++;
                if(Times > shijian)
                {
                        Timer0_start = 0;
                        Times = 0;
                }
               
                if(flag)
                {
                        flag=0;
                }
                else
                {
                        flag=1;
                }
        }
        OSIntExit();       
}

void Second_AT_Command(char *b,char *a,u8 wait_time)         
{
        u8 i;
        char *c;
        c = b;                                                                                //保存字符串地址到c
        CLR_Buf3();
        i = 0;
        while(i == 0)                    
        {
                if(!Find(a))
                {
                        if(Timer0_start == 0)
                        {
                                b = c;                                                        //将字符串地址给b
                                for (; *b!='\0';b++)
                                {
                                        while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET);
                                        USART_SendData(USART3,*b);
                                }
                                USART3_SendLR();       
                                Times = 0;
                                shijian = wait_time;
                                Timer0_start = 1;
                   }
                }
                else
                {
                        i = 1;
                        Timer0_start = 0;
                }
        }
        CLR_Buf3();
}
原子哥,串口2,3的中断入口函数如上所示。串口2驱动粉尘传感器,串口3驱动GPRS模块,定时器2中断记时,用于判断串口3发送指令是否超时。移植uc/os-II分别调试两个传感器,均能正常工作。柔和起来就运行不起来了。
求不吝赐教!!!!!





作者: 操作系统    时间: 2017-11-23 15:25
能搞定三个串口,你就过关了.

作者: 1547674987    时间: 2017-11-23 21:56
操作系统 发表于 2017-11-23 15:25
能搞定三个串口,你就过关了.

我跑UCOSIII,搞定5个串口  我是不是过关了?F4
作者: 行者川    时间: 2017-11-23 22:01
1547674987 发表于 2017-11-23 21:56
我跑UCOSIII,搞定5个串口  我是不是过关了?F4

亲~分享下经验撒
作者: 1547674987    时间: 2017-11-23 22:04
行者川 发表于 2017-11-23 09:36
void USART2_IRQHandler(void)    //串口2接收中断入口函数
{
     static int ucRxCnt = 0;

你的两个串口会同时接收到数据吗?两个串口的接收中断优先级设的一样还是不一样,可以的话你把工程文件贴出来,部分不想让人看到的略去即可
作者: 操作系统    时间: 2017-11-25 09:15
1547674987 发表于 2017-11-23 21:56
我跑UCOSIII,搞定5个串口  我是不是过关了?F4

牛B..666

作者: 稳稳的Lau    时间: 2017-11-28 10:19
赞同上上楼建议
作者: 江湖渔民    时间: 2017-11-29 13:34
貌似你的串口程序内没有做time的重置
作者: 行者川    时间: 2017-12-4 11:19
本帖最后由 行者川 于 2017-12-6 21:01 编辑
1547674987 发表于 2017-11-23 22:04

望不吝赐教,谢谢!!!

作者: 行者川    时间: 2017-12-4 11:20
江湖渔民 发表于 2017-11-29 13:34
貌似你的串口程序内没有做time的重置

我觉得是优先级设置出了问题,具体怎么改就不知道了
作者: 1547674987    时间: 2017-12-4 11:49
行者川 发表于 2017-12-4 11:20
我觉得是优先级设置出了问题,具体怎么改就不知道了

程序我还没看,但是我之前遇到过两个串口同时接收到数据会出错,不管他们的抢占优先级是否一样
作者: 1547674987    时间: 2017-12-4 14:49
行者川 发表于 2017-12-4 11:20
我觉得是优先级设置出了问题,具体怎么改就不知道了

简略的看了下你的工程,有几个建议。
(1)你串口1只用来发送调试信息,没必要开中断,虽然也没啥影响
(2)你在USART2_IRQHandler()延时100MS,这个不应该吧,你PM25_TASK等待USART2_IRQHandler发消息队列,OSQPost(PM25_MsgQueue, (void*)ucRxBuffer)之后就发起一次任务调度。一般来说在任务里面延时可以,在中断里面延时,你是出于哪方面的考虑?

作者: 行者川    时间: 2017-12-4 16:53
1547674987 发表于 2017-12-4 14:49
简略的看了下你的工程,有几个建议。
(1)你串口1只用来发送调试信息,没必要开中断,虽然也没啥影响
...

谢谢,根据你的建议修改了下,打印调试信息卡在如图所示的部分,显示屏处于花屏状态!
没加串口3之前,运行正常,单独调试串口3运行正常,揉到一起就不行了!

作者: 1547674987    时间: 2017-12-4 17:32
行者川 发表于 2017-12-4 16:53
谢谢,根据你的建议修改了下,打印调试信息卡在如图所示的部分,显示屏处于花屏状态!
没加串口3之前, ...

显示屏花屏,这个我帮不了。你说的加串口3后不行,能不能具体点,是接收的数据有问题还是什么别的?
作者: 行者川    时间: 2017-12-4 17:40
1547674987 发表于 2017-12-4 17:32
显示屏花屏,这个我帮不了。你说的加串口3后不行,能不能具体点,是接收的数据有问题还是什么别的?

串口3控制GPRS模块,如果不加串口3,系统能正常运行。加了串口3之后,增加了一个SIM900A_task任务,可能任务优先级那块也有问题




欢迎光临 OpenEdv-开源电子网 (http://47.111.11.73/) Powered by Discuz! X3.4