W77E58 外部中断服务程序该如何编写?
当我通过串口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编写?




