📄 command_deal.c
字号:
#include "CGJ.H" // 包含项目头文件
#include "i2c.h" // 包含I2C头文件
#include "control.h"
#define COMMAND_TYPE_NUMBER 36
#define HAVE_NUMBER_LENGTH 9
#define NO_NUMBER_LENGTH 3
#define COMMAND_LENGTH 30 // 命令长度
const char *message[] = {
"@ Command wrong!\r", // 00
"@ Command sub wrong!\r", // 01
"@ Command check sum wrong!\r", // 02
"@ Command set value wrong!\r", // 03
"@ Command success!\r", // 04
"@ Enter dema status!\r", // 05
"@ Exit dema status!\r", // 06
"@ Dema insert success!\r", // 07
"@ Clear zero complete!\r", // 08
"@ Speed is too fast for lift action!\r", // 09
"@ Lift is up!\r", // 0A
"@ Lift is down!\r", // 0B
"@ Read EEPROM complete!\r", // 0C
"@ Write EEPROM complete!\r", // 0D
"@ Enter speed control!\r", // 0E
"@ Exit speed control!\r", // 0F
"@ Speed set success!\r", // 10
"@ Speed beyond MAX!\r", // 11
"@ Speed set value is too small!\r", // 12
"@ Enter force control!\r", // 13
"@ Exit force control!\r", // 14
"@ Force set success!\r", // 15
"@ Force beyond MAX!\r", // 16
"@ Force set value is too small!\r", // 17
"@ Enter power control!\r", // 18
"@ Exit power control!\r", // 19
"@ Power set success!\r", // 1A
"@ Power beyond MAX!\r", // 1B
"@ Power set value is too small!\r", // 1C
"@ Enter road simulate!\r", // 1D
"@ Exit road simulate!\r", // 1E
"@ Simulate set success!\r", // 1F
"@ Device NO dema!\r", // 20
"@ Device had dema!\r", // 21
"@ Start motor!\r", // 22
"@ Stop motor!\r", // 23
"@ Enter test table waste!\r", // 24
"@ Enter control IGBT!\r", // 25
"@ Exit control IGBT!\r", // 26
"@ IGBT set sucess!\r", // 27
"@ Clear distance success!\r" // 28
};
extern void VICInit(void); // 声明VIC初始化外部函数
/*********************************************************************************
* 函数名称: deal_command()
* 功能: 对命令字符进行处理,分解
* 入口参数: *command_char
* 出口参数: 处理状态
* 调用模块: OSFlagPost() 向任务发事件标志组
*
* 全局变量: set_control_value
* 设计者: 饶阳胜,周川福
* 日期: 05-6-14, 06-09-24
* 说明:
*********************************************************************************/
enum key{SET_SPEED, SET_FORCE, SET_POWER, // 命令枚举
SPEED_CONTROL, FORCE_CONTROL, POWER_CONTROL,
EXIT_CONTROL,
LIFT_RISE, LIFT_FALL,
IN_DEMA, OUT_DEMA,
FORCE_0, FORCE_1, FORCE_2, FORCE_3, FORCE_4,
FORCE_5, FORCE_6, FORCE_7, FORCE_8, FORCE_9,
CLEAR_FORCE,
MOTOR_OPEN, MOTOR_CLOSE, SPEED_DEMA,
OPEN_CONTROL_SI, CLOSE_CONTROL_SI, CONTROL_SI_DATA,
ENTER_WASTE,
DISTANCE_CLEAR,
START_SIMUL, STOP_SIMUL, SET_SIMUL,
SET_PID, SET_WASTE, GET_PID
};
INT8U DealCommand(char *command_char)
{
INT8U c, i, err; // 临时变量
char *copy; // 指向命令的指针
char tmp[30];
INT32U value; // 为方方便处理而设定的参数
BOOLEAN fit;
OS_FLAGS flag;
const char *command_sum[COMMAND_TYPE_NUMBER] = {
"*CS", // 0 SET_SPEED_VALUE
"*CF", // 1 SET_FORCE_VALUE
"*CP", // 2 SET_POWER_VALUE
"*SA", // 3 START_CONTROL_SPEED
"*SB", // 4 START_CONTROL_FORCE
"*SC", // 5 START_CONTROL_POWER
"*SS", // 6 STOP_CONTROL
"*LU", // 7 LIFT_UP
"*LD", // 8 LIFT_DOWN
"*DA", // 9 ETNER_DEMA
"*DS", // 10 EXIT_DEMA
"*Y0","*Y1","*Y2","*Y3","*Y4",
"*Y5","*Y6","*Y7","*Y8","*Y9", // 11-20 FORCE_DEMA
"*YC", // 21 FORCE_CLEAR
"*MO", // 22 open motor
"*MF", // 23 close motor
"*I", // 24 speed dema
"*PT", // 25 开始控制IGBT输出
"*PS", // 26 停止控制IGBT输出
"*PV", // 27 IGBT输出的数据
"*WE", // 28 进入检测损耗
"*DC", // 29 行驶距离清零
"*RT", // 30 开始道路模拟控制
"*RS", // 31 停止道路模拟
"*RV", // 32 道路模拟设置基准质量
"*CC", // 33 设置PID控制参数
"*CH", // 34 设置损耗参数a,b,c
"*DP" // 35 获取PID控制参数
};
fit = FALSE;
for(i = 0; i < COMMAND_TYPE_NUMBER; i++){
// 进行命令品配查找,如果是非法命令则退出
if ( strncmp(command_char, command_sum[i], strlen(command_sum[i])) == 0 ) {
fit = TRUE;
}
if(fit == TRUE) break; // 如果已找到相符的字符串,返回
}
if(fit == FALSE)
return COMMAND_WRONG;
// 校验和计算
c = 0; // 校验和清0
copy = command_char; // 得到指向接收字符的指针
while(*copy != '\r') // 命令校验和的计算
c += *copy++;
c -= *--copy;
if(c != *copy)
return (COMMAND_CHECK_SUM_WRONG); // 命令校验和错误,返回相应出错信息
value = 0; // 设定值清0
switch(i) {
case SET_SPEED:
flag = SET_SPEED_VALUE; // 设定速度指令
cpystr(command_char, tmp, 3, 6);
sscanf(tmp, "%f", &set_control_value);
break;
case SET_FORCE:
flag = SET_FORCE_VALUE; // 设定力指令
cpystr(command_char, tmp, 3, 5);
sscanf(tmp, "%f", &set_control_value);
break;
case SET_POWER:
flag = SET_POWER_VALUE; // 设定功率指令
cpystr(command_char, tmp, 3, 6);
sscanf(tmp, "%f", &set_control_value);
break;
case SPEED_CONTROL:
flag = START_CONTROL_SPEED; // 开始控制速度指令,不带参数
break;
case FORCE_CONTROL:
flag = START_CONTROL_FORCE; // 开始控制力指令,不带参数
break;
case POWER_CONTROL:
flag = START_CONTROL_POWER; // 开始控制功率指令,不带参数
break;
case EXIT_CONTROL:
flag = STOP_CONTROL; // 停止控制指令,不带参数
break;
case LIFT_RISE:
flag = LIFT_UP; // 举升上升指令,不带参数
break;
case LIFT_FALL:
flag = LIFT_DOWN; // 举升下降指令,不带参数
break;
case IN_DEMA:
flag = ENTER_DEMA; // 进入标定指令,不带参数
break;
case OUT_DEMA:
flag = EXIT_DEMA; // 退出标定指令,不带参数
break;
case FORCE_0: case FORCE_1: case FORCE_2: case FORCE_3: case FORCE_4: // 力标定指令,带参数
case FORCE_5: case FORCE_6: case FORCE_7: case FORCE_8: case FORCE_9:
flag = FORCE_DEMA;
//存储标定点的数值
force_dema_point = command_char[DEMA_POINT_LOCAL] - '0';
if( force_dema_point > 9) force_dema_point = 0;
//标定的数据
cpystr(command_char, tmp, 3, 5);
sscanf(tmp, "%f", &set_control_value);
break;
case CLEAR_FORCE:
flag = FORCE_CLEAR; // 力清0指令,带参数
break;
case MOTOR_OPEN: // 反托电机启动
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -