OpenEdv-开源电子网

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

总是自动进入串口中断

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-10-14
在线时间
0 小时
发表于 2015-10-14 14:13:02 | 显示全部楼层 |阅读模式
5金钱
菜鸟请教各位前辈,为什么一下这段程序会自动进入中断,我想要用上位机发送“0xff”,下位机才进行回应,但是我用串口助手发送0xff以后就中断就一直在循环,中断不是只有在接收到数据才会打开吗,为什么一直会打开,另外我用查询法也试了,查询法是可以,在线仿真时用串口助手可以发一次收一次,但是我烧录到单片机以后就不成功了,好郁闷,这是为什么啊,在线仿真可以,烧录以后就不行,求解,谢谢
void main()
{
	init();
    while(1)
	{
		//while(!RI);		
		//RI=0;
		//temp=SBUF;
		if(temp==0xff)
		{
			adval2=AD(2);
			A1=adval2/100; 
			A2=adval2%100/10;
			A3=adval2%10;  
			adval1=AD(1);
			for(a=10;a>0;a--)        
			{                                                                                                                                                                                                                                                
				display(A1,A2,A3);
			};
			SBUF=adval1;
			while(!TI);
			TI=0;  
			delayms(10);
			SBUF=adval2;
			while(!TI);
			TI=0;	   
			delayms(10);
			SBUF='O';
			while(!TI);
			TI=0;
			temp=0;
			ES=1;
		}
	}
}
void ser() interrupt 4
{
	RI=0;
	temp=SBUF;
	if(temp==0xff)
	{  	
		ES=0;
		RD=!RD;        //这里接了个发光管可以明显看到,及时没有数据,还是自动进入中断
		delayms(500);
		flag=1;
	}
}[/mw_shl_code]

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

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-14 15:08:50 | 显示全部楼层
你怎么把帖子发这么长的

发完帖子看一下格式是否需要编辑一下,方便坛友讨论

编辑一下格式吧
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

3

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2014-10-31
在线时间
8 小时
发表于 2015-10-14 16:23:06 | 显示全部楼层
因为你temp没有清空,即你收到0xff之后再主循环判断要把temp清空或者设为其他值,还有你为什么一定要0xff,搞个0X5A 0xA5之类不好么?有可能是当SBUF为空读回来的值就是0xff,还有中断里面尽量不要用delay(500)之类的函数。
回复

使用道具 举报

3

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2014-10-31
在线时间
8 小时
发表于 2015-10-14 16:23:37 | 显示全部楼层
因为你temp没有清空,即你收到0xff之后再主循环判断要把temp清空或者设为其他值,
还有你为什么一定要0xff,搞个0X5A 0xA5之类不好么?
有可能是当SBUF为空读回来的值就是0xff,还有中断里面尽量不要用delay(500)之类的函数。
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2015-11-5 22:53:20 | 显示全部楼层
发送TI=1也是会进入中断的,51串口中断是接受发送公用一个中断的。
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2013-6-5
在线时间
141 小时
发表于 2015-11-12 23:33:32 | 显示全部楼层
你中断里要先判断一下 RI是不是1,不是立刻退出,是才执行你写的代码。
回复

使用道具 举报

10

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2014-11-6
在线时间
24 小时
发表于 2016-4-28 11:46:36 | 显示全部楼层
本帖最后由 草莽 于 2016-4-28 11:47 编辑

你接收用中断(RI),发送用查询(TI),发送中断发生时,串口中断程序还是要执行的。你在发送前应该禁止串口中断。要么就要改串口中断程序,把其中的所有语句加在if(RI){}的里面。
回复

使用道具 举报

10

主题

50

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2014-11-6
在线时间
24 小时
发表于 2016-4-28 12:00:25 | 显示全部楼层
草莽 发表于 2016-4-28 11:46
你接收用中断(RI),发送用查询(TI),发送中断发生时,串口中断程序还是要执行的。你在发送前应该禁止串口中 ...

发送前如果不禁止串口中断,还要加一个标志位a,发送中断发生后,TI复位,标志位a置位,主程序查询这个标志位a
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-5-1 11:44:15 | 显示全部楼层
帮顶
回复

使用道具 举报

6

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2016-5-1
在线时间
25 小时
发表于 2016-5-2 01:58:53 | 显示全部楼层
先判断接收中断请求标志RI是否为1(串口接受完一个数据帧,硬件自动置1),一般在串口接收中断函数是

void xxxx()interrupt 5
{
      if(RI)
     {
         //代码
      }
}
回复

使用道具 举报

7

主题

188

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2280
金钱
2280
注册时间
2013-12-16
在线时间
448 小时
发表于 2016-5-4 08:07:19 | 显示全部楼层
楼上正解,51单片机串口只要开启中断,无论发送还是接收都会进入中断,所以必须在中断中进行判断是接收中断还是发送中断,然后分别处理.

RI表示接收中断,TI表示发送中断

void xxxx()interrupt 5
{
        if(RI)//接收中断
        {
                RI=0;
                //代码
        }
        if(TI)//发送中断
        {
                TI=0;
                //代码
        }
}
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-4-6
在线时间
4 小时
发表于 2016-5-17 13:44:21 | 显示全部楼层
5楼说得对,发送和接收是一样进串口中断的,在中断服务程序里面要判断TI和RI来做分支
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2015-4-21
在线时间
21 小时
发表于 2016-5-26 22:07:04 | 显示全部楼层
连续进入是因为TI没有清零导致
回复

使用道具 举报

0

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
726
金钱
726
注册时间
2016-5-27
在线时间
91 小时
发表于 2016-5-27 14:37:06 | 显示全部楼层
void ser0() interrupt 4
{
   ES0=0;       
      if(RI)//接收中断
        {
                RI=0;
                //代码
        }
        if(TI)//发送中断
        {
                TI=0;
                //代码
        }
  ES0=1;
}
回复

使用道具 举报

5

主题

168

帖子

0

精华

高级会员

Rank: 4

积分
780
金钱
780
注册时间
2016-5-28
在线时间
64 小时
发表于 2016-5-29 10:08:18 | 显示全部楼层
void ser() interrupt 4
{
        RI=0;
        temp=SBUF;
        if(temp==0xff)
        {         
                ES=0;
                RD=!RD;        //这里接了个发光管可以明显看到,及时没有数据,还是自动进入中断
                delayms(500);
                flag=1;
        }
}
在这里要先判断是收中断还是发中断再进行读取
回复

使用道具 举报

2

主题

171

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3792
金钱
3792
注册时间
2016-6-26
在线时间
276 小时
发表于 2016-6-27 07:15:11 | 显示全部楼层
www88988 发表于 2016-5-27 14:37
void ser0() interrupt 4
{
   ES0=0;       

这个比较规范,正解。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 16:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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