From f8a6647b59eead16b6ef059cec9fb0a19ca89da0 Mon Sep 17 00:00:00 2001 From: JingweiCui Date: Thu, 9 Jan 2025 18:54:01 +0800 Subject: [PATCH] =?UTF-8?q?[update]=20=E4=BF=AE=E5=A4=8D=E4=BA=86br=5Fcom?= =?UTF-8?q?=5Fprocess=E4=B8=AD=E7=9A=84=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用了错误的buffer,导致无法正确处理接收到的消息数据。 --- br_com_service.c | 6 +++--- br_com_service.h | 2 +- br_modbus.c | 20 +++++++++----------- br_modbus_reg.c | 18 +++++++++++++----- 4 files changed, 26 insertions(+), 20 deletions(-) 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表示没有异常发生 */ }