概述
鉴于本控制器在调试时候可能会输出一些调试结果,为了不影响控制系统,建议控制命令使用中括号括起来
实现
- 输出的时候,比如按钮事件中
int pwm; pwm=80; echo ("[PM:"+pwm+"]");
在单片机编程中,以stm32为例: - 第一步:建立全局变量:
char cmd[8]; //命令缓冲区,存放[]中传来的命令,靠cjs进行位置累加字符串
u8 cjs=0; //cjs:cmd命令计数
u8 iscmd=0; //==1 表示处于[]内部,cmd记录中
u8 iscmdok=0; //==1 表示有命令处理
- 第二步,建立处理串口流式数据的函数
这是一个标准的状态机算法,iscmd为状态,遇见undefined 状态机切换成记录模式,记录到cmd这个buf,一直记录到遇见符号] ,此时,记录完成的状态 iscmdok这个新的状态变为1,表示已经记录成功了一个新的语句;
void recvchar(u8 gc)
{ if (gc=='[')
{ cjs=0;
iscmd=1;
}
else if(gc==']')
{ iscmd=0;
iscmdok=1;
}
else if (iscmd==1)
{ if (cjs<8) cmd[cjs]=gc;
cjs++;
}
}
- 第三步:在主程序得主循环体中增加事件处理:
注意,本程序只是示例,只能处理2位数,当然可以使用c语言的sscanf语句获取更复杂的数据格式
if(iscmdok==1)
{ if ((cmd[0]=='P') & (cmd[1]=='M'))
{ n=cmd[3]-0x30;
if ((cmd[4]>=0x30) & (cmd[4]<=0x39))
{ n=n*10+cmd[4]-0x30;
cmd[4]=0;
}
//此时n为PWM,在此写对应的处理程序
}
iscmdok=0;
}
- 第四步:在串口接收中断函数中添加: ``` void USART1_IRQHandler(void) { u8 gc; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{ gc=USART_ReceiveData(USART1); //中断接收当前串口数据
} }Recvchar(gc);
```