USMART 函数错误解决方法
身为电子工程师,看了马斯克的星舰飞船,真是太帅了;
深知一个良好的测试环境对产品性能的影响,对工作效率的提升。
小资源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个支路处理
这里是处理系统命令的。
进到这里看到,发送系统命令的时候不需要 回车与换行
重新测试
正常了。