功能简介:
有点类似shell指令一样,Linux下的shell是通过输入指令,然后shell脚本去按path路径去寻找相应指令,运行最先找到的那个指令文件。这里实现的机制则是通过串口输入指令,单片串口接受并分析指令,然后匹配对应的指令然后运行并反馈。到这里,这个程序倒是开拓了我的思路,以前没想过使用串口来控制单片机的,最多就是收发一些字符串。由于原子哥的视频长度有限,也可能是他们不想在语法上花费过多时间,所以讲解的就比较的简略,下面我将根据其运行的过程以及一些语法上做出一些解释。
流程分析
1.定时器中断的扫描函数
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)//溢出中断
{
usmart_dev.scan(); //执行usmart扫描
TIM_SetCounter(TIM4,0); //清空定时器的CNT
TIM_SetAutoreload(TIM4,100);//恢复原来的设置
}
TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除中断标志位
}
原子哥在视频中说过这个的实现过程是通过定时器中断执行这个usmart的扫描函数,下面再看看扫描函数中的具体逻辑,如果在一个工程里面难以寻找到一个中断函数,可以在启动文件中寻找。
2.扫描函数
void usmart_scan(void)
{
u8 sta,len;
if(USART_RX_STA&0x8000)//串口接收完成?
{
len=USART_RX_STA&0x3fff; //得到此次接收到的数据长度
USART_RX_BUF[len]='\0'; //在末尾加入结束符.
sta=usmart_dev.cmd_rec(USART_RX_BUF);//得到函数各个信息
if(sta==0)usmart_dev.exe(); //执行函数
else
{
len=usmart_sys_cmd_exe(USART_RX_BUF);
if(len!=USMART_FUNCERR)sta=len;
if(sta)
{
switch(sta)
{
case USMART_FUNCERR:
printf("函数错误!\r\n");
break;
case USMART_PARMERR:
printf("参数错误!\r\n");
break;
case USMART_PARMOVER:
printf("参数太多!\r\n");
break;
case USMART_NOFUNCFIND:
printf("未找到匹配的函数!\r\n"