| | |
| | | } |
| | | |
| | | |
| | | private static int[] Modbus_crc_tab = new int[] |
| | | { |
| | | 0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401, |
| | | 0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400, |
| | | }; |
| | | |
| | | public static void CRC16_MODBUS(byte[] buffer, int len) { |
| | | int crc; |
| | | byte dat; |
| | | int i; |
| | | crc = 0XFFFF; |
| | | for (i = 0; i < len - 2; i++) { |
| | | dat = buffer[i]; |
| | | crc = Modbus_crc_tab[(dat ^ crc) & 15] ^ (crc >> 4); |
| | | crc = Modbus_crc_tab[((dat >> 4) ^ crc) & 15] ^ (crc >> 4); |
| | | } |
| | | buffer[i] = (byte) (crc & 0xff); |
| | | buffer[i + 1] = (byte) (crc >> 8); |
| | | } |
| | | |
| | | public static boolean CRC16_MODBUS_MATCH(byte[] buffer, int len) { |
| | | int crc; |
| | | byte dat; |
| | | int i; |
| | | crc = 0XFFFF; |
| | | for (i = 0; i < len - 2; i++) { |
| | | dat = buffer[i]; |
| | | crc = Modbus_crc_tab[(dat ^ crc) & 15] ^ (crc >> 4); |
| | | crc = Modbus_crc_tab[((dat >> 4) ^ crc) & 15] ^ (crc >> 4); |
| | | } |
| | | return (buffer[i] & 0xFF) == (crc & 0xff) && (buffer[i + 1] & 0xFF) == (crc >> 8); |
| | | } |
| | | |
| | | // |
| | | // // 2.通信协议 |