OpenEdv-开源电子网

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

USART中断中else if语句无法进入

[复制链接]

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
发表于 2016-11-10 08:32:48 | 显示全部楼层 |阅读模式
本帖最后由 chenghuayou 于 2016-11-10 08:38 编辑

首先,我想用USART中断接受两组数据,第一组:0x00,0xa5,0x00,0x00,0x00,0x02,0x03,0x81;第二组:0xa5,0x00,0x00,0x00,0x02,0x03,0x81;在中断程序里的两个判断中,第一组的数据可以识别接受,第二组的无法识别,请各位大神看看,给点套路。红色字体无法进入。蓝色字体可以进入。。。。。。。。。跪求了。
void USART1_IRQHandler()//接收数据中断函数
{
        u8 Res=0;
        if(USART_GetITStatus(USART1, USART_IT_RXNE))
        {
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                Res =USART_ReceiveData(USART1);
                PBout(5)=~PBout(5);
                //while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != 1);
         //        USART_ClearFlag( USART1,USART_FLAG_RXNE);
                if(i<8)//先接受前8个十六进制数,判断符不符合应答格式
                {
                        Initial_response = Res;
                        i++;
                }        

                else
                {
                        if((Initial_response[0] == 0xa5)&&(Initial_response[6] == 0x81))
                        {               
                                PBout(5)=~PBout(5);
                                Abolish=1;
                        }

                        if((Initial_response[0] == 0x00)&&(Initial_response[1] == 0xa5)&&(Initial_response[7] == 0x81))//判断应答格式
                        {
                                USART_RX_BUF[t] =Res;
                                //while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != 1);
                                t++;

                                if(t == 1804)//接受360*5=1800个字节
                               {
                                        if((USART_RX_BUF[1800]==0xaa)&&(USART_RX_BUF[1801]==0xbb)&&(USART_RX_BUF[1802]==0xcc)&&(USART_RX_BUF[1803]==0xdd))
                                                        {
                                                                t = 0;
                                                                i = 0;
                                                                flag = 1;//扫描一圈完成标志位
                                                                }
                                                                else
                                                                {
                                                                        Abolish=1;
                                                                                       
                                                                }
                                                        }
                                }
                                                
                        }
                }
                                                                                
        }                                       


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-11-10 08:48:11 | 显示全部楼层
把接收到的数据打印出来看看接收到的对不对
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 1 反对 0

使用道具 举报

29

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2012-6-15
在线时间
161 小时
发表于 2016-11-10 09:14:23 | 显示全部楼层
chenghuayou 发表于 2016-11-10 09:04
谢谢您的回复,发送出来是对的。请问您还有别的思路吗?再次感谢您

你可以单独判断一下 if((Initial_response[0] == 0xa5)能不能进入,还有你这种机制不可取,很可能来一个干扰信号误触发进入中断,这样你的缓存数据有可能是随机数,比如上电瞬间串口极有可能有干扰,把0或者其他数放进了你的第0位~
兴趣使人出色
回复 支持 1 反对 0

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-11-10 08:40:23 | 显示全部楼层
打印调试
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-10 08:44:46 | 显示全部楼层

您好,我调试了,就是这一步进不去,请问您有别的办法吗
回复 支持 反对

使用道具 举报

29

主题

108

帖子

0

精华

高级会员

Rank: 4

积分
613
金钱
613
注册时间
2012-6-15
在线时间
161 小时
发表于 2016-11-10 08:59:22 | 显示全部楼层
你把接收到你数据再发送出来看看数据对不对。。。。。
兴趣使人出色
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-10 09:04:29 | 显示全部楼层
嵌入之梦 发表于 2016-11-10 08:59
你把接收到你数据再发送出来看看数据对不对。。。。。

谢谢您的回复,发送出来是对的。请问您还有别的思路吗?再次感谢您
回复 支持 反对

使用道具 举报

10

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1479
金钱
1479
注册时间
2016-1-25
在线时间
260 小时
发表于 2016-11-10 09:32:44 | 显示全部楼层
从你的的代码上来看   你第二组数据接收正常却执行不了  肯定是在你的 判断应答格式上if((Initial_response[0] == 0x00)&&(Initial_response[1] == 0xa5)&&(Initial_response[7] == 0x81))你可以把你每次接收到(Initial_response[0]数据打印出来看看  就知道是什么问题了, if(i<8)这样的话i的值是会+到8的  所以你第二组的数据(Initial_response[0]估计是等于第二组的第二个数据0x00  你可以改成if(i<7)看看
回复 支持 反对

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-11-10 09:38:53 | 显示全部楼层
程序不能这么写,协议不能这么制定.....
shop60994719.taobao.com
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-10 10:11:21 | 显示全部楼层
密耳 发表于 2016-11-10 09:38
程序不能这么写,协议不能这么制定.....

谢谢您的告诫,问题已经解决了,非常感谢。
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-10 10:12:28 | 显示全部楼层
sodermalm 发表于 2016-11-10 09:32
从你的的代码上来看   你第二组数据接收正常却执行不了  肯定是在你的 判断应答格式上if((Initial_response ...

谢谢您耐心的解答,我的问题已经调试好了。再次感谢您的回复。
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-10 10:13:50 | 显示全部楼层
嵌入之梦 发表于 2016-11-10 09:14
你可以单独判断一下 if((Initial_response[0] == 0xa5)能不能进入,还有你这种机制不可取,很可能来一个 ...

谢谢您的耐心讲解,这一点我的确没有考虑到,经过调试,问题已经解决了,再次感谢您的回复。
回复 支持 反对

使用道具 举报

18

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-1
在线时间
77 小时
 楼主| 发表于 2016-11-10 10:15:49 | 显示全部楼层
龙之谷 发表于 2016-11-10 08:48
把接收到的数据打印出来看看接收到的对不对

恩恩,谢谢您的回复,我的问题已经调试好了,再次搞些您的回复!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 03:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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