ucos下用串口做调试口时,接收用户指令的方法

1 篇文章 0 订阅

首先保证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);
	}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值