您现在的位置是:首页 > 电气技术 > 电气技术

Modbus RTU/ASCII通信协议异同点

来源:艾特贸易2017-03-17

简介Modbus基于串行通信存在两种模式:Modbus RTU与Modbus ASCII模式,不管是RTU模式还是ASCII模式,Modbus信息都以帧的方式传输,每个信息帧有确定的起始点和结束点,使接收设备在信息的起点开

Modbus基于串行通信存在两种模式:Modbus RTU与Modbus ASCII模式,不管是RTU模式还是ASCII模式,Modbus信息都以帧的方式传输,每个信息帧有确定的起始点和结束点,使接收设备在信息的起点开始读地址,并确定要寻址的设备 (主机广播时对全部设备),以及信息传输的结束时间。并且可检测部分信息,错误可作为一种结果设定。RTU模式与ASCII模式之间的区别就在于:

1.开始和结束的标志不同,RTU模式的开始和结束的标志是传输3.5字节所需要的空闲时间,假设串口通信速率为9600bps,传输一个字节所需的时间为一个毫秒左右(8/9600即/1200秒),3.5个字节的空闲时间大概就是3-4个毫秒,即当波特率为9600bps时,RTU传输空闲时间为6-8毫秒(上一个 信息帧结束空闲时间和信息帧开始空闲时间)即可开始一个新的信息帧。而ASCII模式则是采用固定的ASCII字符表示开始(:,冒号,十六进制为3AH)和结束的(CRLF,回车-换行键,十六进制为0D和0AH)。

2.校验模式不同,RTU模式采用CRC校验码,而ASCII模式则采用LRC校验码,相对来说LRC校验码更加简单易懂。LRC校验码就是将信息帧中除开始结束符(:和回车换行)之外的所有数据按字节叠加取反加1即可。LRC校验码代码如下;

BYTE GetCheckCode(const char*pSendBuf,int nEnd)//获得LRC校验码

 {

 BYTE byLrc=0;char pBuf[4];int nData=0;

 for(i=1;i<end;i+=2)

  {

  pBuf[0]=pSendBuf[i];

  pBuf[1]=pSendBuf[i+1];

  pBuf[2]='\0';

  ssanf(pBuf"%X",&nData;byLrc+=nData);

  }

  bLrc=~bLrc;

  bLrc++;

 }

CRC校验码则是每个八位字符都单独和寄存器内容相或(OR),结果向最低有效为移动,最高有效位以0填充,LSB为1,寄存器和预置的值或一下,LSB为0,则不进行,整个过程重复8次,最后一位完成后,下一个8位字节与寄存器的当前值相或,最终寄存器的值就是CRC值(关于CRC校验码在本站:循环冗余校验编码(CRC校验)中有详细介绍查表法,在此我们介绍简单代码。

WORD GetCheckCode(const char *pSendBuf,int nEnd)//获取CRC校验码

{

WORD wCrc=WORD(0xFFFF);

 for(inti=0;i<nEnd;i++)

  {

  wCrc^=WORD(BYTE(pSendBuf[i]));

  for(int j=0;j<8;j++)

   {

   if(wCrc&1)

    {

    wCrc>>=1;

    wCrc^=0xA001;

    }

   }

   else

   {

   wCrc>>=1;

   }

  }

return wCrc;

}

3.RTU模式的传输效率高于ASCII模式:ASCII模式不但需要添加开始结束标志,还需要将十六进制数据转换为ASCII码,比如十六进制0x25转换为ASCII字符则为0x32,0x35,ASCII的表述效率只是RTU表述的一半。RTU模式指令转换为ASCII模式指令:1.将CRC校验码去掉。2.将所有对应的字节转换为对应的两个字节的ASCII字符。3.加上起始标识和结束标识,并计算LRC校验码加上。