wlxsg521 发表于 2012-4-18 19:28:29

串口通讯程序求解

思路是这样的,第一次发送数据给BUSF传个a,P0=~address,P0输出,马上发第二次数据SBUF传给b;P2=~_data,P2输出,如此重复。程序如下:
void URAT_init()
{
SCON=0X50; //串口工作方式1,8位,波特率T1溢出。
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
TR1=1;
ES=1;
//EA=1;
void main()
{
URAT_init();
   while(1)
{
if(RI)
{
RI=0;
a=SBUF;
}
P0=~address; /
EA=1;
}
}
void send() interrupt 4 using 1
{   
if(RI==1)
{
b=SBUF;
P2=~_data;
while(RI==0);
RI=0;
}
}
这么些总之是没成功,不知道是思路不对还是哪有错误求解啊大侠们。

wlxsg521 发表于 2012-4-18 21:01:18

没人帮忙吗!!!!郁闷啊!!

sniper.q 发表于 2012-4-18 22:13:58

interrupt 4:串口中断。
串口接收到数据,进入中断处理,然后RI=0清接受中断标志。然后下次数据再来继续进中断处理,所以if(RI){}永远执行不了。
想执行if(RI){}就在中断处理中把EA或ES关了,在if(RI)最后开EA或ES。

而且你用两个函数去接受不嫌麻烦吗?用个标志位处理不就好了,定义标志时先赋初值。
a=SBUF;
if(标志1) {P0=~address; 置标志2;}
if(标志2){P0=_data; 置标志1;}

wlxsg521 发表于 2012-4-19 08:29:40

sniper.q 发表于 2012-4-18 22:13 static/image/common/back.gif
interrupt 4:串口中断。
串口接收到数据,进入中断处理,然后RI=0清接受中断标志。然后下次数据再来继续 ...

您的意识是在中断里判断标志位后直接处理是吗。不在中断里也行是吧。

sniper.q 发表于 2012-4-19 09:04:33

wlxsg521 发表于 2012-4-19 08:29 static/image/common/back.gif
您的意识是在中断里判断标志位后直接处理是吗。不在中断里也行是吧。

是的,如果你的main()函数不处理其他函数,可以在main()中处理,不然建议在中断中处理。
原因:开了中断后,有数据到达就中断处理,不容易丢失数据。如果在main()中处理,你在执行其他函数过程中如果有多次数据到达有可能会丢失其中的数据。
建议在中断响应中处理。

wlxsg521 发表于 2012-4-19 09:25:42

sniper.q 发表于 2012-4-19 09:04 static/image/common/back.gif
是的,如果你的main()函数不处理其他函数,可以在main()中处理,不然建议在中断中处理。
原因:开了 ...

刚才我试了一下,可以分别接收并输出了,但是第一次输出完后,接收完第二次输出,第一次就没了或者是其他的东西,好像BUSF的数据被冲掉了,数据没有保存,还得想想怎么保存这个数据。

sniper.q 发表于 2012-4-19 21:04:03

wlxsg521 发表于 2012-4-19 09:25 static/image/common/back.gif
刚才我试了一下,可以分别接收并输出了,但是第一次输出完后,接收完第二次输出,第一次就没了或者是其他 ...

void send() interrupt 4 using 1
{   
if(RI==1)
{
b=SBUF;
P2=~_data;
while(RI==0);
RI=0;
}
} 这个改的?无语{:huffy:}
while(RI==0);//RI需要手动置0的,你在这傻等{:sweat:}

建议还是从头开始学51基础吧,不要好高骛远。

wlxsg521 发表于 2012-5-8 16:38:25

sniper.q 发表于 2012-4-19 21:04 static/image/common/back.gif
这个改的?无语
while(RI==0);//RI需要手动置0的,你在这傻等



谢谢你的指导了,我的程序已经完成的差不了,改了很多。我觉得的确要好好看看基础,我C语言是和单片机一起学的,一个一个例程学下来的,用到哪学到哪。这样的确学的快,但是学的的确不扎实。
几点不弄就忘了很多。等我的东西弄完了把完整的程序放上来希望你再好好的指导下。
页: [1]
查看完整版本: 串口通讯程序求解