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