zoukankan      html  css  js  c++  java
  • STC12LE5A60S2第二串口出现的奇葩问题

    今天在调试的过程中,发现了个奇葩的问题,我按照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就无关紧要了

  • 相关阅读:
    开源情报 Advise
    介绍几本搜索引擎的基础书
    Internet上的图像检索技术
    交易系统 转 武胜
    MySql数据库导出csv 武胜
    C# Process.Start()方法详解 武胜
    转 嵌入处部程序 武胜
    网际风通视接口 武胜
    C# Process运行cmd命令的异步回显 武胜
    RBreaker 武胜
  • 原文地址:https://www.cnblogs.com/ltfbk/p/3596699.html
Copyright © 2011-2022 走看看