[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"
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;

View File

@ -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 {

View File

@ -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; idx<size; idx++)
{
val = modbus_extract_0a_val(idx);
val = modbus_extract_10_val(idx);
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];
}
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) +
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 status = 1;
switch (rw_data->operation)
{
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; 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 status = -1;
uint8_t status = 1;
/* 在此实现数据写入逻辑 */
uint8_t 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++)
{
*((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表示没有异常发生 */
}