> 文章列表 > USMART 函数错误解决方法

USMART 函数错误解决方法

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个支路处理

 这里是处理系统命令的。

 进到这里看到,发送系统命令的时候不需要 回车与换行

重新测试

 正常了。