今天在调试的过程中,发现了个奇葩的问题,我按照datasheet上面的程序测试Uart2,但是只能发送一个字节,当通过uart和uart2交叉发送数据时,可以一直发送,但是当我禁掉uart只用Uart2发送时,却出现了问题:不能连续发送。。我纳闷了,这到底是怎么回事,后来才发现原来是TI=1时,影响了Uart2的发送,必须申明的是,Uart的S2TI是通过串口中断的方式清零的,如果是程序等待S2TI==0后直接发送不会出现该问题。具体程序如下:

bit busy;

void main(){

   S2CON=0x50; //8位Uart 无奇偶校验
    BRT=-(FOSC/32/BAUD2);
    AUXR=0x14;
    IE2=0x01; //Enable Uart2 Interrupt   
                   
       EA = 1;                  //打开总中断  

    TI=1; 

   while(1)   //在网络正常后跳出循环
   {

      send_uart2('O');
      send_uart2('K');

      send_uart2('K');
    }

}

void serial2 () interrupt 8 using 1
{
    if (S2CON&S2RI)
    { 
        S2CON &= ~S2RI ;   //清除接收结束标志位
    }


 if(S2CON&S2TI)//S2TI变为1时清除标志位1
 {
  S2CON &= ~S2TI;
  busy=0;
 }
}

void send_uart2( unsigned char ch)
         { 
          
              while(busy); 
       busy=1;
       S2BUF=ch;   
          }

如上所示,如果TI=1的话,就不能连续发送了,此时TI必须为0(不知道是什么原因)

当然也可以这样写

void send_uart2( unsigned char ch)
         { 
          
       S2BUF=ch;
            while(!(S2CON&S2TI)); 
       S2CON &= ~S2TI;
     
          }

这样的话TI等不等于1就无关紧要了

posted on 2014-03-12 16:55  阑珊寻梦  阅读(1309)  评论(0编辑  收藏  举报