4244|2

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

485通讯,会多收到一个字符? [复制链接]

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

通讯部分的程序

#include   
#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;  //定义已接收的长度
  char c;  
  do  {
      c = getbyte ();
      
      if(c == 0x0d){//enter
       line++;
     break;
   }
   if(++cnt>16){
    _NewstringIN=1;
    break;
   }
   
   *line = c;   
      line++;                               //指针加一
  }  while (1); //数目到了,回车或ESC停止   
}

//*****************************************
//串口中断处理
serial () interrupt 4 {
    if (RI){
     RI = 0;
     if(!inbufful){
   *inlast= SBUF;            //放入数据     
   if(*inlast==0x0d)
    _NewstringIN=1;
   inlast++;                 //最后放入的位置加一
   inbufsign=1;
   if (inlast==inbuf+ILEN)
    inlast=inbuf;//地址到顶部回到底部
   if (inlast==getlast)
    inbufful=1;  //接收缓冲区满置满标志      
     }
    }
}
//*****************************
//串口初始化                0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200
serial_init ()  {
   TMOD = 0x20;  //MOV   89H,#20H  ;timer 1 mode 2: 8-Bit reload(定时器T1 模式2: 8位自动初值重装)
   TH1  = 0xFA;  //MOV   8DH,#0E8H
   TL1  = 0xFA;  //MOV   8BH,#0E8H ;9600bps, 22.1184M
   TR1  = 1;     //SETB  8EH       ;启动定时器1
   SCON = 0x50;  // mode 1: 10-bit UART, enable receiver(模式1: 10位异步发送/接收, 使能接收允许位)
   SM2  = 1;     //SETB  O9DH      ;收到有效的停止位时才将RI置1
   ES   = 1;     //SETB  0ACH      ;允许串行中断
   EA   = 1;     //SETB  0AFH      ;总中断开   
_NewstringIN=0;//1 there is new string,0 there is none.
COMENABLE=RECEIVEENABLE;//receive enable
}

最新回复

搞定了,是程序问题。 我在收字符时会发一个结束符0x0d,发字符时也要发一个结束符0x0d,我上面忘记发了,所以它不正常了,呵呵 谢谢。   详情 回复 发表于 2007-1-20 10:05
点赞 关注

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
具体我也不知道,以前坛子里的一哥们说过485对时序要求很严格,不知道是不是这个的问题...
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
搞定了,是程序问题。

我在收字符时会发一个结束符0x0d,发字符时也要发一个结束符0x0d,我上面忘记发了,所以它不正常了,呵呵

谢谢。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖探索 | 和村田一起,深挖 GNSS 开发!
活动时间:即日起-5月11日
活动奖励:智能手环、螺丝刀套装、双肩包

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 10

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表