身为电子工程师,看了马斯克的星舰飞船,真是太帅了;
深知一个良好的测试环境对产品性能的影响,对工作效率的提升。
小资源MCU调试代码的工具USMART 使用起来。
移植的文章网上有很多,但是对移植过程中使用错误的文章却很少,我把我使用这个组件中遇到的问题分享一下。
问题
移植完成后使用系统命令 提示 函数错误
解决过程
1:找到源码中函数错误的位置
void usmart_scan(void)
{
u8 sta,len;
if(ucUSART1_ReceiveMessageNumber)//´®¿Ú½ÓÊÕÍê³É£¿
{
len=ucUSART1ReceiveBufferLength[ucUSART1ReadBufferIndex]; //µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
ucUSART1ReceiveBuffer[ucUSART1ReadBufferIndex][len]='\0'; //ÔÚĩβ¼ÓÈë½áÊø·û.
sta=usmart_dev.cmd_rec(ucUSART1ReceiveBuffer[ucUSART1ReadBufferIndex]);//µÃµ½º¯Êý¸÷¸öÐÅÏ¢
if(sta==0)usmart_dev.exe(); //Ö´Ðк¯Êý
else
{
len=usmart_sys_cmd_exe(ucUSART1ReceiveBuffer[ucUSART1ReadBufferIndex]);
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");
break;
}
}
}
USART1ReceiveDataReadDone( );//״̬¼Ä´æÆ÷Çå¿Õ
}
}
2:单步调试
(1):串口接收正确;
(2):usmart_dev.cmd_rec 返回1,进一步查看
u8 usmart_cmd_rec(u8*str)
{
u8 sta,i,rval;//״̬
u8 rpnum,spnum;
u8 rfname[MAX_FNAME_LEN];//ÔÝ´æ¿Õ¼ä,ÓÃÓÚ´æ·Å½ÓÊÕµ½µÄº¯ÊýÃû
u8 sfname[MAX_FNAME_LEN];//´æ·Å±¾µØº¯ÊýÃû
sta=usmart_get_fname(str,rfname,&rpnum,&rval);//µÃµ½½ÓÊÕµ½µÄÊý¾ÝµÄº¯ÊýÃû¼°²ÎÊý¸öÊý
if(sta)return sta;//´íÎó
for(i=0;i<usmart_dev.fnum;i++)
{
sta=usmart_get_fname((u8*)usmart_dev.funs[i].name,sfname,&spnum,&rval);//µÃµ½±¾µØº¯ÊýÃû¼°²ÎÊý¸öÊý
if(sta)return sta;//±¾µØ½âÎöÓÐÎó
if(usmart_strcmp(sfname,rfname)==0)//ÏàµÈ
{
if(spnum>rpnum)return USMART_PARMERR;//²ÎÊý´íÎó(ÊäÈë²ÎÊý±ÈÔ´º¯Êý²ÎÊýÉÙ)
usmart_dev.id=i;//¼Ç¼º¯ÊýID.
break;//Ìø³ö.
}
}
if(i==usmart_dev.fnum)return USMART_NOFUNCFIND; //δÕÒµ½Æ¥ÅäµÄº¯Êý
sta=usmart_get_fparam(str,&i); //µÃµ½º¯Êý²ÎÊý¸öÊý
if(sta)return sta; //·µ»Ø´íÎó
usmart_dev.pnum=i; //²ÎÊý¸öÊý¼Ç¼
return USMART_OK;
}
if(sta)return sta;//错误
发现这个返回值错误。
进一步查看 sta=usmart_get_fname(str,rfname,&rpnum,&rval); 这个函数
while(1)
{
if(*strtemp==0)
{
res=USMART_FUNCERR;//º¯Êý´íÎó
break;
}else if(*strtemp=='('&&nchar==0)fover++;//À¨ºÅÉî¶ÈÔö¼ÓÒ»¼¶
else if(*strtemp==')'&&nchar==0)
{
if(fover)fover--;
else res=USMART_FUNCERR;//´íÎó½áÊø,ûÊÕµ½'('
if(fover==0)break;//µ½Ä©Î²ÁË,Í˳ö
}else if(*strtemp=='"')nchar=!nchar;
发现这个函数便携的有问题呀,只要命令里面没有()括号就会报错,这是想到难道我下载的源码有问题,官方下载源码对比查看,源码也是这样写的,那不对呀。
返回 usmart_dev.cmd_rec 查看才发现 原来系统命令与函数调用代码分了2个支路处理
这里是处理系统命令的。
进到这里看到,发送系统命令的时候不需要 回车与换行
重新测试
正常了。