CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  硬件/嵌入开发 >  单片机/工控

W77E58 外部中断服务程序该如何编写?

楼主milan25429688(蚝油)2003-09-02 12:46:55 在 硬件/嵌入开发 / 单片机/工控 提问

当我通过串口1发送数据到手机模块后,手机模块会接收到网关返回的应答信息“+CMTI....”,但如果网络不好,或者网关没有接收到该数据时,不会返回应答信息。因为应答信息设定从串口1上返回,而且不用删除SIM   卡的内容,所以无须再判断返回信息的内容,于是我想用以下的中断服务程序直接清空随时返回串口1的应答信息,以避免其占用串口而造成无法想象的后果,不知是否可行?各路高手请多多指教!!  
   
  void   external1(void)   interrupt   0   using   2       //外部中断服务程序    
  {  
          //EX0=0;          
          if(RI1)  
          {  
                  RI1=0;  
          }        
          //EX0=1;      
  }    
   
  EX0=0;似乎没有必要用吧?因为只是清空串口,无须关外部中断再做处理…… 问题点数:50、回复次数:11Top

1 楼milan25429688(蚝油)回复于 2003-09-04 09:13:55 得分 0

这两天修改了一下,各位大虾给点意思好吗?拜托了~~  
   
  void   external1(void)   interrupt   0   using   2       //外部中断服务程序    
  {  
          uchar   m;       //m   是收到0x0a   的个数  
          EX0=0;  
           
          if(RI1)  
          {  
                  m=0;  
                  RI1=0;  
                  do{  
                            while(!RI1);  
                            RI1=0;  
                            if(SBUF1==0x0a)     m++;     //当串口自第二个数据开始计算  
                  }while(m<2);       //收到2个   Ox0a   则退出外部中断      
          }  
           
          EX0=1;      
  }Top

2 楼milan25429688(蚝油)回复于 2003-09-04 09:21:08 得分 0

晕,是给点意见.....笔误.....||||||Top

3 楼milan25429688(蚝油)回复于 2003-09-05 16:02:59 得分 0

up~~`Top

4 楼Supbaby(阿斯匹林)回复于 2003-09-06 13:59:17 得分 20

错了,串口1的中断号是7   不是   0,   0   是外部中断。  
   
  试一下改成这样:  
   
  void   external1(   void   )   interrupt   7   using   2  
  {  
  if(   TI_1   )                                         //如果有发送  
  TI_1   =   0;  
  else                                                     //如果有接收  
  {  
  RI_1   =   0;  
  flag   =   1;  
  }  
  }  
   
  判断一下条件,然后设个标志(flag)应该可以进中断。  
  可能还有一些串口的设置,查一下datasheet吧。  
  Top

5 楼milan25429688(蚝油)回复于 2003-09-07 10:36:42 得分 0

呵呵,可能是我没说清楚....  
   
  外部中断数据源只会向单片机申请一次中断,后面的字节数据来一个只会将RI1   置位,不会再产生中断,所以在中断里面用了循环....  
   
  因为系统对实时性要求不高,所以串口1   收发数据都用查询方式,而外部中断服务程序是担  
  心不定时返回的网关应答信息影响串口1,所以才使用上硬件来电信号引脚与GSM   模块相  
  接!网关过来的应答会产生电平变化,从而触发中断,接着串口1   就会有数据过来;而一般  
  的模块应答信息则不会产生电平变化,因此不会触发中断....Top

6 楼Hermit(替地球省氧气,决定每天少呼吸)回复于 2003-09-07 10:55:17 得分 10

看了好几遍,-_-!,还是不明白你的意思。  
  以下是我最大的2个疑问:  
  1、你想直接清空随时返回串口1的应答信息,用串口自己的接受中断不一样能行,为何要外部中断?  
  2、外部中断怎么连的?能这么肯定就一次中断?电平触发?边沿触发?  
  Top

7 楼milan25429688(蚝油)回复于 2003-09-10 10:00:36 得分 0

*^_^*   呵呵,献丑了……如果开了外部中断,RI1   一旦置位,是否会对程序查询方式中对串口1的操作产生影响?   外部中断目前确实没有接上,一次中断也还只是推断,现在看来还是得改用中断方式操作串口1   ……Top

8 楼milan25429688(蚝油)回复于 2003-09-12 10:18:10 得分 0

现在把程序改回串口1   中断接收,在接收到串口0   数据后马上执行ES1=0   关中断,等待发送数据到网关后再开   ES1=1,以使下面的串口1   中断服务程序有效,大虾继续指引一下,先谢过了  
   
  void     serial1(void)     interrupt     7     using     2             //外部中断服务程序          
  {      
                uchar     m;             //m     是收到0x0a     的个数        
                     
                if(RI1)      
                {      
                                m=0;      
                                RI1=0;      
                                do{      
                                                    while(!RI1);      
                                                    RI1=0;      
                                                    if(SBUF1==0x0a)         m++;         //当串口自第二个数据开始计算      
                                }while(m     <2);             //收到2个     Ox0a     则退出外部中断              
                }      
                               
  }Top

9 楼Supbaby(阿斯匹林)回复于 2003-09-12 15:22:01 得分 20

个人认为   while(m   <   2)这个最好改成   if   判断。Top

10 楼milan25429688(蚝油)回复于 2003-09-13 18:47:53 得分 0

1.呵呵,我这么改行吗?  
   
  void     serial1(void)     interrupt     7     using     2             //中断服务程序          
  {      
                uchar     m;             //m     是收到0x0a     的个数                          
                if(RI1)      
                {      
                                m=0;      
                                RI1=0;      
                                do{      
                                                    while(!RI1);      
                                                    RI1=0;      
                                                    if(SBUF1==0x0a)         m++;         //当串口自第二个数据开始计算      
                                                    if(m   <   2)       break;    
                              }while(m   <   2);             //收到2个     Ox0a     则退出中断              
                }                      
  }  
   
  2.还有一个问题就是,如果我按以下这种中断服务程序编写,哪个效率更高?  
  P.S:以下的中断服务程序是每来一个字符就进入一次中断服务程序,上面的只需在一次中断服务程序中就可以完成....  
   
  void     serial1(void)     interrupt     7     using     2             //中断服务程序          
  {                        
                if(RI1)      
                {      
                                RI1=0;      
                }                                
  }Top

11 楼milan25429688(蚝油)回复于 2003-09-13 18:50:31 得分 0

呀呀呀,太粗心了,是   if(m   >=   2)     break;   才对....Top

相关问题

  • 软中断和硬中断的中断服务子程序在编写时有什么区别啊?
  • 如何用c编写串行通信的中断程序?
  • 编写和中断中DELPHI的提示没有了,能找回嘛????
  • 如何利用socket编写一个检测e-mail的软件
  • 可不可以,直接编写发E-MAIL...
  • 各位,你们都在什么编辑器下编写C程序,我用VC编写,不知怎么调用中断啊?
  • 请教:vc下编写的串口程序是否可以用硬中断的方式接收数据?
  • 请问什么叫java的e数据库?请解释一下e的全称?用什么软件编写,例如用vb,vc编写?
  • 请问什么叫java的e数据库?请解释一下e的全称?用什么软件编写,例如用vb,vc编写?
  • 请问什么叫java的e数据库?请解释一下e的全称?用什么软件编写,例如用vb,vc编写?

关键词

  • 中断
  • 数据
  • 信息
  • 串口
  • ri
  • 中断服务程序
  • 返回
  • 应答信息
  • ex

得分解答快速导航

  • 帖主:milan25429688
  • Supbaby
  • Hermit
  • Supbaby

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo