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

📄 config.c

📁 本程序是一个RS232转网口的。是一个透明传输的模块
💻 C
📖 第 1 页 / 共 3 页
字号:
/*
*****************************************************************************************************
*
*  File name: config.c
*****************************************************************************************************
*/
#include "..\head\includes.h"



/*
*****************************************************************************************************
*                        全局 
*****************************************************************************************************
*/
unsigned char code *code pBaudRate[7]   = {"1200","2400","4800","9600","19200","38400","57600"};
unsigned char code *code pHeartTime[9]  = {"1","2","3","4","5","6","7","8","9"};
unsigned char code *code pDhcpMode[2]   = {"手动配置模式",   "自动指派模式"};
         char code *code pComcBit[3]    = {"None","Odd","Even"};
unsigned int  code       vBaudRate[7]   = {1200,2400,4800,9600,19200,38400,57600};
unsigned int  code       vHeartTime[9]  = {60,120,180,240,300,360,420,480,540};


_FLASH_DATA_UNION_   xdata ConfigReg;
unsigned char xdata *xdata ComparePtr=NULL;
unsigned char xdata PingIpStr[16];
unsigned char xdata ModelIdBak[ID_MAX_LEN+1];
unsigned char xdata ComcBit=0;
unsigned long xdata OnLineTime=0;       //连续在线时间
unsigned int  xdata SentHeartTime=0;    //发送心跳包个数
unsigned char DHCPMode = 255;           //大于0表示是DHCP模式,=0表示是手动分配模式
bit ModelStatu;                         //配置态OR运行态

/*
*****************************************************************************************************
*                        函数说明,作为函数指针用
*****************************************************************************************************
*/



/*
*****************************************************************************************************
*                   配置信息来源
*****************************************************************************************************
*/
#define END_CHAR_NUM  4
#define UART_COM   0     //串口配置时,只保存字符串,不对字符串解析成HEX,DEC,须重启才有效 
#define HTTP_COM   1     //WEB配置时,只保存字符串,不对字符串解析成HEX,DEC  须重启才有效
#define READ_COM   2     //读出FALSH内容时对字符串的IP,MAC,PORT进行解析
#define REMOTE_COM 3     //远程配置时,只保存字符串,不对字符串解析成HEX,DEC 须重启才有效
char code EndChar[END_CHAR_NUM] ={'\r','&','\0','\r'}; //结束符


/*
*****************************************************************************************************
*FUNC: 这个配置表共被3个函数用到
*NOTE:  1:NetConfigInit()  用到前7个,因为保存在FALSH的信息是字符串,MCU初始化时须对其化为HEX或十进制数
        2:ParseUartCmd()   全部用到  解析串口来的数据
		3:ParseHttpCmd()   用到前7个 解析HTTP WEB 来的数据      
*****************************************************************************************************
*/
typedef struct _config_item_
{
    unsigned char *name;  
    unsigned char *string;                          //返回匹配的字符串
    unsigned char start;
    unsigned char (*exec_func)(unsigned char com);  //函数指针 ,com信息来源
}_CONFIG_ITEM_;


#define UART_CONFIG_NUM  16    //UART配置共有16个 
#define UART_QUERY_START 11     //查询命令从第11条开始
#define HTTP_CONFIG_NUM  11     //HTTP配置只有前11

_CONFIG_ITEM_ code ConfigTable[UART_CONFIG_NUM] =
{
    "本地网卡设置:\0"    , "WP-LOCALMAC="   , 12 ,(unsigned char*)Set_Local_Mac,
    "本地IP设置:\0"      , "WP-LOCALIP="    , 11 ,(unsigned char*)Set_Local_Ip, 
    "服务器IP设置:\0"    , "WP-SEVERIP="    , 11 ,(unsigned char*)Set_Sever_Ip,
    "服务器端口设置:\0"  , "WP-SEVERPORT="  , 13 ,(unsigned char*)Set_Sever_Port,
    "网关IP设置:\0"      , "WP-GATEWAYIP="  , 13 ,(unsigned char*)Set_Gateway_Ip,
    "子网掩码设置:\0"    , "WP-MASKIP="     , 10 ,(unsigned char*)Set_Mask_Ip,
	"模块ID设置:\0"      , "WP-ID="         , 6  ,(unsigned char*)Set_Model_Id,
	"波特率设置\0:"      , "WP-BAUD="       , 8  ,(unsigned char*)Set_BaudRate,
	"心跳包时间(分钟):\0", "WP-OHRT="       , 8  ,(unsigned char*)Set_Heart_Time,
	"IP分配模式:\0"      , "WP-DHCP="       , 8  ,(unsigned char*)Set_Dhcp_Mode,
	"校验位设置:\0"      , "WP-COMC="       , 8  ,(unsigned char*)Set_Comc  ,
										   
    "PING IP设置:\0"     , "WP-PINGIP="     , 10 ,(unsigned char*)Set_Ping_Ip  ,

	"日志查询:\0"        , "WP-LOG"         , 0  ,(unsigned char*)Query_Log  ,
	"查询网络配置:\0"    , "WP-LIST"        , 0  ,(unsigned char*)Query_Net_Config  ,
	""                   , "WP-DEFAULT"     , 0  ,(unsigned char*)Config_Default,  //恢复出厂值并重启:
    ""                   , "WP-RESET"       , 0  ,(unsigned char*)Mcu_Restart      //模块复位重启:
};

/*
*****************************************************************************************************
*                        函数说明,作为函数指针用
*****************************************************************************************************
*/
#define CONFIG_PARSE_NUM  11    //存EEPROM参数共10个
#define READ_PARSE_NUM    6     //需要解析的有几个,IP及端口号及MAC,就是要把

#define ID_LOCALMAC  0
#define ID_LOCALIP   1
#define ID_SEVERIP   2
#define ID_SEVERPORT 3
#define ID_GETWAYIP  4
#define ID_MASKIP    5

#define ID_MODELID   6    //不须要转换
#define ID_BAUDRATE  7    //不须要转换
#define ID_HEARTTIME 8    //不须要转换
#define ID_DHCPMODE  9    //不须要转换
#define ID_COMC      10   //不须要转换

#define ID_PINGIP    CONFIG_PARSE_NUM
#define ID_NETSTATU   12
#define ID_NETCONFIG  13

unsigned char xdata *xdata ConfigRegPtr[CONFIG_PARSE_NUM]=     //用来拷贝配置来的字符串信息
{
    ConfigReg.reg.LocalMacStr,    //本地网卡地址
    ConfigReg.reg.LocalIpStr,     //本地IP
	ConfigReg.reg.SeverIpStr,     //服务器IP
    ConfigReg.reg.SeverPortStr,   //服务器端口
    ConfigReg.reg.GetwayIpStr,    //网关IP
    ConfigReg.reg.MaskIpStr  ,    //子网掩码

	ConfigReg.reg.ModelIdStr,     //ID 号
    ConfigReg.reg.BautRateStr,    //波特率
    ConfigReg.reg.HeartTimeStr,   //心跳包间隔时间
	ConfigReg.reg.DhcpModeStr,    //DHCP模式是否开启
	ConfigReg.reg.WPCOMC		  //串口校验位
};


/*
*****************************************************************************************************
*FUNC:  参数出厂值
*NOTE:  
*****************************************************************************************************
*/
void ParameterInit(unsigned char type) reentrant
{
     
	sprintf(ConfigReg.reg.LocalIpStr,  "192.168.0.99\0"); 
	sprintf(ConfigReg.reg.SeverIpStr,  "192.168.0.244\0"); 
	sprintf(ConfigReg.reg.SeverPortStr,"8601\0"); 
	sprintf(ConfigReg.reg.GetwayIpStr, "192.168.0.254\0"); 
	sprintf(ConfigReg.reg.MaskIpStr,   "255.255.255.0\0");
    sprintf(ConfigReg.reg.ModelIdStr,  "90201234\0");
	sprintf(ConfigReg.reg.BautRateStr, "4\0");        //9600
	sprintf(ConfigReg.reg.HeartTimeStr,"2\0");        //2分钟
	sprintf(ConfigReg.reg.WPCOMC,"0");	              //0: 配置传输校验位,=0为无,=1为奇,=2为偶 */
        
	if (type == 1) {                    //本地配置软件出厂值重起,不改变MAC地址 
        sprintf(ConfigReg.reg.DhcpModeStr, "1\0");
	} else if (type == 20) {            //利用IO控制参数恢复出厂值时,IP为手动分配,不改变网卡地址
        sprintf(ConfigReg.reg.DhcpModeStr, "0\0"); 
	} else {                            //初次写FLASH,默认开启自动分配,要改变网卡地址
        sprintf(ConfigReg.reg.DhcpModeStr, "1\0"); 
        sprintf(ConfigReg.reg.LocalMacStr, "00ABCDEF0001\0"); 
	}	 
}

/*
*****************************************************************************************************
*FUNC: 配置初始化, 存在FALSH的是字符串信息,初始化时要化为相应的HEX或十进制数
*NOTE:  1:先读出FALSH内容,判断FirstRun是否被修改,
        2:已修改说明已配置过,对读出的字符串配置信息化为相应的HEX或十进制数
		3:如果FirstRun未被修改,说明是第一次读FALSH,先要进行参数出厂值

*****************************************************************************************************
*/
#define FIRST_RUN_VALUE   101
void NetConfigInit(void)reentrant
{
    unsigned char i;
	unsigned char writeflag=0;

	ReadFlash(ConfigReg.bytes,FLASH_DATA_NUM);               //读出各字符串信息

	if (ConfigReg.reg.FirstRun != FIRST_RUN_VALUE) {         //是不是第一次
	    ConfigReg.reg.FirstRun = FIRST_RUN_VALUE;            //是第一次   
        ParameterInit(0);                                    //参数初始化            
		writeflag=10;
	}

	for (i=0; i<READ_PARSE_NUM; i++) {           //解析须要解析的几个参数IP,MAC,PORT
        ComparePtr = ConfigRegPtr[i];
		if (ConfigTable[i].exec_func) {
			(*(ConfigTable[i].exec_func))(READ_COM);   
		}
	}

	// 将IP,MAC,PORT,各信息化为HEX或十进制数  但波特率及心跳包间隔时间,ID不被转换,因为这几个只用到字符串型    
    if ((ConfigReg.reg.BautRateStr[0] < '1') || (ConfigReg.reg.BautRateStr[0] > '7')) {
        ConfigReg.reg.BautRateStr[0] = '4';   //1:1200  2:2400 3:4800 4:9600 5:19200,6:38400,7:57600  默认9600
		ConfigReg.reg.BautRateStr[1] = 0;
		writeflag=10;
	} 

    if ((ConfigReg.reg.HeartTimeStr[0] < '1') || (ConfigReg.reg.HeartTimeStr[0] > '9')) {
        ConfigReg.reg.HeartTimeStr[0] = '2';  //1:1MIN  2:2MIN 3:3MIN 4:4MIN 5:MIN  默认2MIN
		ConfigReg.reg.HeartTimeStr[1] = 0;
		writeflag=10;
	}
    if ((ConfigReg.reg.WPCOMC[0] != '0') && (ConfigReg.reg.WPCOMC[0] != '1')
	                                     && (ConfigReg.reg.WPCOMC[0] != '2')) {
        ConfigReg.reg.WPCOMC[0] = '0';       // 0: NONE 1:OLD   2:EVEN
		ConfigReg.reg.WPCOMC[1] = 0;
		writeflag=10;
	}

	ComcBit = ConfigReg.reg.WPCOMC[0];

	if (ConfigReg.reg.DhcpModeStr[0] != '0') { //说明DHCP自动指派是开启状态
        DHCPMode = 1;
	} else {
        DHCPMode = 0;                          //DHCP关闭状态不需要做DHCP请求bBound为已连成功
		bBound   = TRUE;
	}

	HeartTimeOutBak = vHeartTime[ConfigReg.reg.HeartTimeStr[0]-0x31]-3; //减去3S误差	

	for (i=0; i<ID_MAX_LEN; i++) {
	    ModelIdBak[i] = ConfigReg.reg.ModelIdStr[i];       //取模块ID,保证设置参数后只有重起后数据才有效
	}
	ModelIdBak[ID_MAX_LEN] = 0;    
	
	if (writeflag > 0) {
       WriteFlash(ConfigReg.bytes,FLASH_DATA_NUM);         //有非法数据及第一次配置须重写入到FALSH 
	}
}


/*
*****************************************************************************************************
*FUNC:  参数出厂值
*NOTE:  
*****************************************************************************************************
*/
#define  DEFAULT_PIN_SEC   5000   //常低电平5秒恢复出厂值,IP为手动分配模式
void DefaultPin(void)
{
    static unsigned int xdata count=0;                      //如果该脚为低电平,10mS累加一次

    if (DEFAULT_PIN == 0) {
        if ((++count % 10) == 0) {                          //运行灯闪烁频繁
            RUN_LED =~RUN_LED;
		}
		if (count  >= (DEFAULT_PIN_SEC/10)) {
		    LED(CONNECT_LED,ON);
		    HintMsg(14,NULL);                               //提示恢复出厂值 
            ParameterInit(20);                              //参数初始化   
            ConfigReg.reg.FirstRun = FIRST_RUN_VALUE;       //下次上电按这次的出厂值运行
	        McuRst(SAVE_EXIT);
		}
	} else {
        count = 0;
	}
}

/*
*****************************************************************************************************
*                   根据ACKCODE取出相应的ACK提示信息      配置ACK类形
*****************************************************************************************************
*/
#define CONFIG_ACK_NUM  9

char code *code ConfigAckMsg[CONFIG_ACK_NUM]=
{
    "值为空不修改\0" ,
	"成功\0"          ,
    "值错误,失败\0"   ,
	"长度错误,失败\0" ,
	"提交失败\0"      ,
	"用户名错误\0"    ,
	"密码错误\0"      ,
	"该参数不可修改\0",
    "配置来源错误\0"  
};


void OutAckMsg(unsigned char ack, unsigned char code *name,unsigned char com)
{
    unsigned char xdata pack[100];
    unsigned char length=0;
    unsigned char *ptr;

    if (ack > (CONFIG_ACK_NUM-1)) {
       ack = CONFIG_ACK_NUM-1;
	}

	if (com == UART_COM) {                   //串口回显提示
	    Uart0Putf("\r\n");
        Uart0Putf(name);
	    Uart0Putf(ConfigAckMsg[ack]);
		Uart0Putf("\r\n");
	} else if (com == REMOTE_COM) {          //远程回显提示
		ptr = name ;
		while (*ptr) {
            pack[length++] = *ptr++;
		}
		ptr = ConfigAckMsg[ack] ;
		while (*ptr) {
            pack[length++] = *ptr++;
		}
        FramePush(pack,length);
	}
}

/*
*****************************************************************************************************
*FUNC: 
*NOTE:   
*****************************************************************************************************
*/
bit Parse_Length(unsigned char xdata *buf,unsigned char max_length,unsigned char endchar,unsigned char *len)
{
    unsigned char i;

    for (i=0; i<(max_length+1); i++) {
        if (*(buf+i) == endchar){
		    *len = i;                    //返回长度
            return TRUE;
		}
	}
	return FALSE;
}

/*
*****************************************************************************************************
*FUNC:
*NOTE:  
*****************************************************************************************************
*/
#define PARSE_OTHER_TYPE   0
#define PARSE_IP_TYPE      1
#define PARSE_MAC_TYPE     5


bit Parse_Value(unsigned char xdata *buf,unsigned char length,unsigned char parse_type,unsigned char *dot)
{
    unsigned char i;

	for (i=0; i<length; i++) {
	    if (parse_type == PARSE_IP_TYPE) {             //ip可以有个'.'
            if (((*(buf+i) < '0') || (*(buf+i) > '9')) && (*(buf+i) != '.')) {
                return FALSE;
			} else if (*(buf+i) == '.') {
                *dot+=1;                              //统计'.'个数,IP大于3个'.'说明值错误
			}
		} else if (parse_type == PARSE_MAC_TYPE) {    //可以有A-F,a-f,0-9
			if ( (*(buf+i) < '0') || ((*(buf+i) > '9') && (*(buf+i) < 'A')) || 
			     (*(buf+i) > 'f') || ((*(buf+i) > 'F') && (*(buf+i) < 'a')) ) {
                return FALSE;
		    }
		} else {
            if ((*(buf+i) < '0') || (*(buf+i) > '9')) {
                return FALSE;
			}
		}
	}
	return TRUE;
}

/*
*****************************************************************************************************
*FUNC:
*NOTE: 
; 
*****************************************************************************************************
*/
unsigned char Copy_Config_Data(unsigned char com,unsigned char id,unsigned char length)reentrant
{
    unsigned char i;

	//拷贝数据到缓冲,准备存入FALSH
	if (id < CONFIG_PARSE_NUM) {
	    for (i=0; i<length; i++) {

⌨️ 快捷键说明

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