OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5932|回复: 1

关于usmart的问题(已解决)

[复制链接]

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2014-9-16
在线时间
15 小时
发表于 2014-9-16 15:07:40 | 显示全部楼层 |阅读模式
5金钱
关于函数usmart_sys_cmd_exe中变量i,由于i是命令的长度那switch(i)是如何区分不同的指令的?
u8 *sys_cmd_tab[]=
{
"?",
"help",
"list",
"id",
"hex",
"dec",   
};    
//处理系统指令
//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)==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.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.name,sfname,&pnum,&rval);//得到本地函数名 
printf("%s id is:\r\n0X%08X\r\n",sfname,usmart_dev.funs.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;
}




最佳答案

查看完整内容[请看2#楼]

原来是下面的for循环又改变了i  for(i=0;i<8;i++)//支持8个系统指令 { if(usmart_strcmp(sfname,sys_cmd_tab)==0)break; }
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2014-9-16
在线时间
15 小时
 楼主| 发表于 2014-9-16 15:07:41 | 显示全部楼层
原来是下面的for循环又改变了i
 for(i=0;i<8;i++)//支持8个系统指令
{
if(usmart_strcmp(sfname,sys_cmd_tab)==0)break;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-1 04:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表