OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6337|回复: 17

STM32移植UC/OS-II后,多串口接收中断问题。

[复制链接]

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2017-6-12
在线时间
36 小时
发表于 2017-11-22 16:43:04 | 显示全部楼层 |阅读模式
20金钱
STM32移植UC/OS-II后,同时使用三个串口,串口1打印调试信息,串口2、3分别接收传感器数据,出现卡顿现象,接收不了传感器数据。

最佳答案

查看完整内容[请看2#楼]

那你仿真看一下,加了串口3之后程序跑哪去了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-11-22 16:43:05 | 显示全部楼层
行者川 发表于 2017-12-4 17:40
串口3控制GPRS模块,如果不加串口3,系统能正常运行。加了串口3之后,增加了一个SIM900A_task任务,可能 ...

那你仿真看一下,加了串口3之后程序跑哪去了
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-11-23 01:05:44 | 显示全部楼层
尽量精简串口中断服务函数的代码
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2017-6-12
在线时间
36 小时
 楼主| 发表于 2017-11-23 09:36:09 | 显示全部楼层
正点原子 发表于 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分别调试两个传感器,均能正常工作。柔和起来就运行不起来了。
求不吝赐教!!!!!




回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6661
金钱
6661
注册时间
2016-5-29
在线时间
909 小时
发表于 2017-11-23 15:25:58 | 显示全部楼层
能搞定三个串口,你就过关了.
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-11-23 21:56:47 | 显示全部楼层
操作系统 发表于 2017-11-23 15:25
能搞定三个串口,你就过关了.

我跑UCOSIII,搞定5个串口  我是不是过关了?F4
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2017-6-12
在线时间
36 小时
 楼主| 发表于 2017-11-23 22:01:30 | 显示全部楼层
1547674987 发表于 2017-11-23 21:56
我跑UCOSIII,搞定5个串口  我是不是过关了?F4

亲~分享下经验撒
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-11-23 22:04:24 | 显示全部楼层
行者川 发表于 2017-11-23 09:36
void USART2_IRQHandler(void)    //串口2接收中断入口函数
{
     static int ucRxCnt = 0;

你的两个串口会同时接收到数据吗?两个串口的接收中断优先级设的一样还是不一样,可以的话你把工程文件贴出来,部分不想让人看到的略去即可
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6661
金钱
6661
注册时间
2016-5-29
在线时间
909 小时
发表于 2017-11-25 09:15:42 | 显示全部楼层
1547674987 发表于 2017-11-23 21:56
我跑UCOSIII,搞定5个串口  我是不是过关了?F4

牛B..666
回复

使用道具 举报

13

主题

62

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1007
金钱
1007
注册时间
2016-8-1
在线时间
157 小时
发表于 2017-11-28 10:19:33 | 显示全部楼层
赞同上上楼建议
回复

使用道具 举报

1

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2014-6-18
在线时间
27 小时
发表于 2017-11-29 13:34:45 | 显示全部楼层
貌似你的串口程序内没有做time的重置
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2017-6-12
在线时间
36 小时
 楼主| 发表于 2017-12-4 11:19:17 | 显示全部楼层
本帖最后由 行者川 于 2017-12-6 21:01 编辑

望不吝赐教,谢谢!!!
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2017-6-12
在线时间
36 小时
 楼主| 发表于 2017-12-4 11:20:24 | 显示全部楼层
江湖渔民 发表于 2017-11-29 13:34
貌似你的串口程序内没有做time的重置

我觉得是优先级设置出了问题,具体怎么改就不知道了
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-12-4 11:49:22 | 显示全部楼层
行者川 发表于 2017-12-4 11:20
我觉得是优先级设置出了问题,具体怎么改就不知道了

程序我还没看,但是我之前遇到过两个串口同时接收到数据会出错,不管他们的抢占优先级是否一样
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-12-4 14:49:47 | 显示全部楼层
行者川 发表于 2017-12-4 11:20
我觉得是优先级设置出了问题,具体怎么改就不知道了

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

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2017-6-12
在线时间
36 小时
 楼主| 发表于 2017-12-4 16:53:49 | 显示全部楼层
1547674987 发表于 2017-12-4 14:49
简略的看了下你的工程,有几个建议。
(1)你串口1只用来发送调试信息,没必要开中断,虽然也没啥影响
...

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

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-12-4 17:32:53 | 显示全部楼层
行者川 发表于 2017-12-4 16:53
谢谢,根据你的建议修改了下,打印调试信息卡在如图所示的部分,显示屏处于花屏状态!
没加串口3之前, ...

显示屏花屏,这个我帮不了。你说的加串口3后不行,能不能具体点,是接收的数据有问题还是什么别的?
回复

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2017-6-12
在线时间
36 小时
 楼主| 发表于 2017-12-4 17:40:57 | 显示全部楼层
1547674987 发表于 2017-12-4 17:32
显示屏花屏,这个我帮不了。你说的加串口3后不行,能不能具体点,是接收的数据有问题还是什么别的?

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-27 05:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表