[update] 修复了br_com_process中的错误
使用了错误的buffer,导致无法正确处理接收到的消息数据。
This commit is contained in:
parent
ff5c5db787
commit
f8a6647b59
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
20
br_modbus.c
20
br_modbus.c
@ -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];
|
||||||
|
@ -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表示没有异常发生 */
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user