串口通讯问题,

[复制链接]
5088|8
 楼主| 喷嚏成风 发表于 2013-4-19 17:10 | 显示全部楼层 |阅读模式
这是郭天祥的代码
  1. #include "reg52.h"

  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]="I get ";
  5. uchar flag,a,i;



  6. void init()
  7. {
  8.         TMOD=0X20;
  9.         TH1=0XFD;
  10.         TL1=0XFD;
  11.         TR1=1;
  12.         SM0=0;
  13.         SM1=1;
  14.         REN=1;
  15.         EA=1;
  16.         ES=1;
  17. }

  18. void main()
  19. {
  20.         init();

  21.         while(1)
  22.         {
  23.             if(flag==1)
  24.                 {
  25.                         ES=0;
  26.                         for(i=0;i<6;i++)
  27.                          {
  28.                            SBUF=table[i];
  29.                            while(!TI);
  30.                            TI=0;       
  31.                         }
  32.                
  33.                   SBUF=a;
  34.                   while(!TI);
  35.                   TI=0;
  36.                   ES=1;
  37.                   flag=0;
  38.                   }

  39.         }
  40.        

  41.        
  42. }
  43. void ser() interrupt 4
  44. {
  45.         RI=0;
  46.         a=SBUF;
  47.         flag=1;
  48. }
下面是我的代码
  1. #include "reg52.h"

  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[]="I get ";
  5. uchar flag,a,i;

  6. void delayms(uint z)
  7. {
  8.         uint x,y;
  9.         for(x=z;x>0;x--)
  10.                 for(y=110;y>0;y--);
  11. }

  12. void init()
  13. {
  14.         TMOD=0X20;
  15.         TH1=0XFD;
  16.         TL1=0XFD;
  17.         TR1=1;
  18.         SM0=0;
  19.         SM1=1;
  20.         REN=1;
  21.         EA=1;
  22.         ES=1;
  23. }

  24. void main()
  25. {
  26.         init();

  27.         while(1)
  28.         {
  29.         a=SBUF;
  30.         if(RI==1)
  31.         {
  32.         for(i=0;i<6;i++)
  33.         {
  34.                 SBUF=table[i];
  35.                 delayms(500);
  36.                
  37.         }
  38.         SBUF=a;
  39.         delayms(500);
  40.         SBUF=' ';
  41.         delayms(500);

  42.         RI=0;
  43.         }
  44.         }

  45.        
  46. }
 楼主| 喷嚏成风 发表于 2013-4-19 17:13 | 显示全部楼层
本来是想自己一步一步来,没想到这样就可以了,和郭天祥的差别很大。我的程序延时函数改为100ms就不行了。我这样写的程序行吗。功能是可以。但是没把TI置零可以吗?
ningling_21 发表于 2013-4-19 19:17 | 显示全部楼层
TI只是中断标志,如果不清除,会重复触发串口中断...
如果关闭串口中断,用查询的方式也可以工作...
你这样的程序勉强能工作...
 楼主| 喷嚏成风 发表于 2013-4-20 09:52 | 显示全部楼层
ningling_21 发表于 2013-4-19 19:17
TI只是中断标志,如果不清除,会重复触发串口中断...
如果关闭串口中断,用查询的方式也可以工作...
你这样 ...

谢谢,但是TI没清零的话,程序一直处于串口中断,应该不能发送下一个数据才对呀,可是我延时一会儿就可以了。不过时间短点的话,会出错
gx_huang 发表于 2013-4-20 10:07 | 显示全部楼层
先把串口的原理搞清楚,特别是中断和查询、TI/RI如何处理要搞明白。
ningling_21 发表于 2013-4-20 10:37 | 显示全部楼层
喷嚏成风 发表于 2013-4-20 09:52
谢谢,但是TI没清零的话,程序一直处于串口中断,应该不能发送下一个数据才对呀,可是我延时一会儿就可以 ...

如果TI未清除,如果开了中断的话才会进入中断处理否则不会。
如果上个数据已发送完成,TI未清除也一样能发送。
延时一会是让数据发送完成。
如果上一个数据未发送完成,发送下一个数据肯定出错。

评分

参与人数 1威望 +1 收起 理由
喷嚏成风 + 1 很给力!

查看全部评分

helong124 发表于 2013-4-20 12:07 | 显示全部楼层
说得不错
 楼主| 喷嚏成风 发表于 2013-4-21 17:06 | 显示全部楼层
ningling_21 发表于 2013-4-20 10:37
如果TI未清除,如果开了中断的话才会进入中断处理否则不会。
如果上个数据已发送完成,TI未清除也一样能 ...

就是说下面如果写一个中断函数的话,ES没等于的话,是不会处理这个函数的是不是?
 楼主| 喷嚏成风 发表于 2013-4-21 17:08 | 显示全部楼层
喷嚏成风 发表于 2013-4-21 17:06
就是说下面如果写一个中断函数的话,ES没等于的话,是不会处理这个函数的是不是? ...

”ES没等于“后少了个1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部