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

📄 ip.c

📁 查询和下发IP查询和下发IP查询和下发IP查询和下发IP查询和下发IP
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "c:\TP850_C\inc\Bio_Func.h"
#include "c:\TP850_C\inc\key.h"
#include <STDIO.H>
#include <STRING.H>	
#include <stdlib.h>



#define CHINESEMODE	1
#define ENGLISHMODE	0

#define NORMALCOLOR 1
#define NONECOLOR   0


#define BAND        1200                 //波特率
#define CONTROL     0x09                 //8位偶校验,1位停止位
#define PORT        1                    //有线口
#define INFRARED    2                   //红外口


/****************************主菜单函数声明****************************/
U8 menu_tst(void);

/*************************菜单子目录实现函数声明*************************/
U8 m_ip(void);//菜单IP及端口
U8 m_add(void);//菜单终端地址
U8 m_xuni();//虚拟专用网设置
U8 m_maichong();//终端脉冲配置参数
U8 m_chaobiao();//抄表间隔
U8 m_canshu();//测量表基本参数
U8 m_commuicate();//通讯方式
U8 m_close();//关机
void m_ipdisplay(void);
void m_adddisplay(void);
void m_commuicatedisplay(void);
void m_xunidisplay(void);
void m_maichongdisplay(void);
void m_chaobiaodisplay(void);
void m_canshudisplay(void);
U8 m_commuicate(void);//菜单通讯方式
U8 m_command(void);//对命令子菜单的处理
void receive_data(void);
void _commanddisplay(U8 *buf,U16 len );
/*************************命令子菜单目录实现函数声明********************/
void m_call(void);//招测命令
void m_callip(void);
void _convertip(U8 *buf);
void m_callxuni(void);
void m_callmaichong(void);
void m_callchaobiao(void);
void m_callcanshu(void);

void m_set(void);//下发命令
void m_return(void);//返回命令
void m_setip(void);//下发IP命令

/*****************************全局变量定义*****************************/
S16 m_menuid;//主菜单选项索引
S16 m_submenuid;//子菜单选项索引
S16 m_commuicatemenuid=2;//通讯方式菜单,默认选择红外线通讯
U8 str[16][64];//用于存放每行输入的字符,其中一维下标为行号
U8 len_str;//输入字符个数的最大值 
U8 linelen[16];//数组中存放的是每行对应的输入字符串长度,数组下标是当前的行号

/*****************************帧数据包格式*****************************/
U8 Add[6][64];//存放用户输入的终端地址和区化码,用于显示

U8 A[5];//地址域
U8 A10;//行政区划码
U8 A11;//行政区划码
U8 A2[2];//终端地址
U8 A3;//主站地址和组地址标志

U8 red=0xfe;//红外线发送标志
U8 start=0x68;//起始字符
U8 lenth[2];//长度
U8 C;//控制域
U8 AFN;//应用层功能码
U8 SEQ;//帧序列域

U8 Data[2000];
U8 DA[2];//由信息点标识
U8 DA1;//信息点元
U8 DA2;//信息点组
U8 DT[2];//信息类
U8 DT1;//信息类元
U8 DT2;//信息类组
U8 AUX[];//附加信息域
U8 PW[2];//密码
U8 EC[2];//事件计数器
U8 EC1;//重要事件计数器
U8 EC2;//一般事件计数器
U8 Tp[6];//时间标签
U8 PFC;//启动帧帧序号计数器
U8 CS;//帧校验和
U8 end=0x16;//结束符

/****************************其他函数声明****************************/
void _PutString( U8 x,U8 y,U8 *string )
{
	_gotoxy(y,x);
	_putstr(string);
}
U16 _keytoadd()//输入的字符转化为十进制
{
	U8 i;
	U16 number=0;
 	for(i=0;i<linelen[0];i++)
	{
	   number=number*10+str[0][i];
	}
  return number;  
}
void _decimaltohex(U16 num)//十进制转化为十六进制
{
	U8 i=0;
	U8 ad[6];
	do
  { 
  	ad[i]=num%16;
    num=num/16;
    i++;
  }while (num);
  A2[0]=ad[1];
  A2[0]=ad[0]+A2[0]*16;
  A2[1]=ad[3];
  A2[1]=ad[2]+A2[1]*16;
}
U8 Numbertokey(U8 num)//把字符转化为对应的键盘的码值
{
		switch(num)
		{
	 	 case 0 : return 48;
			break;
		 case 1 : return 49;
			break; 
		 case 2 : return 50;
			break;
		 case 3: return 51;
			break;
		 case 4 : return 52;
			break;
		 case 5 : return 53;
			break;
		 case 6 : return 54;
			break;
		 case 7 : return 55;
			 break;
		 case 8 : return 56;
		   break;
		 case 9 : return 57; 
			 break;
		 default : 
		 	return num;
		}
}
U8 Keytonumber(U8 keycode)//把键盘的码值转化为对应的字符
{
		switch(keycode)
		{
	 	 case 48 : return 0;
			break;
		 case 49 : return 1;
			break; 
		 case 50 : return 2;
			break;
		 case 51 : return 3;
			break;
		 case 52 : return 4;
			break;
		 case 53 : return 5;
			break;
		 case 54 : return 6;
			break;
		 case 55 : return 7;
			 break;
		 case 56 : return 8;
		   break;
		 case 57 : return 9; 
			 break;
		 default : 
		 	return keycode;
		}
}
U8 _getadd(void)
{ 
	U16 kk;
	U8 i,j;
	U8 s[6][64];
  for(i=0;i<6;i++)
   for(j=0;j<64;j++)
  {
  	Add[i][j]=NULL;
  }
  kk=_keytoadd();
  for(i=0;i<linelen[0];i++)
   sprintf(s[i],"%d",str[0][i]);
  for(i=0;i<linelen[0];i++)
    strcat(Add[0],s[i]);
  for(i=0;i<linelen[1];i++)
   sprintf(s[i],"%d",str[1][i]);
  for(i=0;i<linelen[1];i++)
    strcat(Add[1],s[i]);
  for(i=0;i<linelen[2];i++)
   sprintf(s[i],"%d",str[2][i]);
  for(i=0;i<linelen[2];i++)
    strcat(Add[2],s[i]);
  _decimaltohex(kk);
 	A11=str[1][0];//行政区划码
  A11=A11*16+str[1][1];
  A10=str[2][0];
  A10=A10*16+str[2][1];
  A3=0x00;//主站地址和组地址标志
  A[0]=A10;
  A[1]=A11;
  A[3]=A2[1];
  A[2]=A2[0];
  A[4]=A3;
  return 1;
}                                                                      
/************************************************************************/
U8 string_key(U8 linecnt)
{
  U8 i;
  S16 Key;             //接收键盘输入的键值
	U8 line=0;
	U8 flag[16];//每行是否能修改的标志,如果为0能修改,为1则不能修改
	
	for(i=0;i<16;i++)
	{
		flag[i]=0;
	}
	while(1)
	{
			Key = _bioskey(0); 
		
		//若按退出键则返回NULL,调用函数判断若为0,则跳出函数
		if (Key == ESC)			return 0;
		
		//输入ENTER表示字符串输入结束
		if (Key == ENTER)
		{
		  if(m_submenuid==1)
		  {
		  	if(m_menuid==1)
		  	{
		  	 receive_data();
		  	 break;
		  	}
		  	if(m_menuid==2)
		  	{
		  	  if(_getadd())
          _PutString(6, 0, "地址设置成功.....\n");//第0行
		    }
	    }
	  }
			
		if(Key ==DOWN)//按向下键,换下一行输入
     {
     	  flag[line]=1;//上一行不能再被修改
     	  if(line<linecnt)
     	    line++;
     	  else
     	 	{
     	 	  line=linecnt;
     	 	}
     	 	if(m_menuid==1)//IP地址及端口
     	 	{
     	 	 	if(line%2)
     	 		  _gotoxy(8,line);//光标指向下一行输入
     	 		else 
     	 		  _gotoxy(5,line);//光标指向下一行输入
     	 	}
     	 	else if(m_menuid==2)//终端地址设置
        {
      	  _gotoxy(10,line);//光标指向下一行输入
        } 
        else if(m_menuid==3)
        {
        	_gotoxy(7,line);//光标指向下一行输入
        }
        else if(m_menuid==4)
        {
      	 _gotoxy(9,line);//光标指向下一行输入
        }
        else if(m_menuid==5)
        {
      	  _gotoxy(13,line);//光标指向下一行输入
        }
       else if(m_menuid==6)
       {
      	_gotoxy(15,line);//光标指向下一行输入
       }
     	 	 continue;
      }
     if(Key == UP)
     {
     	flag[line]=1;//下一行不能再被修改
       if(line>0)
        line--;
       else
        line=0;
     if(m_menuid==1)//IP地址及端口
      {
       if(line%2)
     	  _gotoxy(8,line);//光标指向下一行输入
     	 else 
     	 	_gotoxy(5,line);//光标指向下一行输入
      }
      else if(m_menuid==2)//终端地址设置
      {
     	  _gotoxy(10,line);//光标指向下一行输入
     	}
      else if(m_menuid==3)
      {
       	_gotoxy(7,line);//光标指向下一行输入
      }
      else if(m_menuid==4)
      {
      	_gotoxy(9,line);//光标指向下一行输入
      }
      else if(m_menuid==5)
      {
      	_gotoxy(13,line);//光标指向下一行输入
      }
      else if(m_menuid==6)
      {
      	_gotoxy(15,line);//光标指向下一行输入
      }
     	 continue; 
     }
   	//删除键
		if (Key == DEL )
		{
			if(!flag[line])
			{
			  if( linelen[line] >0)
		    {
			   linelen[line]--;
			   str[line][linelen[line]] = 0;
			   _putch(Key);
			   continue;
		    }
		   else
		   {
		 	   continue;
		   }
		  }
		 else
		 	continue;
		}
	 if(flag[line])
	 {
		 //记入并输出按键
	  if(m_menuid==1)//IP地址及端口
    {
     if(line%2)
 	 	  _gotoxy(8+linelen[line],line);//光标指向下一行输入
   	 else 
      _gotoxy(5+linelen[line],line);//光标指向下一行输入
    }
    else if(m_menuid==2)//终端地址设置
    {
      _gotoxy(10+linelen[line],line);//光标指向下一行输入
    } 
    else if(m_menuid==3)
    {
    	_gotoxy(7+linelen[line],line);//光标指向下一行输入
    }
    else  if(m_menuid==4)
    {
    	_gotoxy(9+linelen[line],line);//光标指向下一行输入
    }
    else  if(m_menuid==5)
    {
    	_gotoxy(13+linelen[line],line);//光标指向下一行输入
    }
    else  if(m_menuid==6)
    {
    	_gotoxy(15+linelen[line],line);//光标指向下一行输入
    }
    while(linelen[line]>0)
		 {
		 	_putch(DEL);
		 	linelen[line]--;
		 }
		 linelen[line]=0;
		 for(i=0;i<16;i++)
		   str[line][i] = 0;
     flag[line]=0;
   }
	 if(linelen[line]<len_str)
   {
    	_putch(Key);
      str[line][linelen[line]] = Keytonumber(Key);
  	  linelen[line]++;
 	 }
	 else
	 {
	 	 str[line][linelen[line]] = 0;
		 linelen[line]=len_str;
   }
	
 }
	return 1;
}
void _initvar(void)//初始化变量
{
	U8 i,j;
	len_str=14;//最多输入15个字符
	for(i=0;i<16;i++)
	{
		linelen[i]=0;//存入每行输入的字符个数,其中下标为行号
	}
	for(i=0;i<16;i++)
	 for(j=0;j<64;j++)
	{
		str[i][j]=0;
	}
}
void _initcom(void)//初始化端口
{

  _setcommode(0);
	_com_init(1, BAND, CONTROL);	
}

void com_sendread(U8 *buf,U16 *len)//从端口发送数据
{
	_com_send_buf(buf,len);
}

void _senddata(U8 lenth0[2],U8 AFN0,U8 C0,U8 SEQ0,U8 Data0[],U16 dacnt,U8 AUX0[],U8 acnt)
{
	U8 Senddata[100];
	U8 i;
	U16 n;
	U16 len;//要发送数据的长度
	U8 Head[6];
	
  _initcom();	
	Head[0]=0x68;
	Head[1]=lenth0[0];
	Head[2]=lenth0[1];
	Head[3]=lenth0[0];
	Head[4]=lenth0[1];
	Head[5]=start;
	for(i=0;i<3;i++)
	{
		Senddata[i]=0xfe;
	}
	for(i=3;i<9;i++)
	{
		Senddata[i]=Head[i-3];
	}
	Senddata[9]=C0;
	
	for(i=0;i<5;i++)
	{
		Senddata[10+i]=A[i];
	}
	Senddata[15]=AFN0;
	Senddata[16]=SEQ0;
	i=0;
	while(i<dacnt)
	{
		Senddata[17+i]=Data0[i];
		i++;
	}
	n=i+17;
	i=0;
	while(i<acnt)
  {
    Senddata[n]=AUX0[i];
  	n++;
  	i++;
  }
 CS=0;
 for(i=9;i<n;i++)
 {
   CS=CS+Senddata[i];
 }
   Senddata[n]=CS;
    n++;
   Senddata[n]=0x16;
  len=n+1;
  _com_send_buf(Senddata,&len);
  _flushcom();
}

S16 _convertdata(U16 n,U16 max_time)
//n 为要接收的数据长度,max_time连续两个字符的最多等待时间
{
	U8 buf[1000];
	U8 bb[1000];

	U8 s[10][50];
  U8 da1[2],da2[2];//端口的高低地址
	U16 duan;//存放端口地址
	U16 len;
	U16 i=0; 
  U16 m=0;
	S16 receive=1;
	 
	receive=_com_read_buf(buf,&len,n,max_time);

	if(receive==1)
	{
		return receive;
	}
	else if(receive==0)
	{
	  while(i<len)
    {
     if(buf[i]==104)//0x68
     {
  		 break;
     }
  	 i++; 		
    }
   if(i<len)
 	 {
 		receive=0;
   }
   else 
 	 {
    receive=1;
    return receive;
   }
   while(i<len) 
   {
    bb[m]=buf[i];	
    m++;
    i++;
   }
   lenth[0]=bb[1];
   lenth[1]=bb[2];
   C=bb[6];//控制域
   AFN=bb[12];//应用层功能码
   SEQ=bb[13];//帧序列域 
   for(i=14;i<44;i++)
   {
    Data[i-14]=bb[14+i];
   }
   sprintf(s[0],"%d",bb[18]);
   strcpy(s[1],".");  
   sprintf(s[2],"%d",bb[19]); 
   strcpy(s[3],".");   
   sprintf(s[4],"%d",bb[20]); 
   strcpy(s[5],".");   
   sprintf(s[6],"%d",bb[21]); 
 
   for(i=1;i<7;i++)
   {
   	  strcat(s[0],s[i]);
   }
   strcpy(str[0],s[0]);
   for(i=0;i<16;i++)
   {
     sprintf(s[i],"%c",bb[42+i]);
   }
   for(i=1;i<16;i++)
   {
     strcat(s[0],s[i]);
   }
   strcpy(str[8],s[0]);
   da1[0]=bb[22]%16;
   da1[1]=bb[22]/16;
   da2[0]=bb[23]%16;
   da2[1]=bb[23]/16;
   duan=da2[1]*16*16*16+da2[0]*16*16+da1[1]*16+ da1[0];
   sprintf(str[1],"%d",duan);
  _flushcom();
	return receive;//0为接收到至少一个数据
  }
}
void _convertip(U8 *buf)

⌨️ 快捷键说明

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