毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> 嵌入式 >> 正文

modbus协议RTU模式下加上奇偶校验无法通讯

更新时间:2014-2-28:  来源:毕业论文
我第一次接触RTU,用S52的片子,程序基本功能写好以后,只要加上奇偶校验就出问题,例如我接受到上位机的指令00 03 00 00 00 01 crc,加上奇偶校验的程序不是没反应就是应答为00 03 00 00 00 3F CRC,总是不对,我的这部分程序是借鉴网络上的的代码,如下:
        if(RI)
{
   RI=0;T
   receBuf[receCount]=SBUF;  //接收数据
   receCount++;
   if(receCount==8)command_ok=1;
   commCount=receCount;
           ACC=receBuf[receCount];
           //以下进行奇偶校验
   if(P!=RB8) js_check=2;
           receCount&=0x0f;
   dwIntTick=0;TR0=1;//接收完数据,启动接收计时,检测是否停顿超过1.5个字符时间停顿!
}
检验校验部分如下:
       js_CRC=receBuf[7]+(receBuf[6]<<8);
if((receBuf[0]==0x0b)&&(js_CRC==crc_z))//是否发给本机,并CRC正确?
{
        if(js_check==1)//奇偶校验正确?
        { 相应的操作}
只要加上奇偶校验和检测马上出问题,反馈和接受都不行,求牛人帮帮我,江湖救急啊
一般奇偶校验在硬件做,还要注意通讯另一端要作相应设置
crc_z=crc16(receBuf,commCount-2);//求接收到的指令出去最后两位CRC位的CRC,用来判断CRC是否相等
js_check=1是初始化,如果奇偶检验不对则为2,对则不变。
    硬件做的奇偶检验虽然是,但是由于RTU带有奇偶检验的数据是每个字符11位,这样加上校验位的话传输应答从应答数据来看数据发生错误.
    想请教这种错误是不是11位数据造成的,因为如果是8N1传输,是1位停止位,而奇偶检验多出一位,会不会导致错误,其实RTU的奇偶校验模式是很成熟的方法了,网络上的兄弟提供的借鉴源代码都这佯作的,但是为什么会通讯不上?
    在CSDN里我也找个几分相关的代码下来借鉴下,奇偶检验也都这么做的,为什么但是都不能正常通讯.
    单片机回复代码如下,这里的sendBuf[]我测试的时候让它跟接受的指令相同:
     for(i=0;i<=sendCount;i++)
{
chenck_fun(sendBuf[sendCount]);
SBUF=sendBuf[i];while(!TI);TI=0;
}
        void chenck_fun(uint8 x)
       {
          ACC=x;
  if(P) {TB8=1;} //若P=1,说明有奇数个1,TB8置1
  else  {TB8=0;}
       }
奇偶校验有硬件完成,不需要软件检测!
在硬件设定时选择就可以了,如8E1或8O1,否则是8N1
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。