单片机 用c语言编写 modbus rtu 通讯怎么写啊 主要是crc 校验部分不知道怎么写 怎么把一窜字符进行CRC计算

请详细的说明下吧 谢谢了 真的是搞不明白了 望高手指点啊

我刚刚写好.跟PLC连接测试过,可以的.

/***************************************************************
CRC计算方法
1.预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低
8位相异或,把结果放于CRC寄存器;
3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
4.如果移出位为0:重复第3步(再次右移一位);
如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
6.重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
7.将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC;

*****************************************************************/

/****************************************************************************
名称: UART_CRC16_Work()
说明: CRC16校验程序
参数: *CRC_Buf:数据地址
CRC_Leni:数据长度
返回: CRC_Sumx:校验值
*****************************************************************************/
unsigned int UART_CRC16_Work(unsigned char *CRC_Buf,unsigned char CRC_Leni)
{
unsigned char i,j;
unsigned int CRC_Sumx;

CRC_Sumx=0xFFFF;
for(i=0;i<CRC_Leni;i++)
{
CRC_Sumx^=*(CRC_Buf+i);//异或
for(j=0;j<8;j++)
{
if(CRC_Sumx & 0x01)
{
CRC_Sumx>>=1;
CRC_Sumx^=0xA001;
}
else
{
CRC_Sumx>>=1;
}
}
}
return (CRC_Sumx);
}
温馨提示:内容为网友见解,仅供参考
无其他回答

...用c语言编写 modbus rtu 通讯怎么写啊 主要是crc 校验部分不知道怎么...
1.预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低 8位相异或,把结果放于CRC寄存器;3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;4.如果移出位为0:...

51单片机MODBUS通讯,RTU中的CRC校验
Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser\/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。 Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC...

modbus RTU通信时,CRC验证码怎样计算?是否有快捷简单的方法?麻烦举例一...
目前CRC校验有直接计算和查表法。这两种方法我都用PLC(AB)梯形图实现过。直接计算会让PLC的执行时间将变得很长,特别是当传输数据量大的时候,因为每个字节的每个位都要进行一次计算。推荐用查表法,PLC执行快,一个字节查表一次,计算一次。至于算法可百度搜索,很多用C语言实现的,想办法把它转为...

plC和变频器通讯中用的modbus协议的Rtu方式中的数据帧的crc校验码是要...
正常的产品中,无论是PLC侧还是变频器侧 MODBUS RTU协议已经封装好,只要填上相应的命令就行了,比如,是读还是写,起始地址,个数、存放地址 。复杂点的还要填写头和结束符。不用自己写CRC

modbus怎么写命令
字节0为从设备ID、字节1为功能码(十六进制)、字节2-3为Modbus寄存器开始地址、字节4-5为寄存器个数、字节6为发送字节个数、字节7-26为发送数据(20个字节)、字节27-28为RCR校验。功能码15号命令请求格式(从设备地址为1、Modbus功能码15、Modbus寄存器开始地址0、写位变量个数16,即2个字节):...

MODBUS RTU通讯协议中,功能码为15、16的请求格式怎么写,各个字节代表什...
CRC)。Modbus协议是一个广泛应用于工业自动化环境的通信标准,它支持多设备连接,如温度湿度测量装置与监控计算机之间的通信。在SCADA系统中,Modbus被用来连接监控计算机和远程终端控制系统(RTU),而串口EIA-485是常见的物理层实现方式。要了解更多关于Modbus通讯协议的信息,可以参考百度百科的相关内容。

Modbus总线设计总结
C语言和VHDL语言实现CRC校验:前者通过位操作实现,后者在硬件设计中通过逻辑操作完成。Modbus寄存器分为位变量(Coils)和整形变量(Registers),每种类型根据读写方式分为只读和读写。Modbus功能码定义了不同的通信操作,如读线圈、读离散量输入、读保持寄存器、读输入寄存器、写单个线圈、写单个保持寄存器等...

求助s7-200的crc校验问题
CRC 校验程序, CRC 校验是在每一帧数据 发送或接收完成时 就要调用的。 内容的回复:我就是在这儿卡住了,不知道西门子modbus rtu的库到底包含什么程序,里面是不是有crc校验程序。听你这么一解释,我好像知道了。 就这么理解就对了, CRC 校验就在库里面 完成了,不需要额外去 写,或者调用。

三菱pLC FX3U modbus RTU RS485通信中CRC校验怎么发送
RTU是CRC校验没有错,但没有必要去这样写程序,现在都使用模块化进行设定了。只要选择对方设备填入PLC地址就可以了。不必去计算,现在都是人工智能化。

modbus tcp 协议的c语言怎么写
如果用C语言编程实现MODBUS通讯,难度还是很大的。首先需要实现TCP通讯,这里面涉及到TCP侦听模块、TCP数据收发模块、断线重连模块、如果是多信道连接,还需要处理多信道并行通讯等。在实现了TCP通讯核心程序的基础上,通过数据发送程序模块,按照MODBUS指令格式,向前端设备发出正确的MODBUS指令(RTU或ASCII)即可...

相似回答