打印

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

[复制链接]
2385|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 | 只看该作者

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

使用特权

评论回复
5
懒人| | 2007-9-1 18:46 | 只看该作者

超时检测

使用特权

评论回复
6
gyt| | 2007-9-1 20:46 | 只看该作者

发一个结束信号

使用特权

评论回复
7
车载音响| | 2007-9-1 21:35 | 只看该作者

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

使用特权

评论回复
8
conwh| | 2007-9-1 22:12 | 只看该作者

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

使用特权

评论回复
9
jack.king|  楼主 | 2007-9-2 15:46 | 只看该作者

求累加和是什么意思是?

使用特权

评论回复
10
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;
        }
        }
但是我不知道怎么来确定数据是否发完.时候正确

使用特权

评论回复
11
懒人| | 2007-9-2 16:08 | 只看该作者

通信协议

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

使用特权

评论回复
12
jack.king|  楼主 | 2007-9-2 17:17 | 只看该作者

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


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

使用特权

评论回复
13
gyt| | 2007-9-2 21:13 | 只看该作者

这样就不错了

每次发送时,先发一个这次要发送的字节数,最后再发一个累加和之类的简易检验数据,基本上就可以了。

使用特权

评论回复
14
conwh| | 2007-9-2 21:56 | 只看该作者

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

使用特权

评论回复
15
jack.king|  楼主 | 2007-9-2 23:45 | 只看该作者

谢谢.我知道了!



   谢谢我知道了!明天到机器上去实验下!

使用特权

评论回复
16
jack.king|  楼主 | 2007-9-3 12:47 | 只看该作者

T2的波特率模式下的问题

     请问 
      但是用用T2计算器,用于波特率模式的时候
     处理T2CON=0x34;//设置成波特率模式和启动TR2
   对于TH2和TL2还有RACP2H和RACP2L改怎么去设置
     是不是只需要对RACP2H和RACP2L赋值.
    还是也要对TH2和TL2 同样设置!

使用特权

评论回复
17
gyt| | 2007-9-3 21:23 | 只看该作者

只需要对RACP2H和RACP2L赋值

没错

使用特权

评论回复
18
jack.king|  楼主 | 2007-9-3 21:49 | 只看该作者

谢谢!

   终于第一搞好了!谢谢大哥们的指导!

使用特权

评论回复
19
yuanquan12345| | 2014-2-23 16:58 | 只看该作者
jack.king 发表于 2007-9-3 21:49
   终于第一搞好了!谢谢大哥们的指导!

能具体说说吗?我正在学通信。
谢谢。

使用特权

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

本版积分规则

488

主题

2158

帖子

1

粉丝