在使用java与下位机通信中,经常会涉及到modbus协议,而作为校验手段,CRC16必不可少。
网上搜到的绝大部分实现都不是为modbus编写的,经过与下位机的通信检验,我选择了其中两个比较简洁的实现并根据自己的需要加以改进,完成了以下两个工具类。
希望对需要此类编程的朋友有所帮助。
对附件说明如下:
class CRC_16 ——采用运算实现的CRC
class CRC16M——采用查表实现的CRC
对主要方法说明如下:
alex_crc16——crc运算
getSendBuf——根据十六进制字符串获得带CRC校验字的字节数组
getBufHexStr——将字节数组打印为十六进制字符串
checkBuf——验证应答的字节数组
另外今天调程序还犯了一个低级错误,因为java中的byte是无符号的,因此在多数情况下是不能直接拿来相加的,需要先转换为无符号值
。
例如:说明书算式为: (bh & 03H) * 256 + bl
,即高字节后两位乘256加上低字节,如果直接将低字节拿去相加可能造成低字节值为负数。
加之前必须进行类似这样的转换 (bh&0x03)*256+(int)(bl&0xff)
分享到:
相关推荐
在Java中实现Modbus RTU通信,通常需要编写或使用已有的Modbus库,如JModbus、Modbus-Java等。这些库提供了解析和构建Modbus请求和响应的工具,包括读取和写入寄存器、输入寄存器、线圈和离散输入等功能。例如,如果...
在IT领域,数据类型转换是常见的操作,尤其是在通信协议如MODBUS中,为了高效传输和正确解析数据,需要将数值转换成不同的格式。...对于具体实现,可以参考相关编程语言的库函数或自己编写解码算法。
1. **帧结构**:RTU帧结构包括一个起始字符(两个空闲位),接着是功能码、寄存器地址、数据长度、数据、最后是CRC校验。你需要精确地构建这些字段,并确保在接收端正确解析。 2. **CRC校验**:循环冗余校验(CRC)...
一个典型的ModBus-RTU数据帧包括:起始位(无特殊表示)、地址域(1个字节,主设备地址或从设备地址)、功能码(1个字节,指示要执行的操作)、数据域(可变长度,根据功能码决定)、校验码(通常为CRC-16,2个字节...
5. **多设备管理**:库可能会提供接口来管理多个Modbus设备,方便切换和通信。 6. **请求和响应构建**:库会提供API来构造Modbus请求,并解析接收到的响应,提取所需的数据。 7. **异常处理**:在Modbus通信中,...
1. **MODBUS功能码**:每个MODBUS通信都由一个特定的功能码开始,指示要执行的操作,如读寄存器、写寄存器、读线圈状态等。 2. **数据地址映射**:MODBUS协议定义了不同的数据类型,如离散输入、线圈、输入寄存器和...
RXTX是一个开源的Java库,它允许Java应用程序与串行和并行端口进行交互,这对于实现工业设备之间的通信至关重要,比如使用Modbus协议的设备。 Modbus是一种广泛使用的工业通信协议,它允许不同的设备(如PLC、SCADA...
Modbus4j是一个Java库,专门用于实现Modbus通信协议,这是工业自动化系统中广泛使用的标准通信协议。这个工具包包含了一系列的类和接口,帮助开发者在Java应用程序中轻松地与支持Modbus协议的硬件设备(如PLC、RTU、...
1. **编程实现**:开发者可以使用各种编程语言(如C、Python、Java等)编写Modbus客户端和服务器程序,实现对设备的控制和数据采集。库如libmodbus、py-modbus等提供了便利的API。 2. **应用领域**:Modbus广泛应用...
因此,开发者需要自行编写代码来实现Modbus协议的数据报文解析和发送功能。这通常涉及到理解Modbus协议的细节,包括其帧结构、命令码以及错误处理机制。 Qt是一个跨平台的应用程序开发框架,允许开发者用C++语言...