//处理系统指令 //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; }