//从str中得到函数参数 //str:源字符串; //parn:参数的多少.0表示无参数 void类型 //返回值:0,成功;其他,错误代码. u8 usmart_get_fparam(u8*str,u8 *parn) { u8 i,type; u32 res; u8 n=0; u8 len; u8 tstr[PARM_LEN+1];//字节长度的缓存,最多可以存放PARM_LEN个字符的字符串 for(i=0;i<MAX_PARM;i++)usmart_dev.plentbl[i]=0;//清空参数长度表 while(*str!='(')//偏移到参数开始的地方 { str++; if(*str=='\0')return USMART_FUNCERR;//遇到结束符了 } str++;//偏移到"("之后的第一个字节 while(1) { i=usmart_get_aparm(str,tstr,&type); //得到第一个参数 str+=i; //偏移 switch(type) { case 0: //数字 if(tstr[0]!='\0') //接收到的参数有效 { i=usmart_str2num(tstr,&res); //记录该参数 if(i)return USMART_PARMERR; //参数错误. *(u32*)(usmart_dev.parm+usmart_get_parmpos(n))=res;//记录转换成功的结果. usmart_dev.parmtype&=~(1<<n); //标记数字 usmart_dev.plentbl[n]=4; //该参数的长度为4 n++; //参数增加 if(n>MAX_PARM)return USMART_PARMOVER;//参数太多 } break; case 1://字符串 len=usmart_strlen(tstr)+1; //包含了结束符'\0' usmart_strcopy(tstr,&usmart_dev.parm[usmart_get_parmpos(n)]);//拷贝tstr数据到usmart_dev.parm[n] usmart_dev.parmtype|=1<<n; //标记字符串 usmart_dev.plentbl[n]=len; //该参数的长度为len n++; if(n>MAX_PARM)return USMART_PARMOVER;//参数太多 break; case 0XFF://错误 return USMART_PARMERR;//参数错误 } if(*str==')'||*str=='\0')break;//查到结束标志了. } *parn=n; //记录参数的个数 return USMART_OK;//正确得到了参数 }
//usamrt执行函数 //该函数用于最终执行从串口收到的有效函数. //最多支持10个参数的函数,更多的参数支持也很容易实现.不过用的很少.一般5个左右的参数的函数已经很少见了. //该函数会在串口打印执行情况.以:"函数名(参数1,参数2...参数N)=返回值".的形式打印. //当所执行的函数没有返回值的时候,所打印的返回值是一个无意义的数据. void usmart_exe(void) { u8 id,i; u32 res; u32 temp[MAX_PARM];//参数转换,使之支持了字符串 u8 sfname[MAX_FNAME_LEN];//存放本地函数名 u8 pnum,rval; id=usmart_dev.id; if(id>=usmart_dev.fnum)return;//不执行. usmart_get_fname((u8*)usmart_dev.funs[id].name,sfname,&pnum,&rval);//得到本地函数名,及参数个数 printf("\r\n%s(",sfname);//输出正要执行的函数名 for(i=0;i<pnum;i++)//输出参数 { if(usmart_dev.parmtype&(1<<i))//参数是字符串 { printf("%c",'"'); printf("%s",usmart_dev.parm+usmart_get_parmpos(i)); printf("%c",'"'); temp[i]=(u32)&(usmart_dev.parm[usmart_get_parmpos(i)]); }else //参数是数字 { temp[i]=*(u32*)(usmart_dev.parm+usmart_get_parmpos(i)); if(usmart_dev.sptype==SP_TYPE_DEC)printf("%lu",temp[i]);//10进制参数显示 else printf("0X%X",temp[i]);//16进制参数显示 } if(i!=pnum-1)printf(","); } printf(")"); switch(usmart_dev.pnum) { case 0://无参数(void类型) res=(*(u32(*)())usmart_dev.funs[id].func)(); break; case 1://有1个参数 res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0]); break; case 2://有2个参数 res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1]); break; case 3://有3个参数 res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2]); break; case 4://有4个参数 res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3]); break; case 5://有5个参数 res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4]); break; case 6://有6个参数 res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\ temp[5]); break; case 7://有7个参数 res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\ temp[5],temp[6]); break; case 8://有8个参数 res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\ temp[5],temp[6],temp[7]); break; case 9://有9个参数 res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\ temp[5],temp[6],temp[7],temp[8]); break; case 10://有10个参数 res=(*(u32(*)())usmart_dev.funs[id].func)(temp[0],temp[1],temp[2],temp[3],temp[4],\ temp[5],temp[6],temp[7],temp[8],temp[9]); break; } if(rval==1)//需要返回值. { if(usmart_dev.sptype==SP_TYPE_DEC)printf("=%lu;\r\n",res);//输出执行结果(10进制参数显示) else printf("=0X%X;\r\n",res);//输出执行结果(16进制参数显示) }else printf(";\r\n");//不需要返回值,直接输出结束 }