//从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;//正确得到了参数 }
//处理系统指令 //0,成功处理;其他,错误代码; u8 usmart_sys_cmd_exe(u8 *str) { u8 i; u8 sfname[MAX_FNAME_LEN];//存放本地函数名 u8 pnum; u8 rval; u32 res; res=usmart_get_cmdname(str,sfname,&i,MAX_FNAME_LEN);//得到指令及指令长度 if(res)return USMART_FUNCERR;//错误的指令 str+=i; for(i=0;i<8;i++)//支持8个系统指令 { if(usmart_strcmp(sfname,sys_cmd_tab[i])==0)break; } switch(i) { case 0: case 1://帮助指令 printf("\r\n"); #if USMART_USE_HELP printf("------------------------USMART V2.8------------------------ \r\n"); printf(" USMART是由ALIENTEK开发的一个灵巧的串口调试互交组件,通过 \r\n"); printf("它,你可以通过串口助手调用程序里面的任何函数,并执行.因此,你可\r\n"); printf("以随意更改函数的输入参数(支持数字(10/16进制)、字符串、函数入\r\n"); printf("口地址等作为参数),单个函数最多支持10个输入参数,并支持函数返 \r\n"); printf("回值显示.新增参数显示进制设置功能,新增进制转换功能.\r\n"); printf("技术支持:www.openedv.com\r\n"); printf("USMART有6个系统命令:\r\n"); printf("?: 获取帮助信息\r\n"); printf("help: 获取帮助信息\r\n"); printf("list: 可用的函数列表\r\n\n"); printf("id: 可用函数的ID列表\r\n\n"); printf("hex: 参数16进制显示,后跟空格+数字即执行进制转换\r\n\n"); printf("dec: 参数10进制显示,后跟空格+数字即执行进制转换\r\n\n"); printf("请按照程序编写格式输入函数名及参数并以回车键结束.\r\n"); printf("--------------------------ALIENTEK------------------------- \r\n"); #else printf("指令失效\r\n"); #endif break; case 2://查询指令 printf("\r\n"); printf("-------------------------函数清单--------------------------- \r\n"); for(i=0;i<usmart_dev.fnum;i++)printf("%s\r\n",usmart_dev.funs[i].name); printf("\r\n"); break; case 3://查询ID printf("\r\n"); printf("-------------------------函数 ID --------------------------- \r\n"); for(i=0;i<usmart_dev.fnum;i++) { usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&pnum,&rval);//得到本地函数名 printf("%s id is:\r\n0X%08X\r\n",sfname,usmart_dev.funs[i].func); //显示ID } printf("\r\n"); break; case 4://hex指令 printf("\r\n"); usmart_get_aparm(str,sfname,&i); if(i==0)//参数正常 { i=usmart_str2num(sfname,&res); //记录该参数 if(i==0) //进制转换功能 { printf("HEX:0X%X\r\n",res); //转为16进制 }else if(i!=4)return USMART_PARMERR;//参数错误. else //参数显示设定功能 { printf("16进制参数显示!\r\n"); usmart_dev.sptype=SP_TYPE_HEX; } }else return USMART_PARMERR; //参数错误. printf("\r\n"); break; case 5://dec指令 printf("\r\n"); usmart_get_aparm(str,sfname,&i); if(i==0)//参数正常 { i=usmart_str2num(sfname,&res); //记录该参数 if(i==0) //进制转换功能 { printf("DEC:%lu\r\n",res); //转为10进制 }else if(i!=4)return USMART_PARMERR;//参数错误. else //参数显示设定功能 { printf("10进制参数显示!\r\n"); usmart_dev.sptype=SP_TYPE_DEC; } }else return USMART_PARMERR; //参数错误. printf("\r\n"); break; case 6://read指令 printf("\r\n"); usmart_get_aparm(str,sfname,&i); if(i==0)//参数正常 { i=usmart_str2num(sfname,&res); //记录该参数 if(i==0) //读取指定地址数据功能 { if(usmart_dev.sptype==SP_TYPE_HEX)printf("*(0X%X)=0X%X\r\n",res,*(u32*)res); //读取指定地址的值 else printf("*(%d)=%d\r\n",res,*(u32*)res); //读取指定地址的值 }else return USMART_PARMERR; //未带参数,或者参数错误 }else return USMART_PARMERR; //参数错误. printf("\r\n"); break; default://非法指令 return USMART_FUNCERR; } return 0; }
//处理系统指令 //0,成功处理;其他,错误代码; u8 usmart_sys_cmd_exe(u8 *str) { u8 i; u8 sfname[MAX_FNAME_LEN];//存放本地函数名 u8 pnum; u8 rval; u32 res; res=usmart_get_cmdname(str,sfname,&i,MAX_FNAME_LEN);//得到指令及指令长度 if(res)return USMART_FUNCERR;//错误的指令 str+=i; for(i=0;i<sizeof(sys_cmd_tab)/4;i++)//支持的系统指令 { if(usmart_strcmp(sfname,sys_cmd_tab[i])==0)break; } switch(i) { case 0: case 1://帮助指令 printf("\r\n"); #if USMART_USE_HELP printf("------------------------USMART V3.2------------------------ \r\n"); printf(" USMART是由ALIENTEK开发的一个灵巧的串口调试互交组件,通过 \r\n"); printf("它,你可以通过串口助手调用程序里面的任何函数,并执行.因此,你可\r\n"); printf("以随意更改函数的输入参数(支持数字(10/16进制,支持负数)、字符串\r\n"), printf("、函数入口地址等作为参数),单个函数最多支持10个输入参数,并支持\r\n"), printf("函数返回值显示.支持参数显示进制设置功能,支持进制转换功能.\r\n"); printf("技术支持:www.openedv.com\r\n"); printf("USMART有7个系统命令(必须小写):\r\n"); printf("?: 获取帮助信息\r\n"); printf("help: 获取帮助信息\r\n"); printf("list: 可用的函数列表\r\n\n"); printf("id: 可用函数的ID列表\r\n\n"); printf("hex: 参数16进制显示,后跟空格+数字即执行进制转换\r\n\n"); printf("dec: 参数10进制显示,后跟空格+数字即执行进制转换\r\n\n"); printf("runtime:1,开启函数运行计时;0,关闭函数运行计时;\r\n\n"); printf("请按照程序编写格式输入函数名及参数并以回车键结束.\r\n"); printf("--------------------------ALIENTEK------------------------- \r\n"); #else printf("指令失效\r\n"); #endif break; case 2://查询指令 printf("\r\n"); printf("-------------------------函数清单--------------------------- \r\n"); for(i=0;i<usmart_dev.fnum;i++)printf("%s\r\n",usmart_dev.funs[i].name); printf("\r\n"); break; case 3://查询ID printf("\r\n"); printf("-------------------------函数 ID --------------------------- \r\n"); for(i=0;i<usmart_dev.fnum;i++) { usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&pnum,&rval);//得到本地函数名 printf("%s id is:\r\n0X%08X\r\n",sfname,usmart_dev.funs[i].func); //显示ID } printf("\r\n"); break; case 4://hex指令 printf("\r\n"); usmart_get_aparm(str,sfname,&i); if(i==0)//参数正常 { i=usmart_str2num(sfname,&res); //记录该参数 if(i==0) //进制转换功能 { printf("HEX:0X%X\r\n",res); //转为16进制 }else if(i!=4)return USMART_PARMERR;//参数错误. else //参数显示设定功能 { printf("16进制参数显示!\r\n"); usmart_dev.sptype=SP_TYPE_HEX; } }else return USMART_PARMERR; //参数错误. printf("\r\n"); break; case 5://dec指令 printf("\r\n"); usmart_get_aparm(str,sfname,&i); if(i==0)//参数正常 { i=usmart_str2num(sfname,&res); //记录该参数 if(i==0) //进制转换功能 { printf("DEC:%lu\r\n",res); //转为10进制 }else if(i!=4)return USMART_PARMERR;//参数错误. else //参数显示设定功能 { printf("10进制参数显示!\r\n"); usmart_dev.sptype=SP_TYPE_DEC; } }else return USMART_PARMERR; //参数错误. printf("\r\n"); break; case 6://runtime指令,设置是否显示函数执行时间 printf("\r\n"); usmart_get_aparm(str,sfname,&i); if(i==0)//参数正常 { i=usmart_str2num(sfname,&res); //记录该参数 if(i==0) //读取指定地址数据功能 { if(USMART_ENTIMX_SCAN==0)printf("\r\nError! \r\nTo EN RunTime function,Please set USMART_ENTIMX_SCAN = 1 first!\r\n");//报错 else { usmart_dev.runtimeflag=res; if(usmart_dev.runtimeflag)printf("Run Time Calculation ON\r\n"); else printf("Run Time Calculation OFF\r\n"); } }else return USMART_PARMERR; //未带参数,或者参数错误 }else return USMART_PARMERR; //参数错误. printf("\r\n"); break; default://非法指令 return USMART_FUNCERR; } return 0; }