diff --git a/APP_Framework/Framework/control/ipc_protocol/modbus_uart/modbus_uart.c b/APP_Framework/Framework/control/ipc_protocol/modbus_uart/modbus_uart.c index ef5f0351c..bd86ecf0c 100644 --- a/APP_Framework/Framework/control/ipc_protocol/modbus_uart/modbus_uart.c +++ b/APP_Framework/Framework/control/ipc_protocol/modbus_uart/modbus_uart.c @@ -107,16 +107,28 @@ static int ModbusUartTransformRecvBuffToData(ModbusUartReadItem *p_read_item, ui */ static int ModbusUartGetDataBySerial(ModbusUartReadItem *p_read_item) { - uint32_t read_length = 0; + uint32_t cmd_length, read_length = 0; memset(recv_buff, 0, sizeof(recv_buff)); ModbusUartDataInfo *p_modbus_uart_data_info = &(p_read_item->data_info); - BasicPlcDataInfo *p_base_data_info = &(p_modbus_uart_data_info->base_data_info); + BasicPlcDataInfo *p_base_data_info = &(p_modbus_uart_data_info->base_data_info); + ModbusUartFunctionCode function_code = p_modbus_uart_data_info->function_code; ControlPrintfList("SEND", p_base_data_info->p_command, p_base_data_info->command_length); SerialWrite(p_base_data_info->p_command, p_base_data_info->command_length); - read_length = SerialRead(recv_buff, sizeof(recv_buff)); + if (READ_COIL_STATUS == function_code || READ_INPUT_STATUS == function_code) { + cmd_length = 6; + } else if (READ_HOLDING_REGISTER == function_code || READ_INPUT_REGISTER == function_code) { + cmd_length = 7; + } else if (WRITE_SINGLE_COIL == function_code || WRITE_SINGLE_REGISTER == function_code) { + cmd_length = 8; + } else { + //MULTIPLE_COIL and MULTIPLE_REGISTER to do + cmd_length = 0; + } + + read_length = SerialRead(recv_buff, cmd_length); if (read_length) { ControlPrintfList("RECV", recv_buff, read_length); return ModbusUartTransformRecvBuffToData(p_read_item, recv_buff); diff --git a/APP_Framework/Framework/control/ipc_protocol/modbus_uart/test_recipe_modbus_uart.json b/APP_Framework/Framework/control/ipc_protocol/modbus_uart/test_recipe_modbus_uart.json index 613d010c6..1f5cf41de 100644 --- a/APP_Framework/Framework/control/ipc_protocol/modbus_uart/test_recipe_modbus_uart.json +++ b/APP_Framework/Framework/control/ipc_protocol/modbus_uart/test_recipe_modbus_uart.json @@ -24,7 +24,7 @@ "value_type": 9, "function_code": 3, "start_address": 208, - "quantity": 2 + "quantity": 1 } ] } \ No newline at end of file diff --git a/APP_Framework/Framework/control/shared/control_io.c b/APP_Framework/Framework/control/shared/control_io.c index 5fdf3119c..fbb01b7ec 100644 --- a/APP_Framework/Framework/control/shared/control_io.c +++ b/APP_Framework/Framework/control/shared/control_io.c @@ -162,7 +162,7 @@ void SerialWrite(uint8_t *write_data, int length) PrivWrite(uart_fd, write_data, length); - PrivTaskDelay(10); + PrivTaskDelay(15); Set485Input(); #endif } @@ -181,15 +181,11 @@ int SerialRead(uint8_t *read_data, int length) while (data_size < length) { data_recv_size = PrivRead(uart_fd, read_data + data_recv_size, length); - // for (int i = 0; i < data_recv_size; i ++) { - // printf("idx %d data 0x%x\n", i, recv_data[i + data_size]); - // } - data_size += data_recv_size; } - //need to wait 25ms , make sure write cmd again and receive data successfully - PrivTaskDelay(25); + //need to wait 30ms , make sure write cmd again and receive data successfully + PrivTaskDelay(30); return data_size; #endif diff --git a/Ubiquitous/XiZi_IIoT/resources/serial/dev_serial.c b/Ubiquitous/XiZi_IIoT/resources/serial/dev_serial.c index 43c94addd..428e1c935 100644 --- a/Ubiquitous/XiZi_IIoT/resources/serial/dev_serial.c +++ b/Ubiquitous/XiZi_IIoT/resources/serial/dev_serial.c @@ -154,6 +154,8 @@ static inline int SerialDevIntRead(struct SerialHardwareDevice *serial_dev, stru CriticalAreaUnLock(lock); + MdelayKTask(20); + *read_data = get_char; read_data++; read_length--;