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

📄 command_deal.c

📁 汽车测功机源肛码.单片机用的是LPC2104. 实现测速,对涡流机的控制,马达的控制.
💻 C
📖 第 1 页 / 共 2 页
字号:
            flag = OPEN_MOTOR;
            break;
        case MOTOR_CLOSE:                                       // 反托电机关闭
            flag = CLOSE_MOTOR;
            break;
        case SPEED_DEMA:                                        // 速度标定
            flag = DEMA_SPEED;

            // 滚筒直径
            cpystr(command_char, tmp, 2, 5);
            sscanf(tmp, "%d", &value);
            gtzj_mm = value;

            // 每米脉冲数
            cpystr(command_char, tmp, 7, 5);
            sscanf(tmp, "%d", &value);
            mcmcs   = value;

            break;
        case OPEN_CONTROL_SI:                                   // 开始IGBT输出
            flag = START_CONTROL_SI;
            break;
        case CLOSE_CONTROL_SI:                                  //  停止IGBT输出
            flag = STOP_CONTROL_SI;

            break;
        case CONTROL_SI_DATA:                                   // IGBT输出值
            flag = SI_VALUE;
            
            cpystr(command_char, tmp, 3, 6);
            sscanf(tmp, "%d", &value);

            igbt_value = value;

            break;
        case ENTER_WASTE:                                       // 进入损耗测量模式
            flag = TEST_WASTE;
            break;
        case DISTANCE_CLEAR:
            flag = CLEAR_DISTANCE;                              // 行驶距离清零
            break;
        case START_SIMUL:
            flag = START_SIMULATE;
            break;
        case STOP_SIMUL:
            flag = STOP_SIMULATE;
            break;
        case SET_SIMUL:
            flag = SET_SIMULATE;

            cpystr(command_char, tmp, 3, 5);
            sscanf(tmp, "%d", &value);

            set_control_value = value;
            
            break;
        case SET_PID:
            flag = SET_PID_VALUE;
            
            // Kp
            cpystr(command_char, tmp, 3, 4);
            sscanf(tmp, "%d", &value);
            G_Kp = (float)value / 1000;

            // Ki
            cpystr(command_char, tmp, 7, 4);
            sscanf(tmp, "%d", &value);
            G_Ki = (float)value / 1000;

            // Kd
            cpystr(command_char, tmp, 11, 4);
            sscanf(tmp, "%d", &value);
            G_Kd = (float)value / 100;

            // Kc
            cpystr(command_char, tmp, 15, 4);
            sscanf(tmp, "%d", &value);
            G_Kc = (float)value / 1000;


            SendProgramRunStatus(WritePidParam());

            break;
        case SET_WASTE:
            flag = SET_WASTE_VALUE;

            break;
        case GET_PID:               
            flag = GET_PID_VALUE;
            
            sprintf(tmp, "*C%04d%04d%04d%04d", (INT32U)(G_Kp * 1000), 
                    (INT32U)(G_Ki * 1000), (INT32U)(G_Kd * 100), (INT32U)(G_Kc * 1000));

            copy = tmp;

            OSMutexPend(uart0,0,&err);                          // 此任务要使用串口,为防止其它任务也使用串口,调用互斥型信号量

            while((c = *copy++) != '\0') {
                CommPutChar(COMM1, c, 0);                       // 将数据写入发送缓冲区
            }


            value = strlen(tmp);
            c = 0;

            for(i=0; i<value; i++) {
                c += tmp[i];
            }

            CommPutChar(COMM1, c, 0);
            CommPutChar(COMM1, '\r', 0);


            OSMutexPost(uart0);                                 // 发出互斥型信号量

            CommTxImmdt(COMM1);                                 // 开始发送
            

            break;
        default:
            break;
    }

    
    //行驶距离清零
    if(flag == CLEAR_DISTANCE) {

        G_PulseCount = 0;
        return CLEAR_DISTANCE_SUCCESS;
    }
        
    OSFlagPost(task_status, flag, OS_FLAG_SET, &err);              // 向任务发出事件标志组标志
        
    return COMMAND_SUCCESS;
    
}

/********************************************************************************
* 函数名称: RecieveCommandTask()
* 功能:     接收命令任务
* 入口参数: 
* 出口参数: 
* 调用模块: ComGetChar()    从接收缓冲区取一个字节数据函数
*           deal_command()  当收到一个完整的命令后,对命令进行处理函数
* 全局变量: 无
* 设计者:   饶阳胜
* 日期:     05-6-11
*********************************************************************************/
void RecieveCommandTask(void *pdata)
{
    char    command_content[COMMAND_LENGTH];                    // 定义存放接收到字符的数组     
    INT8U   err, c, i;                                          // 定义临时变量
    BOOLEAN head;                                               // 定义命令头标志布尔变量

/* VIC控制器初始化 */

    VICInit();                                                  // 在这里开中断(包括时钟中断)
    
    ReadEEPROM();                                               // 读取EEPROM,一定要在调用OSInit()后调用此函数

    ReadSpeedSetParameter();                                    // 读取速度参数

    ReadPidParam();                                             // 读取PID参数
    
    head = FALSE;                                               // 命令头标识初始化为0
    while(1)
    {
        c = CommGetChar(COMM1,0,&err);                          // 调用取字符函数
        if(err == COMM_NO_ERR){                                 // 条件识别: 函数调用成功
            if(c == '*'){                                       // 条件识别: 收到起始字符
                head = TRUE;                
                i = 0;
                command_content[i++] = c;                       // 存起始符             
            }else if(head == TRUE && i < COMMAND_LENGTH){       // 条件识别: A:已收到起始符 B:字符数组没有越界          
                command_content[i++] = c;                       // 命令字符数组加入新的字符
                if(c == '\r'){
                    err = DealCommand(command_content);               // 收到一个完整的命令,调用命令处理函数
                //    SendProgramRunStatus(err);
                    head = FALSE;
                }
            }else{
                head = FALSE;
            }
        } 
    }
}

/*********************************************************************************************************
** 函数名称: SendProgramRunStatus()
** 功能描述: 向上位机发送控制器状态
**           
** 输 入  : key 状态索引
** 输 出  : 无
** 全局变量: 无
** 调用模块: const char *message
** 
** 作 者: 周川福
** 日 期: 2006-04-14
**-------------------------------------------------------------------------------------------------------
** 修 改: 
** 日 期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void SendProgramRunStatus(INT8U key)
{
    INT8U err, c;
    const char  *str;
    
    str = message[key];

    OSMutexPend(uart0,0,&err);                          // 此任务要使用串口,为防止其它任务也使用串口,调用互斥型信号量

    while((c = *str++) != '\0'){
        CommPutChar(COMM1, c, 0);                       // 将数据写入发送缓冲区
    }

    OSMutexPost(uart0);                                 // 发出互斥型信号量
    
    if((U0IER & 0x02) == 0){                            // 如果发送中断是关的
        U0IER |= 0x02;                                  // 开发送中断
        U0THR = CommGetTxChar(COMM1, &err);             // 往发送寄存器写初始值
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -