📄 config.c
字号:
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 + -