📄 command_deal.c
字号:
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 + -