请问单片机通讯时怎么来确定数据发完了?

[复制链接]
3535|18
 楼主| jack.king 发表于 2007-9-1 15:10 | 显示全部楼层 |阅读模式


        请问单片机通讯时怎么来确定数据发完了?
             根据什么原理?
          
reckon 发表于 2007-9-1 15:12 | 显示全部楼层

什么通信?

 楼主| jack.king 发表于 2007-9-1 15:46 | 显示全部楼层

就是2个单片机之间发数据和接受数据.

就是2个单片机之间发数据和接受数据.
conwh 发表于 2007-9-1 15:56 | 显示全部楼层

可以是定长,也可以使用通讯结束专用符号。

懒人 发表于 2007-9-1 18:46 | 显示全部楼层

超时检测

gyt 发表于 2007-9-1 20:46 | 显示全部楼层

发一个结束信号

车载音响 发表于 2007-9-1 21:35 | 显示全部楼层

命令中加长度或者加停止符

conwh 发表于 2007-9-1 22:12 | 显示全部楼层

5L说的是通讯超时错误的处理

 楼主| jack.king 发表于 2007-9-2 15:46 | 显示全部楼层

求累加和是什么意思是?

 楼主| jack.king 发表于 2007-9-2 15:57 | 显示全部楼层

求累加和是什么意思是?

   在2个单片机通讯时我看了别人写的汇编程序是用的求累加和的方法.这个方法是什么意思啊?
  下面是我用C写的程序.看看是否可以?
/************************************************/
/*接受程序*/
  void serial(void) interrupt 4 using 3
    {       
        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;
        j=1;
       while(1)    //开始接受数据了
       {
                     while(1)
                      {
                      if(RI)
                     break;
                     else
                       ;
                       }
       RI=0;
       re_t=SBUF;
       re_data();//(一个通过SWITCH构成的子程序)根据J的不同来确定把接受到的数据放在不同的地方
        j++;
       if(j==7)
       break;
       }     //数据发送完
      }
/***********************************************************/
/*接受程序*/
void txaddr(void)
     { 
           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
              ;
          }
          i=1;
        while(1)         //开始发送数据
        {
        send_data();//根据I的不同来确定发送的不同的数据
        SBUF=send_t
        while(1)
        {
       if(TI)
        break;
        else
        ;
        }
        TI=0;
         i++;
        if(i==7)
        break;
        }
        }
但是我不知道怎么来确定数据是否发完.时候正确
懒人 发表于 2007-9-2 16:08 | 显示全部楼层

通信协议

 串行通信一般需要一个通信协议,该协议决定了你什么时候发送完成并决定接收完成。通信协议具有同步字,并指定了串行数据采用定长数据还是变长数据,变长数据时,同步字后可以是数据长度或者命令。如果不放心,还可以采用超时结束,例如超时5ms就认为接收结束。
  累加和是一种接收校验方式,主要是保证接收数据的正确性,校验还可以采用crc或者异或等等,就看通信协议的规定了。
 楼主| jack.king 发表于 2007-9-2 17:17 | 显示全部楼层

请问我上面的发送和接受程序是否正确?


  请问我上面的发送和接受程序是否正确?
  通信协议如下:
  采用相同的波特率,双方约定,发送时,先发送一个呼叫信号(0x06)
  以询问接受机是否可以接受数据,接受机收到呼叫信号后,若同意接受数据则回
  发0x00作为答应信号,表示可以接受数据,否则回发0x05,表示暂不能接受数据
  发送机只有在接收到接收机发回的答应信号0x00后才能将数据统一发送到接收机,
  否则不断想接收机发送呼叫信号,直到接收到接收机发回的0x00的应答信号.
  若接受正确,向发送机回发0x0f信号,表示正确,否则发送0xf0,表示接受到的数据出现了错误.
  以上程序还是怎么改变下!
gyt 发表于 2007-9-2 21:13 | 显示全部楼层

这样就不错了

每次发送时,先发一个这次要发送的字节数,最后再发一个累加和之类的简易检验数据,基本上就可以了。
conwh 发表于 2007-9-2 21:56 | 显示全部楼层

累加和是最简单的校验,采用的也比较多

 楼主| jack.king 发表于 2007-9-2 23:45 | 显示全部楼层

谢谢.我知道了!



   谢谢我知道了!明天到机器上去实验下!
 楼主| jack.king 发表于 2007-9-3 12:47 | 显示全部楼层

T2的波特率模式下的问题

     请问 
      但是用用T2计算器,用于波特率模式的时候
     处理T2CON=0x34;//设置成波特率模式和启动TR2
   对于TH2和TL2还有RACP2H和RACP2L改怎么去设置
     是不是只需要对RACP2H和RACP2L赋值.
    还是也要对TH2和TL2 同样设置!
gyt 发表于 2007-9-3 21:23 | 显示全部楼层

只需要对RACP2H和RACP2L赋值

没错
 楼主| jack.king 发表于 2007-9-3 21:49 | 显示全部楼层

谢谢!

   终于第一搞好了!谢谢大哥们的指导!
yuanquan12345 发表于 2014-2-23 16:58 | 显示全部楼层
jack.king 发表于 2007-9-3 21:49
   终于第一搞好了!谢谢大哥们的指导!

能具体说说吗?我正在学通信。
谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

488

主题

2158

帖子

1

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