51串口发送接收求解

2019-07-16 06:08发布

我想问一下关于51的串口SBUF寄存器,在读走SBUF寄存器后接收寄存器SBUF中的内容是否变化?在向SBUF写完一次数据后,直至单片机将SBUF中的数据完全传输出去令ti等于1时,发送寄存器SBUF内容是否会变化?
因为我在调试51串口发送数据到电脑时,发现将串口及定时器1初始化完成后,只要将SBUF设置了初值,电脑端就能一直接收该数据。
我原本是想使用串口调试助手发送0xaa时,单片机将0x12发送回来,但是只要我向单片机发送0xaa后,单片机就一直发送0x12,但是只要我发送0xfe或0xfd单片机就停止发送了,这是怎么回事呢?
以下是源程序及debug截图
  1. void main()
  2. {
  3.         UartInit(1);             //串口和定时器1初始化
  4.         EA = 1;
  5.         while(1)
  6.                 {
  7.           switch(Rdata){
  8.                                 case 0xfd: P1 = 0x55;
  9.                                                         break;
  10.                                 case 0xfe: P1 = 0xaa;
  11.                                                         break;
  12.                                 case 0xaa: SBUF = 0x12;
  13.           }
  14.                 }
  15. }

  16. void ser() interrupt 4
  17. {
  18.         if(!TI){               //接收中断
  19.                 Rdata = SBUF;           //将接收缓冲区中的数据读走并保留在Rdata变量中
  20.                 RI = 0;                           //将RI置0,允许接收
  21.         }
  22.         else{
  23.         Rdata = 0xff;
  24.                 TI = 0;
  25.         }
  26. }
复制代码 debug


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
diaozhe
1楼-- · 2019-07-16 09:45
没人帮忙吗?
wananjushi
2楼-- · 2019-07-16 15:42
 精彩回答 2  元偷偷看……
cczhangbb002
3楼-- · 2019-07-16 21:16
   
hanfei69882
4楼-- · 2019-07-17 01:24
  1. void ser() interrupt 4
  2. {
  3.     if(RI)
  4.         {
  5.                 RI = 0;
  6.                 Rdata = SBUF;
  7.         }
  8.         if(TI)
  9.         {
  10.                 TI = 0;
  11.         }
  12. }
复制代码应该是串口中断没写好:RI接收标志,TI发送标志
草木皆兵
5楼-- · 2019-07-17 05:54
串口发送数据后没有清零发送标志TI
在  case 0xaa: SBUF = 0x12;
后再加TI=0;
即: case 0xaa:  SBUF = 0x12;
                     TI=0;
            还有你编写程序代码一定要规范
你  那个if(!TI)并不能代表if(RI)
不一定就是      没有发送就是接收   所以if(!TI)得改成if(RI)

还有swich语句  不全面   程序可能出错   或者跑飞

咱也新手
讲的不对的  可以指点

一周热门 更多>