⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 command_deal.c

📁 汽车测功机源肛码.单片机用的是LPC2104. 实现测速,对涡流机的控制,马达的控制.
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -