串口通讯程序求解

2020-02-05 09:27发布

思路是这样的,第一次发送数据给BUSF传个a,P0=~address[a],P0输出,马上发第二次数据SBUF传给b;P2=~_data[b],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[a]; /
EA=1;
  }
}
void send() interrupt 4 using 1
{   
if(RI==1)
{
b=SBUF;
P2=~_data[b];
while(RI==0);
RI=0;
}
}
这么些总之是没成功,不知道是思路不对还是哪有错误求解啊大侠们。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
wlxsg521
1楼-- · 2020-02-05 12:46
 精彩回答 2  元偷偷看……
sniper.q
2楼-- · 2020-02-05 18:32
interrupt 4:串口中断。
串口接收到数据,进入中断处理,然后RI=0清接受中断标志。然后下次数据再来继续进中断处理,所以if(RI){}永远执行不了。
想执行if(RI){}就在中断处理中把EA或ES关了,在if(RI)最后开EA或ES。

而且你用两个函数去接受不嫌麻烦吗?用个标志位处理不就好了,定义标志时先赋初值。
a=SBUF;
if(标志1) {P0=~address[a]; 置标志2;}
if(标志2){P0=_data[b]; 置标志1;}
wlxsg521
3楼-- · 2020-02-05 22:52
sniper.q 发表于 2012-4-18 22:13
interrupt 4:串口中断。
串口接收到数据,进入中断处理,然后RI=0清接受中断标志。然后下次数据再来继续 ...

您的意识是在中断里判断标志位后直接处理是吗。不在中断里也行是吧。
sniper.q
4楼-- · 2020-02-06 03:30
wlxsg521 发表于 2012-4-19 08:29
您的意识是在中断里判断标志位后直接处理是吗。不在中断里也行是吧。

是的,如果你的main()函数不处理其他函数,可以在main()中处理,不然建议在中断中处理。
原因:开了中断后,有数据到达就中断处理,不容易丢失数据。如果在main()中处理,你在执行其他函数过程中如果有多次数据到达有可能会丢失其中的数据。
建议在中断响应中处理。
wlxsg521
5楼-- · 2020-02-06 06:26
sniper.q 发表于 2012-4-19 09:04
是的,如果你的main()函数不处理其他函数,可以在main()中处理,不然建议在中断中处理。
原因:开了 ...

刚才我试了一下,可以分别接收并输出了,但是第一次输出完后,接收完第二次输出,第一次就没了或者是其他的东西,好像BUSF的数据被冲掉了,数据没有保存,还得想想怎么保存这个数据。
sniper.q
6楼-- · 2020-02-06 08:32
 精彩回答 2  元偷偷看……

一周热门 更多>