[update] 修复了br_com_process中的错误

使用了错误的buffer,导致无法正确处理接收到的消息数据。
This commit is contained in:
JingweiCui 2025-01-09 18:54:01 +08:00
parent ff5c5db787
commit f8a6647b59
4 changed files with 26 additions and 20 deletions

View File

@ -5,7 +5,7 @@
#include "br_modbus.h" #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) 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 else
{ {
/* 提取内容 */ /* 提取内容 */
memcpy(payload, pucRecvBuffer + 4, PAYLOAD_MAX_LEN); memcpy(RecvContent, pucRecvBuffer + 4, PAYLOAD_MAX_LEN-4);
if(modbus_process(pucRecvBuffer, recvDataLen, modbusResBuffer, &resDataLen) == MODBUS_STATUS_OK) if(modbus_process(RecvContent, recvDataLen, modbusResBuffer, &resDataLen) == MODBUS_STATUS_OK)
{ {
pucSendBuffer[0] = 0xFF; pucSendBuffer[0] = 0xFF;

View File

@ -1,7 +1,7 @@
#ifndef _BR_COM_SERVICE_H #ifndef _BR_COM_SERVICE_H
#define _BR_COM_SERVICE_H #define _BR_COM_SERVICE_H
#define PAYLOAD_MAX_LEN (256u) #define PAYLOAD_MAX_LEN (1024u)
typedef enum { typedef enum {

View File

@ -18,7 +18,7 @@ uint8_t modbus_FrameCnt;
// Private function prototype. // Private function prototype.
void modbus_03_solver(uint8_t slaveId, uint8_t * resBuffer, uint8_t * resLen); 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_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_crc(uint8_t mFunCode);
uint16_t modbus_extract_06_val(void); 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); void modbus_FrameClearBuff(void);
@ -41,7 +41,7 @@ uint8_t modbus_extract_slaveid(void);
uint8_t modbus_extract_funcode(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); 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); modbus_06_solver(slaveId, buffer_resp, resp_len);
break; break;
case 0x10: case 0x10:
modbus_0A_solver(slaveId, buffer_resp, resp_len); modbus_10_solver(slaveId, buffer_resp, resp_len);
} }
return MODBUS_STATUS_OK; 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; uint16_t address, byte_num, val, crcCal, crcRecv, size;
uint8_t idx = 0; uint8_t idx = 0;
ModbusRegRwData_t rw_data = {0}; ModbusRegRwData_t rw_data = {0};
address = modbus_extract_startAddr(); address = modbus_extract_startAddr();
byte_num = modbus_extract_0a_bytenum(); byte_num = modbus_extract_10_bytenum();
size = modbus_extract_size(); size = modbus_extract_size();
crcCal = modbus_crc16_v3(BrMdBufferCmd, 7 + byte_num); 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.operation = RW_OPERATION_WRITE;
rw_data.startAddr = address; rw_data.startAddr = address;
rw_data.registers[0] = val;
for(idx=0; idx<size; idx++) for(idx=0; idx<size; idx++)
{ {
val = modbus_extract_0a_val(idx); val = modbus_extract_10_val(idx);
rw_data.registers[idx] = val; rw_data.registers[idx] = val;
} }
@ -316,13 +314,13 @@ void modbus_0A_solver(uint8_t slaveId, uint8_t * resBuffer, uint8_t * resLen)
} }
uint16_t modbus_extract_0a_bytenum(void) uint16_t modbus_extract_10_bytenum(void)
{ {
return BrMdBufferCmd[6]; return BrMdBufferCmd[6];
} }
uint16_t modbus_extract_0a_val(uint8_t idx) uint16_t modbus_extract_10_val(uint8_t idx)
{ {
return ((uint16_t)BrMdBufferCmd[7 + idx*2]<<8) + return ((uint16_t)BrMdBufferCmd[7 + idx*2]<<8) +
BrMdBufferCmd[8 + idx*2]; BrMdBufferCmd[8 + idx*2];

View File

@ -25,23 +25,31 @@ uint8_t modbus_reg_blockdata_get(ModbusRegDataBlock_t *datablock, uint16_t start
uint8_t modbus_reg_proxy(ModbusRegRwData_t * rw_data) uint8_t modbus_reg_proxy(ModbusRegRwData_t * rw_data)
{ {
uint8_t status = 1;
switch (rw_data->operation) switch (rw_data->operation)
{ {
case RW_OPERATION_READ: case RW_OPERATION_READ:
/* code */ /* 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; break;
case RW_OPERATION_WRITE: 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; break;
default: default:
break; break;
} }
return status;
} }
uint8_t modbus_reg_write_process(uint8_t slaveId, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer) 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; uint8_t blockIndex;
for(blockIndex=0; blockIndex<MODBUS_REG_BLOCK_NUM; blockIndex++) for(blockIndex=0; blockIndex<MODBUS_REG_BLOCK_NUM; blockIndex++)
@ -58,7 +66,7 @@ uint8_t modbus_reg_write_process(uint8_t slaveId, uint16_t startAddr, uint8_t nu
uint8_t modbus_reg_read_process(uint8_t slaveId, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer) uint8_t modbus_reg_read_process(uint8_t slaveId, uint16_t startAddr, uint8_t num, uint16_t * dataBuffer)
{ {
/* 在此实现数据读取逻辑 */ /* 在此实现数据读取逻辑 */
uint8_t status = -1; uint8_t status = 1;
/* 在此实现数据写入逻辑 */ /* 在此实现数据写入逻辑 */
uint8_t blockIndex; uint8_t blockIndex;
for(blockIndex=0; blockIndex<MODBUS_REG_BLOCK_NUM; blockIndex++) for(blockIndex=0; blockIndex<MODBUS_REG_BLOCK_NUM; blockIndex++)
@ -106,7 +114,7 @@ uint8_t modbus_reg_blockdata_set(ModbusRegDataBlock_t *datablock, uint16_t start
{ {
for(i=0; i<num; i++) for(i=0; i<num; i++)
{ {
*((uint16_t*) ( (uint32_t)datablock->address + (startAddr + i)*2 ) ) = *(dataBuffer + i); *((uint16_t*)(void *) ( (uint32_t)datablock->address + (startAddr + i)*2 ) ) = *(dataBuffer + i);
} }
status = 0; /* return 0表示没有异常发生 */ status = 0; /* return 0表示没有异常发生 */
} }