⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config.c

📁 本程序是一个RS232转网口的。是一个透明传输的模块
💻 C
📖 第 1 页 / 共 3 页
字号:
            ConfigRegPtr[id][i] = *(ComparePtr+i);
	    }
        ConfigRegPtr[id][length] = 0;             //结束符
    } else if (id == ID_PINGIP){
	    for (i=0; i<length; i++) {
            PingIpStr[i] = *(ComparePtr+i);       //PINPIP作为回显用,不作为存入FLASH用
	    }
        PingIpStr[length] = 0;                    //结束符                                 
	} else {
        return COM_ERROR;
	}

	if (com == UART_COM) {                        //串口配置须要回显配置信息
        if (id == ID_HEARTTIME) {
            Uart0Putf(pHeartTime[*ComparePtr-0x31]); //'1' ...
		} else if (id == ID_BAUDRATE) {
            Uart0Putf(pBaudRate[*ComparePtr-0x31]);  //'1' ...
		} else if (id == ID_DHCPMODE) {
            Uart0Putf(pDhcpMode[*ComparePtr-0x30]);  //只能,'0'跟'1' 
		} else if (id == ID_COMC){		             // 0: NONE 1:OLD   2:EVEN
            Uart0Putf(pComcBit[*ComparePtr-0x30]);   //提示信息
		} else {
		    Uart0Putsl(ComparePtr,length);
		}
        
		/*
		Uart0Putf("\r\n2:\r\n");
		if (id == ID_PINGIP) {
            Uart0Puts(PingIpStr);
		} else {
		    Uart0Putsl(ConfigRegPtr[id],length);
		}*/
	}
    return TRUE;
} 

/*
*****************************************************************************************************
*FUNC:  解析IP地址
*NOTE:  字符串化为10进制数据,返回相应的错错误类型
*****************************************************************************************************
*/
typedef struct _IP_STRING_STRUCT_
{
    unsigned char bit_num;     //几位
	unsigned char bytes[4];    //'1''9''2' 
}IP_STRING_STRUCT;
IP_STRING_STRUCT xdata ip_string[4];


unsigned char Parse_Ip(unsigned char com,unsigned char id, unsigned char xdata *ipbytes) reentrant
{
	unsigned char length=0;
	unsigned char dotnum=0;

	unsigned char i,ch;
    unsigned char j,k;
	unsigned int result=0;
	

	if (com >= END_CHAR_NUM) {
        return COM_ERROR;
	}

    if ((ComparePtr == NULL) || (*ComparePtr == '\r') 
	   || (*ComparePtr == '\0') || (*ComparePtr == '&')) {            //ComparePtr指向匹配后的有效数据
        return VALUE_NULL;
	}

	if (Parse_Length(ComparePtr,15,EndChar[com],&length) == FALSE) {  //IP最大度为15位,255.255.255.255
        return LENGTH_ERROR;
	}                      

	if (Parse_Value(ComparePtr,length,PARSE_IP_TYPE,&dotnum) == FALSE) { //判断值是否在0-9之内,如果是IP统计'.'个数
        return VALUE_ERROR;
	}

	if (dotnum != 3) {
        return VALUE_ERROR;
	}

	//以下解析IP为10进制数
	k=0;
	j=0;
    for (i=0; i<4; i++) {
        ip_string[i].bit_num = 0;                //初始化
    }
    for (i=0; i<length; i++) {
        ch = *(ComparePtr+i);
		if (ch != '.') {                 
		    if (++j < 4) {                       //记下没找到'.'此时的长度如IP:255.  最大为255即3位,超出即出错
                ip_string[k].bytes[j-1] = ch;
				if (k == 3) {
                    ip_string[k].bit_num = j;    //几位数,如IP:192.即3位数
				}
			} else {
                return VALUE_ERROR;
			}
		} else {                                 //找到一个合法的如IP:192. 
		    if (k > 3) {
                return VALUE_ERROR;
			}
            ip_string[k++].bit_num = j;          //几位数,如IP:192.即3位数
			if (j == 0) {
                return VALUE_ERROR;              //这种情况,可以判断出连续..或,第一个是.的情况
			}
			j = 0;
		}
	}
	if (ip_string[3].bit_num == 0) {             //第四字节没有'.'做为结束符判断
	    return VALUE_ERROR; 
	}

	for (i=0; i<4; i++) {
        result = DecToHex(ip_string[i].bytes,ip_string[i].bit_num);
 	    if (result > 255) {
            return VALUE_ERROR;
		} 
	}

	if (com == READ_COM) {                       //第一次从FLASH读出时要转换为HEX  
	    for (i=0; i<4; i++) {
            result = DecToHex(ip_string[i].bytes,ip_string[i].bit_num);
		    ipbytes[i] = result;
	    }
		return TRUE;                             //第一次从FLASH读出时无须再拷贝 
    } else if (id == ID_PINGIP){                 //PING IP须要解析
	    for (i=0; i<4; i++) {
            result = DecToHex(ip_string[i].bytes,ip_string[i].bit_num);
		    ipbytes[i] = result;
	    }
	}
	return (Copy_Config_Data(com,id,length));
}


/*
*****************************************************************************************************
*FUNC:  解析PORT
*NOTE:  字符串化为10进制数据,返回相应的错错误类型
	portbytes[0]=*((unsigned char*)&temp);
	portbytes[1]= *(((unsigned char*)&temp)+1);

	*****1:第一次从FLASH读出时要转换为HEX
	     2:后面通过串口修改及HTTP修改须复位重起才有效
*****************************************************************************************************
*/
unsigned char Parse_Port(unsigned char com,unsigned char id, unsigned char xdata *portbytes)reentrant
{
	unsigned char length=0;
	unsigned char dotnum=0;
	static unsigned long xdata temp;

	if (com >= END_CHAR_NUM) {
        return COM_ERROR;
	}

    if ((ComparePtr == NULL) || (*ComparePtr == '\r') 
	   || (*ComparePtr == '\0') || (*ComparePtr == '&')) {               //ComparePtr指向匹配后的有效数据
        return VALUE_NULL;
	}

	if (Parse_Length(ComparePtr,5,EndChar[com],&length) == FALSE) {       //端口最大度为5位,1-65535
        return LENGTH_ERROR;
	}                               

	if (Parse_Value(ComparePtr,length,PARSE_OTHER_TYPE,&dotnum) == FALSE) { //判断值是否在0-9之内,如果是IP统计'.'个数
        return VALUE_ERROR;
	}

    temp = DecToHex(ComparePtr,length);
    if ((temp == 80) || (temp == 21) || (temp > 65535) || (temp == 67)
	  ||(temp == 68) || (temp == 8080)) {
        return VALUE_ERROR;
	}

	if (com == READ_COM) {                                        //第一次从FLASH读出时要转换为HEX  
	    portbytes[1]= (unsigned char)temp;
	    temp>>=8;
        portbytes[0]= (unsigned char)temp;
		return TRUE;                                              //第一次从FLASH读出时无须再拷贝 
    }
    return (Copy_Config_Data(com,id,length));
}


/*
*****************************************************************************************************
*FUNC:  解析网卡地址
*NOTE:  字符串要化为HEX
        #define ID_LOCALMAC  0
			0x11,0x12,在上位机上显示为1112
	字符串要化为HEX, 如111213141516要化为0X11,0X12,0X13,0X14,0X15,0X16
	'0'-'9' = '0'-0X30   'A'-'F' -= 0x37    'a'-'f' -=  0X57
*****************************************************************************************************
*/
unsigned char CharToHex(unsigned char ch)
{
    if ((ch >= '0') &&  (ch <= '9')) {
        return (ch-0x30);
	} else if ((ch >= 'A') &&  (ch <= 'F')) {
        return (ch-0x37);
	} else {
        return (ch-0x57);
	} 
}

unsigned char Parse_Mac(unsigned char com,unsigned char id, unsigned char xdata *ethernet_address)reentrant
{
	unsigned char length=0;
	unsigned char dotnum=0;
	unsigned char i,hex_h,hex_l;

	if (com >= END_CHAR_NUM) {
        return COM_ERROR;
	}

    if ((ComparePtr == NULL) || (*ComparePtr == '\r') 
	   || (*ComparePtr == '\0') || (*ComparePtr == '&')) {               //ComparePtr指向匹配后的有效数据
        return VALUE_NULL;
	}

	if (Parse_Length(ComparePtr,12,EndChar[com],&length) == FALSE) {     //网卡地址最大为12位,寻找结束符
        return LENGTH_ERROR;                                             //没找到结束符
	}

	if (length != 12) {
        return LENGTH_ERROR;                                             //网卡地址必须为12位                     
	} 

	if (Parse_Value(ComparePtr,length,PARSE_MAC_TYPE,&dotnum) == FALSE) { //判断值是否在0-9之内,如果是IP统计'.'个数
        return VALUE_ERROR;
	}

	if (com == READ_COM){                                                //第一次从FLASH读出时要转换为HEX  
		//说明字符及长度合法,但不说明数据合法,如PORT:1-65535,IP:不大于255
        for (i=0; i<6; i++) {                                            //这里是因为MAC地址恒定为12位
            hex_h = CharToHex(*(ComparePtr+i*2));
 	        hex_h <<=4;
            hex_l = CharToHex(*(ComparePtr+i*2+1));
            ethernet_address[i] = (hex_h & 0xf0) | (hex_l & 0x0f);
	    }
		return TRUE;                                                     //第一次从FLASH读出时无须再拷贝
    } else if (com != UART_COM){                                         //只允许串口配置可修改MAC,
        return VALUE_KEEP;                                               //远程及WEB MAC地址不能修改                      
	}
    return (Copy_Config_Data(com,id,length));                            //拷贝修改的新内容到原处
}

/*
*****************************************************************************************************
*FUNC:  设置本地网卡地址
*NOTE:  改完网卡地址以后要写入到8019否会收不到数据
        //return VALUE_KEEP;
*****************************************************************************************************
*/
unsigned char Set_Local_Mac(unsigned char com) reentrant                       
{
    return(Parse_Mac(com, ID_LOCALMAC, my_ethernet_address.bytes));
}

/*
*****************************************************************************************************
*FUNC:  设置本地IP地址
*NOTE:  字符串化为10进制数据
	192在上位机显示就是192

	//Uart0Putf("\r\n长度=");PrintByte(length); 
	WP+LOCALIP=192.168.000.提示设置成功
*****************************************************************************************************
*/
unsigned char Set_Local_Ip(unsigned char com) reentrant          
{
    return(Parse_Ip(com, ID_LOCALIP, my_ip_address.bytes));
}


/*
*****************************************************************************************************
*FUNC:  设置服务端IP地址
*NOTE:  #define    3
*****************************************************************************************************
*/
unsigned char Set_Sever_Ip(unsigned char com) reentrant          
{
    return(Parse_Ip(com,ID_SEVERIP,my_ServerIP.bytes));
}

/*
*****************************************************************************************************
*FUNC:  设置服务端端口
*NOTE:  	
*****************************************************************************************************
*/
unsigned char Set_Sever_Port(unsigned char com) reentrant         
{
    return(Parse_Port(com,ID_SEVERPORT,Server_PORT.bytes));  
}

/*
*****************************************************************************************************
*FUNC:  设置网关IP地址
*NOTE:  #define ID_GETWAYIP  5  WP-GATEWAYIP
*****************************************************************************************************
*/
unsigned char Set_Gateway_Ip(unsigned char com) reentrant         
{
    return(Parse_Ip(com,ID_GETWAYIP,gateway_ip_address.bytes));
}

/*
*****************************************************************************************************
*FUNC:  子网掩码设置
*NOTE:   #define ID_MASKIP    6

	mask_ip_address.bytes[0] = 255;
	mask_ip_address.bytes[1] = 255;
	mask_ip_address.bytes[2] = 255;
	mask_ip_address.bytes[3] = 0;
*****************************************************************************************************
*/
unsigned char Set_Mask_Ip(unsigned char com) reentrant         
{
    return(Parse_Ip(com,ID_MASKIP,mask_ip_address.bytes));
}

/*
*****************************************************************************************************
*FUNC:  解析普通值
*NOTE:   
*****************************************************************************************************
*/
unsigned char Parse_Normal_Value(unsigned char com,unsigned char id,unsigned char maxlen)reentrant
{
	unsigned char length=0;
	unsigned char dotnum;

	if (com >= END_CHAR_NUM) {
        return COM_ERROR;
	}

    if ((ComparePtr == NULL) || (*ComparePtr == '\r') 
	   || (*ComparePtr == '\0') || (*ComparePtr == '&')) {           //ComparePtr指向匹配后的有效数据
        return VALUE_NULL;
	}

	if (Parse_Length(ComparePtr,maxlen,EndChar[com],&length) == FALSE) {  //网卡地址最大为12位,寻找结束符
        return LENGTH_ERROR;                                             //没找到结束符
	}

	if (id != ID_MODELID) {                                              //模块ID可灵活设置且可以为字符                                         
	    if (length != maxlen) {
            return LENGTH_ERROR;                                         //                    
	    } 

	    if (Parse_Value(ComparePtr,length,PARSE_OTHER_TYPE,&dotnum) == FALSE) {  //判断值是否在0-9之内,如果是IP统计'.'个数
            return VALUE_ERROR;
	    }
	}

	if ((id == ID_BAUDRATE) && ((*ComparePtr < '1') || (*ComparePtr > '7'))) { //1:1200  2:2400 3:4800 4:9600 5:19200 6:38400,7:57600 默认9600
        return VALUE_ERROR;
	} 

	if ((id == ID_HEARTTIME) && ((*ComparePtr < '1') || (*ComparePtr > '9'))) { 
        return VALUE_ERROR;
	}
 
	if ((id == ID_DHCPMODE) && ((*ComparePtr != '0') && (*ComparePtr != '1'))) {  //只能'0','1'
        return VALUE_ERROR;
	}
	
	if ((id == ID_COMC) && ((*ComparePtr != '0') && (*ComparePtr != '1')&& (*ComparePtr != '2'))) { 
        return VALUE_ERROR;	  // 0: NONE 1:OLD   2:EVEN
	}	

	return (Copy_Config_Data(com,id,length)); 
}

/*
*****************************************************************************************************
*FUNC:  产品ID
*NOTE:   
*****************************************************************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -