Commit 369c055ed2fef75130b3cc3398c5f18bbe4b78cc

Authored by Stéphane Raimbault
1 parent 8f643667

Fix CRC error when a slave RTU send a response.

Thanks to Justin Carroll to have reported and tested my patch.
Showing 1 changed file with 10 additions and 6 deletions
modbus/modbus.c
@@ -773,10 +773,12 @@ void modbus_manage_query(modbus_param_t *mb_param, const uint8_t *query, @@ -773,10 +773,12 @@ void modbus_manage_query(modbus_param_t *mb_param, const uint8_t *query,
773 773
774 sft.slave = slave; 774 sft.slave = slave;
775 sft.function = function; 775 sft.function = function;
776 - if (mb_param->type_com == TCP) 776 + if (mb_param->type_com == TCP) {
777 sft.t_id = (query[0] << 8) + query[1]; 777 sft.t_id = (query[0] << 8) + query[1];
778 - else 778 + } else {
779 sft.t_id = 0; 779 sft.t_id = 0;
  780 + query_length -= CHECKSUM_LENGTH_RTU;
  781 + }
780 782
781 switch (function) { 783 switch (function) {
782 case FC_READ_COIL_STATUS: { 784 case FC_READ_COIL_STATUS: {
@@ -868,9 +870,11 @@ void modbus_manage_query(modbus_param_t *mb_param, const uint8_t *query, @@ -868,9 +870,11 @@ void modbus_manage_query(modbus_param_t *mb_param, const uint8_t *query,
868 if (data == 0xFF00 || data == 0x0) { 870 if (data == 0xFF00 || data == 0x0) {
869 mb_mapping->tab_coil_status[address] = (data) ? ON : OFF; 871 mb_mapping->tab_coil_status[address] = (data) ? ON : OFF;
870 872
871 - /* In RTU mode, the CRC is computed  
872 - and added to the query by modbus_send */  
873 - memcpy(response, query, query_length - mb_param->checksum_length); 873 + /* In RTU mode, the CRC is computed and added
  874 + to the query by modbus_send, the computed
  875 + CRC will be same and optimisation is
  876 + possible here (FIXME). */
  877 + memcpy(response, query, query_length);
874 resp_length = query_length; 878 resp_length = query_length;
875 } else { 879 } else {
876 printf("Illegal data value %0X in force_single_coil request at address %0X\n", 880 printf("Illegal data value %0X in force_single_coil request at address %0X\n",
@@ -889,7 +893,7 @@ void modbus_manage_query(modbus_param_t *mb_param, const uint8_t *query, @@ -889,7 +893,7 @@ void modbus_manage_query(modbus_param_t *mb_param, const uint8_t *query,
889 int data = (query[offset+4] << 8) + query[offset+5]; 893 int data = (query[offset+4] << 8) + query[offset+5];
890 894
891 mb_mapping->tab_holding_registers[address] = data; 895 mb_mapping->tab_holding_registers[address] = data;
892 - memcpy(response, query, query_length - mb_param->checksum_length); 896 + memcpy(response, query, query_length);
893 resp_length = query_length; 897 resp_length = query_length;
894 } 898 }
895 break; 899 break;