首先保证printf()函数正确映射到串口,也就是硬件板单方向能向pc机调试串口发送字符串;
接下来单独创建一个任务用于接收键盘输入的命令,利用scanf()进行字符串接收,此函数属于阻塞函数,没有键盘输入时这个任务将处于阻塞状态,不占cpu。
收到键盘字符串后,利用sscanf()提取感兴趣的字符及数字
sscanf(chOrder,"%[^=^\r]",name);//提取字符串,直到遇见=号或\r字符便停止
sscanf(chOrder,"%*[^=]=%s",chVal);//提取=号后边的字符串,也就是设置命令的数据部分,比如要设置的ip地址
sscanf(chVal,"%d.%d.%d.%d",&IP[0],&IP[1],&IP[2],&IP[3]);//按格式将字符串转化为数字,比如192.12.3.4转化后变成ip[4]=192,12,3,4【备注:IP数组必须为int型,否则转化后的数据有问题】
while(1)
{
char chGet[100] = {0};
char chOrder[100] = {0};
int no = 0;
int ret = -1;
for(no = 0; no < 100; no++)
{
scanf("%c",&chGet[no]);
printf("%c",chGet[no]);
if(chGet[no] == '\r')
{
printf("\n");
break;
}
}
ret = sscanf(chGet,"%[^\r]",chOrder);//delete enter sign
if((strlen(chOrder)) == 0)
continue;
if(strcmp(chOrder,"help") == 0)
{
for(i=0;i<10;i++)
printf("%s\r\n",&myOrder[i]);
continue;
}
char name[32] = {0};
char chVal[32] = {0};
int IP[4] = {0};
WORD wIP[2] = {0};
int ipOffset = -1;
sscanf(chOrder,"%[^=^\r]",name);
sscanf(chOrder,"%*[^=]=%s",chVal);
if((strcmp(myOrder[0],name) == 0) && (strlen(myOrder[0])) == strlen(chOrder))
{/*get local ip and client ip information*/
printf("local ip:");
printf("%d.%d.%d.%d\r\n",IPADDR0,IPADDR1,IPADDR2,IPADDR3);
printf("client ip list:\r\n");
for(i = 0,j=0;i < APTSOCKETMAX; i++,j+=2)
{
printf("%d: %d.%d.%d.%d\r\n",i+1,ClientIpList[i][0],ClientIpList[i][1],ClientIpList[i][2],ClientIpList[i][3]);
}
continue;
}
else if((strcmp(myOrder[1],name) == 0) && (strlen(myOrder[1])) == strlen(chOrder))
{/*reboot system*/
printf("\nsystem reboot");
soft_reset();
}
else if((strcmp(myOrder[2],name) == 0) && (strlen(myOrder[2])) == strlen(chOrder))
{/*reset local ip*/
wIP[0] = MAKEWORD(DefIpList[0][0],DefIpList[0][1]);
wIP[1] = MAKEWORD(DefIpList[0][2],DefIpList[0][3]);
ipOffset = 5;
ret = SaveParaToFlash(FLASH_ADDR_SYSPARA,ipOffset*2,4,sizeof(LocSysPara),(BYTE *)&wIP);
if(ret ==0)
printf("success\n");
else
printf("failed\n");
continue;
}
else if((strcmp(myOrder[3],name) == 0) && (strlen(myOrder[3])) == strlen(chOrder))
{/*reset client ip list*/
ipOffset = 7;
ret = SaveParaToFlash(FLASH_ADDR_SYSPARA,ipOffset*2,4*5,sizeof(LocSysPara),(BYTE *)&DefIpList[1]);
if(ret ==0)
printf("success\n");
else
printf("failed\n");
continue;
}
else if(strcmp(myOrder[4],name) == 0)
ipOffset = 5;//本地ip在系统参数的第5号位置 set local ip
else if(strcmp(myOrder[5],name) == 0)
ipOffset = 7;
else if(strcmp(myOrder[6],name) == 0)
ipOffset = 9;
else if(strcmp(myOrder[7],name) == 0)
ipOffset = 11;
else if(strcmp(myOrder[8],name) == 0)
ipOffset = 13;
else if(strcmp(myOrder[9],name) == 0)
ipOffset = 15;
if(ipOffset != -1)
{
sscanf(chVal,"%d.%d.%d.%d",&IP[0],&IP[1],&IP[2],&IP[3]);
wIP[0] = MAKEWORD(IP[1],IP[0]);
wIP[1] = MAKEWORD(IP[3],IP[2]);
ret = SaveParaToFlash(FLASH_ADDR_SYSPARA,ipOffset*2,4,sizeof(LocSysPara),(BYTE *)&wIP);
if(ret ==0)
printf("new ip=%03d.%03d.%03d.%03d\n",IP[0],IP[1],IP[2],IP[3]);
else
printf("set ip failed\n");
}
OSTimeDlyHMSM(0,0,0,5);
}