打印

请问下面的串口通讯程序是否正确?

[复制链接]
1365|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jack.king|  楼主 | 2007-8-31 22:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*接受到的数据分别放在600到606个单元*/
/*协议如下
  采用相同的波特率,双方约定,发送时,先发送一个呼叫信号(0x06)
  以询问接受机是否可以接受数据,接受机收到呼叫信号后,若同意接受数据则回
  发0x00作为答应信号,表示可以接受数据,否则回发0x05,表示暂不能接受数据
  发送机只有在接收到接收机发回的答应信号0x00后才能将数据统一发送到接收机,
  否则不断想接收机发送呼叫信号,直到接收到接收机发回的0x00的应答信号.
  若接受正确,向发送机回发0x0f信号,表示正确,否则发送0xf0,表示接受到的数据出现了错误
*/
 void serial(void) interrupt 4 using 3
    {   uchar i=6;
        total_t=0x00;
              ramdata=0x600;
        while(1)
        {
        while(1)      //等待接受呼叫信号
        {
         if(RI)
         break;
         else
         ;
        }
        RI=0;
        if(SBUF==0x06)
        break;
        else
        {
        SBUF=0x05;    //不允许接受
        TI=0;
        }
        }
        SBUF=0x00; //允许接受
        while(1)
        {
         if(RI)
         break;
         else
         ;
        }
        total_t=SBUF;
        RI=0;
       while(1)
       {
                     while(1)
                      {
                      if(RI)
                     break;
                     else
                       ;
                       }
       RI=0;
       *ramdata=SBUF;
       ramdata++;
       total_t=(total_t+SBUF);//求累加和
       i--;
       if(i==0)
       {
       ramdata=0x0600;
       break;
       }
       }     //数据发送完
       while(1)      //等待接收校验和
                    {
                     if(RI)
                     break;
                     else
                       ;
                     }
       RI=0;
        if(total_t==SBUF)   //判断数据是否发送正确
        {
         SBUF=0x0f;        //数据正确则发回0x0f;
         TI=0;
            while(1)
                         {
                        if(TI)
                         break;
                        else
                          ;
                          }
         TI=0; 
        }
        else    //若错误
        {
        SBUF=0xf0;       //错误怎么发回0xf0
           while(1)
                        {
                         if(TI)
                        break;
                         else
                            ;
                         }
         TI=0;
            // 从新接收
        }
        }
/****************************************************************/
/* 发送子函数*/
/*发送的数据是从1000到1006单元*/
 void txaddr(void)
     {  uchar i=6;
       total_t1=0x00;
        ramdata1=0x1000;
        while(1)
        {
          SBUF=0x06;         //发送呼叫信号0x06
         while(1)    //等待发送完信号.  
            {
             if(TI)
             break;
             else
              ;
             }
             TI=0;
             while(1)         //等待回答信号
             {
              if(RI)
              break;
              else
              ;
             }
             RI=0;
             if(SBUF==0x00)   //判断回答信号,否则重新发送
              break;
              else
              ;
                }
        while(1)
        {
       SBUF=*ramdata1;
       while(1)
       {
       if(TI)
        break;
        else
        ;
        }
        TI=0;
        total_t1=(total_t1+SBUF);//求累加和
        ramdata1++;
        i--;
        if(i==0)
        break;
        }
        SBUF=total_t1;
        while(1)       //等待发完
        {
         if(TI)
         break;
         else
         ;
        }
        TI=0;
        RI=0;
        while(1)       //等待接收机回答
        {
        if(RI)
        break;
        else
        ;
        }
        RI=0;
        if(SBUF==0x0f)        //判断传输是否正确
        ;
        else
        ;                //需要从新发送
      }
void main(void)
 {
   SCON=0x90;
   RCLK=1;
   TCLK=1;
   RCAP2H=0xff;//产生9.6K波特率
   RCAP2L=0xd9;
   TR2=1;
   txaddr();
 }

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

488

主题

2158

帖子

1

粉丝