当前位置: 代码迷 >> 单片机 >> 485通讯,会多收到一个字符?解决方案
  详细解决方案

485通讯,会多收到一个字符?解决方案

热度:71   发布时间:2016-04-28 16:22:54.0
485通讯,会多收到一个字符?
我的单片机,在单个机器运行时一切正常。
但当我接入两个机器时,向A机发信息,再向B机发信息,此时B机会收到不正常信号,就是开头会多一个字符,如:我发一个CMD123456,它会收到CCMD123456,多了一个 'C ',这是怎么回事?我在单机时是正常的。
当我向A发,再向B机发,再向A机发,此时A机就会收到正常。
请高手帮忙看看,
这好像是软件问题是吧?

通讯部分的程序

#include   <reg52.h>    
#include   "servermainframe.h "

#define     uchar     unsigned   char
#define     uint       unsigned   int
#define     ILEN     96                                           /*   size   of   serial   receiving   buffer             */
idata       unsigned   char     inbuf[ILEN];    
unsigned   char   idata   *inlast=inbuf;     //最后由中断进入接收缓冲区的字节位置
unsigned   char   idata   *getlast=inbuf;     //最后取走的字节位置                                    
bit       inbufsign;             //接收缓冲区非空标志       有=1
bit       inbufful;               //输入缓冲区满标志     满=1

unsigned   char   _NewstringIN;//1   there   is   new   string,0   there   is   none.

//*****************************  
//放入一个字节到发送缓冲区

putbyte(char   c){
  ES=0;                         //暂停串行中断,以免数据比较时出错?          
  TI   =   0;    
  SBUF=c;   //未发送完继续发送
  while(!TI);
  TI=0;
        ES=1;
}


//***************************************
//发送一个定义在程序存储区的字符串到串口
putstring(unsigned   char     *puts){
        COMENABLE=SENDENABLE;
  for   (;*puts!=0;puts++)       //遇到停止符0结束
    putbyte(*puts);
        COMENABLE=RECEIVEENABLE;
}
//*************************************

//从接收缓冲区取一个byte,如不想等待则在调用前检测inbufsign是否为1。
uchar   getbyte   (void){  
  char   idata   c   ;
  while   (!inbufsign);           //缓冲区空等待
  ES=0;    
  c=   *getlast;                         //取数据  
  getlast++;                             //最后取走的数据位置加一
  inbufful=0;                         //输入缓冲区的满标志清零      
  if   (getlast==inbuf+ILEN)  
    getlast=inbuf;   //地址到顶部回到底部
  if   (getlast==inlast)  
    inbufsign=0;               //地址相等置接收缓冲区空空标志,再取数前要检该标志
  ES=1;
  return   (c);                 //取回数据
}

//*****************************************
//接收一行数据,必须定义放数据串的指针位置和大小         del=0x7f,backspace=0x08,cr=0x0d,lf=0x0a
void   getline   (uchar   idata   *line)    
{   unsigned   char   cnt   =   0;     //定义已接收的长度
  相关解决方案