fix bugs
This commit is contained in:
parent
9fbe044705
commit
2b0a184d40
88
protocol.c
88
protocol.c
@ -1,7 +1,16 @@
|
|||||||
#include "protocol.h"
|
#include "protocol.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
static DeviceStatus deviceStatus = {0};
|
static DeviceStatus deviceStatus = {
|
||||||
|
.deviceStatus = 1,
|
||||||
|
.valves = {210, 120},
|
||||||
|
.pumps = {0, 0, 50, 50},
|
||||||
|
.bubbleStatus = 0,
|
||||||
|
.stopStatus = 0,
|
||||||
|
.errorCode = 0,
|
||||||
|
.initStatus = 1
|
||||||
|
};
|
||||||
|
|
||||||
DeviceDefaultParam dp = {{
|
DeviceDefaultParam dp = {{
|
||||||
{"pump1", 1, 100, 100, 100},
|
{"pump1", 1, 100, 100, 100},
|
||||||
{"pump2", 2, 100, 100, 100},
|
{"pump2", 2, 100, 100, 100},
|
||||||
@ -112,7 +121,7 @@ void updateInitStatus(InitStatus_t status) {
|
|||||||
|
|
||||||
|
|
||||||
//modBUS RTU 写命令
|
//modBUS RTU 写命令
|
||||||
void writeCMD(uint8_t *txBuf, uint16_t *txLen) {
|
void writeCMD(uint8_t *txBuf, uint16_t txLen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t SendToHost(uint8_t *txBuf, uint16_t txLen) {
|
uint8_t SendToHost(uint8_t *txBuf, uint16_t txLen) {
|
||||||
@ -706,15 +715,68 @@ static uint8_t HandleSoftStop(uint8_t *rxBuf, uint16_t rxLen) {
|
|||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
void ProcessMotorMsg(uint8_t *rxBuf, uint16_t rxLen) {
|
||||||
|
// 实现电机消息处理逻辑
|
||||||
|
log_d("ProcessMotorMsg");
|
||||||
|
}
|
||||||
|
void sendMsgToHost(uint8_t *txBuf, uint16_t txLen) {
|
||||||
|
// 发送数据
|
||||||
|
HAL_UART_Transmit_DMA(&huart2, txBuf, txLen);
|
||||||
|
}
|
||||||
|
void packMsgToHost(uint16_t funcCode, uint8_t isOK) {
|
||||||
|
// 实现打包消息到上位机逻辑
|
||||||
|
// 帧头+功能码(2Byte)+数据长度(1Byte)+ 具体数据(NByte)+CRC16校验位+帧尾
|
||||||
|
uint8_t msgBuf[64];//最大为4+2+1+15+2+4=28
|
||||||
|
uint8_t len = 0;
|
||||||
|
uint8_t dlen = 0;
|
||||||
|
uint8_t index = 0;
|
||||||
|
FillBigEndian32(msgBuf+4, FRAME_HEADER);
|
||||||
|
FillBigEndian16(msgBuf+sizeof(FRAME_HEADER), funcCode);
|
||||||
|
|
||||||
|
if(funcCode == HOST_CMD_STATUS_QUERY) {
|
||||||
|
dlen = sizeof(DeviceStatus);
|
||||||
|
index = sizeof(FRAME_HEADER)+2;
|
||||||
|
msgBuf[index] = dlen;
|
||||||
|
index += 1;
|
||||||
|
memcpy(msgBuf+index, &deviceStatus, dlen);
|
||||||
|
index += dlen;
|
||||||
|
uint16_t crc = CalculateCRC16(msgBuf+4, index-4);//不包含帧头
|
||||||
|
FillBigEndian16(msgBuf+index, crc);
|
||||||
|
index += 2;
|
||||||
|
FillBigEndian32(msgBuf+index, FRAME_TAIL);
|
||||||
|
len = index+4;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dlen = 1;
|
||||||
|
index = sizeof(FRAME_HEADER)+2;
|
||||||
|
msgBuf[index] = dlen;
|
||||||
|
index += 1;
|
||||||
|
msgBuf[index] = isOK;
|
||||||
|
index += 1;
|
||||||
|
uint16_t crc = CalculateCRC16(msgBuf+4, index-4);//不包含帧头
|
||||||
|
FillBigEndian16(msgBuf+index, crc);
|
||||||
|
index += 2;
|
||||||
|
FillBigEndian32(msgBuf+index, FRAME_TAIL);
|
||||||
|
len = index+4;
|
||||||
|
}
|
||||||
|
// 发送数据
|
||||||
|
sendMsgToHost(msgBuf, len);
|
||||||
|
}
|
||||||
|
|
||||||
CmdFrameError_t checkHostCmd(uint8_t *rxBuf, uint16_t rxLen) {
|
CmdFrameError_t checkHostCmd(uint8_t *rxBuf, uint16_t rxLen) {
|
||||||
// 检查命令是否正确
|
// 检查命令是否正确
|
||||||
if (memcmp(rxBuf, FRAME_HEADER, 4) != 0)
|
// FRAME_HEADER是按小端序存储的,而rxBuf是按大端序存储的
|
||||||
|
uint32_t header;
|
||||||
|
FillBigEndian32(&header, FRAME_HEADER);
|
||||||
|
uint32_t tail;
|
||||||
|
FillBigEndian32(&tail, FRAME_TAIL);
|
||||||
|
|
||||||
|
if(memcmp(rxBuf, &header, 4) != 0)
|
||||||
{
|
{
|
||||||
return CMD_FRAME_HEADER_ERROR;
|
return CMD_FRAME_HEADER_ERROR;
|
||||||
}
|
}
|
||||||
if (memcmp(rxBuf + rxLen - 4, FRAME_TAIL, 4) != 0)
|
|
||||||
|
if (memcmp(rxBuf + rxLen - 4, &tail, 4) != 0)
|
||||||
{
|
{
|
||||||
return CMD_FRAME_TAIL_ERROR;
|
return CMD_FRAME_TAIL_ERROR;
|
||||||
}
|
}
|
||||||
@ -743,25 +805,25 @@ CmdFrameError_t ProcessHostCommand(uint8_t *rxBuf, uint16_t rxLen) {
|
|||||||
uint8_t *data = &rxBuf[sizeof(FRAME_HEADER)+3];//提取数据
|
uint8_t *data = &rxBuf[sizeof(FRAME_HEADER)+3];//提取数据
|
||||||
|
|
||||||
switch(cmdCode) {
|
switch(cmdCode) {
|
||||||
case CMD_STATUS_QUERY:
|
case HOST_CMD_STATUS_QUERY:
|
||||||
error = HandleStatusQuery();
|
error = HandleStatusQuery();
|
||||||
break;
|
break;
|
||||||
case CMD_VALVE_CTRL:
|
case HOST_CMD_VALVE_CTRL:
|
||||||
error = HandleValveControl(data, dataLen);
|
error = HandleValveControl(data, dataLen);
|
||||||
break;
|
break;
|
||||||
case CMD_PUMP_RUN_TIME:
|
case HOST_CMD_PUMP_RUN_TIME:
|
||||||
error = HandlePumpTimeControl(data, dataLen);
|
error = HandlePumpTimeControl(data, dataLen);
|
||||||
break;
|
break;
|
||||||
case CMD_PUMP_RUN_SPEED:
|
case HOST_CMD_PUMP_RUN_SPEED:
|
||||||
error = HandlePumpSpeedControl(data, dataLen);
|
error = HandlePumpSpeedControl(data, dataLen);
|
||||||
break;
|
break;
|
||||||
case CMD_SOFT_STOP:
|
case HOST_CMD_SOFT_STOP:
|
||||||
error = HandleSoftStop(data, dataLen);
|
error = HandleSoftStop(data, dataLen);
|
||||||
break;
|
break;
|
||||||
case CMD_PUMP_RUN_STEP:
|
case HOST_CMD_PUMP_RUN_STEP:
|
||||||
error = HandlePumpStep(data, dataLen);
|
error = HandlePumpStepControl(data, dataLen);
|
||||||
break;
|
break;
|
||||||
case CMD_SYSTEM_INIT:
|
case HOST_CMD_SYSTEM_INIT:
|
||||||
error = HandleInit();
|
error = HandleInit();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
35
protocol.h
35
protocol.h
@ -1,6 +1,8 @@
|
|||||||
#ifndef PROTOCOL_H
|
#ifndef PROTOCOL_H
|
||||||
#define PROTOCOL_H
|
#define PROTOCOL_H
|
||||||
|
|
||||||
|
#include "main.h"
|
||||||
|
#include "usart.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#define LOG_TAG "motor"
|
#define LOG_TAG "motor"
|
||||||
#include <elog.h>
|
#include <elog.h>
|
||||||
@ -10,13 +12,13 @@
|
|||||||
#define FRAME_TAIL 0x5AA5A55A
|
#define FRAME_TAIL 0x5AA5A55A
|
||||||
|
|
||||||
// 功能码定义
|
// 功能码定义
|
||||||
#define CMD_STATUS_QUERY 0x0001 // 状态查询
|
#define HOST_CMD_STATUS_QUERY 0x0001 // 状态查询
|
||||||
#define CMD_VALVE_CTRL 0x0002 // 三通阀控制
|
#define HOST_CMD_VALVE_CTRL 0x0002 // 三通阀控制
|
||||||
#define CMD_PUMP_RUN_TIME 0x0003 // 泵运行时长控制
|
#define HOST_CMD_PUMP_RUN_TIME 0x0003 // 泵运行时长控制
|
||||||
#define CMD_PUMP_RUN_SPEED 0x0004 // 泵运行速度设置
|
#define HOST_CMD_PUMP_RUN_SPEED 0x0004 // 泵运行速度设置
|
||||||
#define CMD_SOFT_STOP 0x0005 // 软急停功能
|
#define HOST_CMD_SOFT_STOP 0x0005 // 软急停功能
|
||||||
#define CMD_PUMP_RUN_STEP 0x0006 // 泵步进设置
|
#define HOST_CMD_PUMP_RUN_STEP 0x0006 // 泵步进设置
|
||||||
#define CMD_SYSTEM_INIT 0x0007 // 系统初始化
|
#define HOST_CMD_SYSTEM_INIT 0x0007 // 系统初始化
|
||||||
#define CMD_BR_SET 0x0008 // 波特率设置
|
#define CMD_BR_SET 0x0008 // 波特率设置
|
||||||
#define CMD_PR_SET 0x0009 // 通信协议设置
|
#define CMD_PR_SET 0x0009 // 通信协议设置
|
||||||
// 命令帧错误码定义
|
// 命令帧错误码定义
|
||||||
@ -379,24 +381,8 @@ typedef struct {
|
|||||||
} DeviceStatus;
|
} DeviceStatus;
|
||||||
|
|
||||||
|
|
||||||
static uint8_t pumpName[2][10] = {
|
|
||||||
"Pump1",
|
|
||||||
"Pump2"
|
|
||||||
};
|
|
||||||
|
|
||||||
// 定义协议消息结构
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t device_id;
|
uint8_t name[20];
|
||||||
uint8_t func;
|
|
||||||
uint8_t reg_addr[2];
|
|
||||||
uint8_t reg_cnt[2];
|
|
||||||
uint8_t data_cnt;
|
|
||||||
uint8_t data[];//柔性数组,大小由data_cnt决定
|
|
||||||
// uint8_t crc[2];
|
|
||||||
} RTU_Frame;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t name[10];
|
|
||||||
uint8_t id;
|
uint8_t id;
|
||||||
uint32_t maxSpeed;
|
uint32_t maxSpeed;
|
||||||
uint32_t maxAccel;
|
uint32_t maxAccel;
|
||||||
@ -420,4 +406,5 @@ void InitDeviceStatus();
|
|||||||
void DecodePumpAlarmMsg(uint16_t reg4001);
|
void DecodePumpAlarmMsg(uint16_t reg4001);
|
||||||
void DecodePumpStatusMsg(uint16_t reg4002);
|
void DecodePumpStatusMsg(uint16_t reg4002);
|
||||||
void UpdatePumpStatus();
|
void UpdatePumpStatus();
|
||||||
|
void ProcessMotorMsg(uint8_t *rxBuf, uint16_t rxLen);
|
||||||
#endif // PROTOCOL_H
|
#endif // PROTOCOL_H
|
Loading…
Reference in New Issue
Block a user