Commit 27b90deddba7c4d7c5d7d8494f1aec9ef6d69cea
Committed by
Stéphane Raimbault
1 parent
a2e0e454
Swap CRC bytes in request data but not at CRC computing (#397)
Showing
1 changed file
with
8 additions
and
5 deletions
src/modbus-rtu.c
| ... | ... | @@ -137,9 +137,9 @@ static uint16_t crc16(uint8_t *buffer, uint16_t buffer_length) |
| 137 | 137 | |
| 138 | 138 | /* pass through message buffer */ |
| 139 | 139 | while (buffer_length--) { |
| 140 | - i = crc_hi ^ *buffer++; /* calculate the CRC */ | |
| 141 | - crc_hi = crc_lo ^ table_crc_hi[i]; | |
| 142 | - crc_lo = table_crc_lo[i]; | |
| 140 | + i = crc_lo ^ *buffer++; /* calculate the CRC */ | |
| 141 | + crc_lo = crc_hi ^ table_crc_hi[i]; | |
| 142 | + crc_hi = table_crc_lo[i]; | |
| 143 | 143 | } |
| 144 | 144 | |
| 145 | 145 | return (crc_hi << 8 | crc_lo); |
| ... | ... | @@ -155,8 +155,11 @@ static int _modbus_rtu_prepare_response_tid(const uint8_t *req, int *req_length) |
| 155 | 155 | static int _modbus_rtu_send_msg_pre(uint8_t *req, int req_length) |
| 156 | 156 | { |
| 157 | 157 | uint16_t crc = crc16(req, req_length); |
| 158 | - req[req_length++] = crc >> 8; | |
| 158 | + | |
| 159 | + /* According to the MODBUS specs (p. 14), the low order byte of the CRC comes | |
| 160 | + * first in the RTU message */ | |
| 159 | 161 | req[req_length++] = crc & 0x00FF; |
| 162 | + req[req_length++] = crc >> 8; | |
| 160 | 163 | |
| 161 | 164 | return req_length; |
| 162 | 165 | } |
| ... | ... | @@ -374,7 +377,7 @@ static int _modbus_rtu_check_integrity(modbus_t *ctx, uint8_t *msg, |
| 374 | 377 | } |
| 375 | 378 | |
| 376 | 379 | crc_calculated = crc16(msg, msg_length - 2); |
| 377 | - crc_received = (msg[msg_length - 2] << 8) | msg[msg_length - 1]; | |
| 380 | + crc_received = (msg[msg_length - 1] << 8) | msg[msg_length - 2]; | |
| 378 | 381 | |
| 379 | 382 | /* Check CRC of msg */ |
| 380 | 383 | if (crc_calculated == crc_received) { | ... | ... |