串口通信modbus c语言,串口通信如何使用MODBUS协议?举个C语言的例子。

匿名用户

1级

2014-11-12 回答

Modbus两种协议的编程方法:

1、LRC校验

LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。

LRC校验比较简单,它在ASCII协议中使用,检测了消息域中除开始的冒号及结束的回车换行号外的内容。它仅仅是把每一个需要传输的数据按字节叠加后取反加1即可。下面是它对应的代码:

BYTEGetCheckCode(constchar*pSendBuf,intnEnd)//获得校验码

{

BYTEbyLrc=0;

charpBuf[4];

intnData=0;

for(i=1;i

{

//每两个需要发送的ASCII码转化为一个十六进制数

pBuf[0]=pSendBuf[i];

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

pBuf[2]='\0';

sscanf(pBuf,"%x",&nData);

byLrc+=nData;

}

byLrc=~byLrc;

byLrc++;

returnbyLrc;

}

2、CRC校验

CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。

CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。

CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。

CRC添加到消息中时,低字节先加入,然后高字节。下面是它对应的代码:

WORDGetCheckCode(constchar*pSendBuf,intnEnd)//获得校验码

{

WORDwCrc=WORD(0xFFFF);

for(inti=0;i

{

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

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

{

if(wCrc&1)

{

wCrc>>=1;

wCrc^=0xA001;

}

else

{

wCrc>>=1;

}

}

}

returnwCrc;

}

对于一条RTU协议的命令可以简单的通过以下的步骤转化为ASCII协议的命令:

1、把命令的CRC校验去掉,并且计算出LRC校验取代。

2、把生成的命令串的每一个字节转化成对应的两个字节的ASCII码,比如0x03转化成0x30,0x33(0的ASCII码和3的ASCII码)。

3、在命令的开头加上起始标记“:”,它的ASCII码为0x3A。

4、在命令的尾部加上结束标记CR,LF(0xD,0xA),此处的CR,LF表示回车和换行的ASCII码。

掌握两种协议的编程方法,剩下的就是C语言的问题了。

悉雨辰寂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值