brisonus_qc_dsp_com/br_com_service.c
JingweiCui ff5c5db787 [Add] Modbus通信库+参数定义
通过直接修改结构体参数的地址去修改具体的变量,结构体把所有定义的参数作为一个整体管理;ModbusRTU目前支持03,06和0A功能码。
2025-01-09 18:05:09 +08:00

59 lines
1.3 KiB
C

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "br_com_service.h"
#include "br_modbus.h"
uint8_t payload[PAYLOAD_MAX_LEN] = {0};
BrComStatus_t br_com_process(uint8_t * pucRecvBuffer, uint16_t usRecvBufferLen, uint8_t * pucSendBuffer, uint16_t * pusSendBufferLen)
{
BrComStatus_t status = BRCOMSTATUS_ERR;
uint8_t header[2] = {0};
uint16_t dataLen = 0;
uint8_t recvDataLen, resDataLen = 0;
uint8_t modbusResBuffer[256] = {0};
/* 提取HEADER */
header[0] = pucRecvBuffer[0];
header[1] = pucRecvBuffer[1];
if( header[0] != 0xAA && header[1] != 0xAA)
{
status = BRCOMSTATUS_HEADR_ERR;
return status;
}
dataLen = ((uint16_t)pucRecvBuffer[2] << 8) + pucRecvBuffer[3];
recvDataLen = dataLen & 0x00FF;
/* 提取长度 */
if( dataLen > 255 )
{
status = BRCOMSTATUS_LEN_ERR;
return status;
}
else
{
/* 提取内容 */
memcpy(payload, pucRecvBuffer + 4, PAYLOAD_MAX_LEN);
if(modbus_process(pucRecvBuffer, recvDataLen, modbusResBuffer, &resDataLen) == MODBUS_STATUS_OK)
{
pucSendBuffer[0] = 0xFF;
pucSendBuffer[1] = 0xFF;
pucSendBuffer[3] = 0x00;
pucSendBuffer[4] = resDataLen;
memcpy(pucSendBuffer + 4, modbusResBuffer, resDataLen);
/* modbus协议处理 */
status = BRCOMSTATUS_OK;
return status;
}
}
return status;
}