diff --git a/br_com_service.c b/br_com_service.c index 2dd6a00..0b608f0 100644 --- a/br_com_service.c +++ b/br_com_service.c @@ -5,7 +5,7 @@ #include "br_modbus.h" -uint8_t payload[PAYLOAD_MAX_LEN] = {0}; +uint8_t RecvContent[PAYLOAD_MAX_LEN] = {0}; BrComStatus_t br_com_process(uint8_t * pucRecvBuffer, uint16_t usRecvBufferLen, uint8_t * pucSendBuffer, uint16_t * pusSendBufferLen) @@ -38,8 +38,8 @@ BrComStatus_t br_com_process(uint8_t * pucRecvBuffer, uint16_t usRecvBufferLen, else { /* 提取内容 */ - memcpy(payload, pucRecvBuffer + 4, PAYLOAD_MAX_LEN); - if(modbus_process(pucRecvBuffer, recvDataLen, modbusResBuffer, &resDataLen) == MODBUS_STATUS_OK) + memcpy(RecvContent, pucRecvBuffer + 4, PAYLOAD_MAX_LEN-4); + if(modbus_process(RecvContent, recvDataLen, modbusResBuffer, &resDataLen) == MODBUS_STATUS_OK) { pucSendBuffer[0] = 0xFF; diff --git a/br_com_service.h b/br_com_service.h index 217b8b3..671e0ed 100644 --- a/br_com_service.h +++ b/br_com_service.h @@ -1,7 +1,7 @@ #ifndef _BR_COM_SERVICE_H #define _BR_COM_SERVICE_H -#define PAYLOAD_MAX_LEN (256u) +#define PAYLOAD_MAX_LEN (1024u) typedef enum { diff --git a/br_modbus.c b/br_modbus.c index cfd194f..b131331 100644 --- a/br_modbus.c +++ b/br_modbus.c @@ -18,7 +18,7 @@ uint8_t modbus_FrameCnt; // Private function prototype. void modbus_03_solver(uint8_t slaveId, uint8_t * resBuffer, uint8_t * resLen); void modbus_06_solver(uint8_t slaveId, uint8_t * resBuffer, uint8_t * resLen); -void modbus_0A_solver(uint8_t slaveId, uint8_t * resBuffer, uint8_t * resLen); +void modbus_10_solver(uint8_t slaveId, uint8_t * resBuffer, uint8_t * resLen); @@ -30,7 +30,7 @@ uint8_t modbus_extract_size(void); uint16_t modbus_extract_crc(uint8_t mFunCode); uint16_t modbus_extract_06_val(void); -uint16_t modbus_extract_0a_val(uint8_t idx); +uint16_t modbus_extract_10_val(uint8_t idx); void modbus_FrameClearBuff(void); @@ -41,7 +41,7 @@ uint8_t modbus_extract_slaveid(void); uint8_t modbus_extract_funcode(void); /* --------------------------------------------------------------- */ -uint16_t modbus_extract_0a_bytenum(void); +uint16_t modbus_extract_10_bytenum(void); uint16_t modbus_Retrieve16Value(uint8_t index); @@ -119,7 +119,7 @@ ModbusStatus_t modbus_process(const uint8_t * buffer_cmd, uint8_t recv_len, uint modbus_06_solver(slaveId, buffer_resp, resp_len); break; case 0x10: - modbus_0A_solver(slaveId, buffer_resp, resp_len); + modbus_10_solver(slaveId, buffer_resp, resp_len); } return MODBUS_STATUS_OK; } @@ -261,14 +261,14 @@ void modbus_06_solver(uint8_t slaveId, uint8_t * resBuffer, uint8_t * resLen) } -void modbus_0A_solver(uint8_t slaveId, uint8_t * resBuffer, uint8_t * resLen) +void modbus_10_solver(uint8_t slaveId, uint8_t * resBuffer, uint8_t * resLen) { uint16_t address, byte_num, val, crcCal, crcRecv, size; uint8_t idx = 0; ModbusRegRwData_t rw_data = {0}; address = modbus_extract_startAddr(); - byte_num = modbus_extract_0a_bytenum(); + byte_num = modbus_extract_10_bytenum(); size = modbus_extract_size(); crcCal = modbus_crc16_v3(BrMdBufferCmd, 7 + byte_num); @@ -281,11 +281,9 @@ void modbus_0A_solver(uint8_t slaveId, uint8_t * resBuffer, uint8_t * resLen) rw_data.operation = RW_OPERATION_WRITE; rw_data.startAddr = address; - rw_data.registers[0] = val; - for(idx=0; idxoperation) { case RW_OPERATION_READ: /* code */ - modbus_reg_read_process(rw_data->slaveId, rw_data->startAddr, rw_data->num, rw_data->registers); + if(modbus_reg_read_process(rw_data->slaveId, rw_data->startAddr, rw_data->num, rw_data->registers)==0) + { + status = 0; + } break; case RW_OPERATION_WRITE: - modbus_reg_write_process(rw_data->slaveId, rw_data->startAddr, rw_data->num, rw_data->registers); + if(modbus_reg_write_process(rw_data->slaveId, rw_data->startAddr, rw_data->num, rw_data->registers) == 0) + { + status = 0; + } break; default: break; } + return status; } uint8_t modbus_reg_write_process(uint8_t slaveId, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer) { - uint8_t status = -1; + uint8_t status = 1; /* 在此实现数据写入逻辑 */ uint8_t blockIndex; for(blockIndex=0; blockIndexaddress + (startAddr + i)*2 ) ) = *(dataBuffer + i); + *((uint16_t*)(void *) ( (uint32_t)datablock->address + (startAddr + i)*2 ) ) = *(dataBuffer + i); } status = 0; /* return 0表示没有异常发生 */ }