如何在C51中强制退出串行口中断

[复制链接]
9017|22
 楼主| addisonqhd 发表于 2008-1-31 10:43 | 显示全部楼层 |阅读模式
接收数据超时,则说明数据传输错误,退出串口中断,等待下次中断接收,在C51中强制退出串行口中断需要在中断函数中如何处理:
void serial_isr(void) interrupt 4 using 0   
    {bit chaoshi=0;   //超时标志位
     j=0; RI=0;           
     receive[0]=SBUF;      //接收机器号,响应串口中断后撤除接收中断          
     if (receive[0]==ID)   //判断机器号,对号则接收
        { for (i=1;i<8;i++)       
           { 
             while(j<100)  //?????超时退出的处理问题
             {if(RI==1){receive=SBUF;RI=0;chaoshi=0;break;}
              j++;chaoshi=1;

             }
             if(chaoshi==1)goto tuichu;
           }
.............
.........    ....     
tuichu:chaoshi=0; 
  }

我的意思是如果中断接收数据两个字节之间的时间超时(这个时间很短零点几毫秒不会影响主程序),立即停止接收,到中断函数末尾,退出中断。
dai_weis 发表于 2008-1-31 11:36 | 显示全部楼层

使用第九个数据位发送地址多好

ID对则接收数据,不对则不接收
中断中怎么还要循环等待?
icecut 发表于 2008-1-31 11:51 | 显示全部楼层

这样

while(j<1000);  //?????超时退出的处理问题
             {if(RI==1){receive=SBUF;RI=0;chaoshi=0;j=0break;}else{
              j++;;}

             }chaoshi=1;break
xwj 发表于 2008-1-31 12:34 | 显示全部楼层
why_buaa 发表于 2008-1-31 13:05 | 显示全部楼层

在中断里面循环等数据?!

   你完全没有理解中断的思想。
   你在中断里置一个静态状态标记,每次收到数了,同时按照收到的数和当前的标记状态来判断处理方式不就行了。
   中断就应该尽快的返回,怎么可以在中断里等待,那还要中断干什么。
gyt 发表于 2008-1-31 13:11 | 显示全部楼层

书没读好

fsaok 发表于 2008-1-31 13:25 | 显示全部楼层

中断程序不是这样用的

中断是用于紧急状态,所以应该尽快退出中断,

正确的做法是中断程序中把收到的数据放进缓存区,马上退出!

然后主程序去处理数据,记录收到信息的是否超时等

一声叹息
ayb_ice 发表于 2008-2-2 13:53 | 显示全部楼层

一声叹息

mohanwei 发表于 2008-2-2 13:57 | 显示全部楼层

改改接收算法比较好

lbx_00 发表于 2008-2-2 18:56 | 显示全部楼层

设置一个通信缓冲队列,和一个8位缓冲

每次收到的数据送入8位缓冲,并给出收到数据的标志,出中断,由其他程序将这个数据压入缓冲队列,并具体处理
happystar 发表于 2008-2-2 20:13 | 显示全部楼层

LZ弄清楚查询方式和中断方式的优缺点就明白了

你这个程序严重的不合格
AIRWILL 发表于 2008-2-3 13:45 | 显示全部楼层

强制退出中断?

直接 return() 可以啊(不要给什么参数) 
xhtxzxw 发表于 2008-2-3 21:11 | 显示全部楼层

嘿嘿

哎呀我的娘啊!你老师是谁?打他屁股吧,串口中断就想咋退出就咋退出了!
qinyp 发表于 2008-2-5 18:45 | 显示全部楼层

严重叹息

救火车 发表于 2008-2-6 12:40 | 显示全部楼层

不要在中断里面等数据

睡睡 发表于 2008-2-7 21:39 | 显示全部楼层

用汇编行么?

睡睡 发表于 2008-2-7 21:43 | 显示全部楼层

用汇编行么?

    我用汇编搞 的,接受一桢数据后连续等待两桢的时间,若没有接到合法的结束标志则退出.实际使用中,对于BAUD RATE有误差的情况很有效.
yongzai 发表于 2011-5-2 09:21 | 显示全部楼层
水平太低看不懂
playjian 发表于 2011-5-2 13:18 | 显示全部楼层
12# AIRWILL 中断的返回值是void~~不能有return的吧~
playjian 发表于 2011-5-2 13:19 | 显示全部楼层
设置一个标志~~再主程序中查询标志吧~~~再中断里面等待~~那还要中断干什么~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

78

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部