搜索
bottom↓
回复: 7

串口通讯程序求解

[复制链接]

出0入0汤圆

发表于 2012-4-18 19:28:29 | 显示全部楼层 |阅读模式
思路是这样的,第一次发送数据给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;
}
}
这么些总之是没成功,不知道是思路不对还是哪有错误求解啊大侠们。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-4-18 21:01:18 | 显示全部楼层
没人帮忙吗!!!!郁闷啊!!

出0入4汤圆

发表于 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[a]; 置标志2;}
if(标志2){P0=_data[b]; 置标志1;}

出0入0汤圆

 楼主| 发表于 2012-4-19 08:29:40 | 显示全部楼层
sniper.q 发表于 2012-4-18 22:13
interrupt 4:串口中断。
串口接收到数据,进入中断处理,然后RI=0清接受中断标志。然后下次数据再来继续 ...

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

出0入4汤圆

发表于 2012-4-19 09:04:33 | 显示全部楼层
wlxsg521 发表于 2012-4-19 08:29
您的意识是在中断里判断标志位后直接处理是吗。不在中断里也行是吧。

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

出0入0汤圆

 楼主| 发表于 2012-4-19 09:25:42 | 显示全部楼层
sniper.q 发表于 2012-4-19 09:04
是的,如果你的main()函数不处理其他函数,可以在main()中处理,不然建议在中断中处理。
原因:开了 ...

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

出0入4汤圆

发表于 2012-4-19 21:04:03 | 显示全部楼层
wlxsg521 发表于 2012-4-19 09:25
刚才我试了一下,可以分别接收并输出了,但是第一次输出完后,接收完第二次输出,第一次就没了或者是其他 ...
  1. void send() interrupt 4 using 1
  2. {   
  3. if(RI==1)
  4. {
  5. b=SBUF;
  6. P2=~_data[b];
  7. while(RI==0);
  8. RI=0;
  9. }
  10. }
复制代码
这个改的?无语
while(RI==0);//RI需要手动置0的,你在这傻等

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

出0入0汤圆

 楼主| 发表于 2012-5-8 16:38:25 | 显示全部楼层
sniper.q 发表于 2012-4-19 21:04
这个改的?无语
while(RI==0);//RI需要手动置0的,你在这傻等

谢谢你的指导了,我的程序已经完成的差不了,改了很多。我觉得的确要好好看看基础,我C语言是和单片机一起学的,一个一个例程学下来的,用到哪学到哪。这样的确学的快,但是学的的确不扎实。
几点不弄就忘了很多。等我的东西弄完了把完整的程序放上来希望你再好好的指导下。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表