?? tcpapp.bak
字號(hào):
/*2003.01.03 modi*/
/* 監(jiān)聽(tīng)程序后一切重新開(kāi)始*/
/* 串口接收修改為一種類似fifo的結(jié)構(gòu)*/
/*在程序里面,判斷是否主動(dòng)報(bào)警,使用這樣一種方法:如果已連接,則使用連接的,否則使用新的*/
//freedom about 4k
#define ETH_RECV_ADDR 0x1000
//about 2k
#define ETH_SEND_ADDR 0x1800
//about 2k
#define SERI_SEND_ADDR 0x2000
//about 4k
#define SERI_RECE_ADDR 0x3000
//about 8k
#define SOCKET_ADDR 0x5000
//about 12k
//#define REMO_PORT 8000
//#define LOCAL_PORT 9000
#define tcp_WAITTIMEOUT 60000 /* 可以忍受的最長(zhǎng)的等待時(shí)間,單位是10ms*/
#include <89c52.h>
#include <iptcp.h>
#include <card.h>
#include <x25045.h>
#include <8019app.h>
#include <dmtcp.h>
//dats in card.h
extern eth_address xdata card_mac;
extern ulong xdata gate_ip;
extern ulong xdata local_ip;
extern uint xdata REMO_PORT,LOCAL_PORT;
extern uint xdata baudrate;
extern uchar xdata *mac;
uchar xdata *rcv_hdr;
uchar xdata *recv_eth;
uchar xdata *send_eth;
uchar xdata *seristart;
uchar xdata *seriend;
uint data_send(uchar xdata *data_addr,uint len,uint local_port,ulong destip,uint remo_port);
bit txok,rxok;
/*txok 從串口上收到數(shù)據(jù),要發(fā)送給網(wǎng)絡(luò)*/
/*rxok 從網(wǎng)絡(luò)上收到數(shù)據(jù),要發(fā)送給串口*/
uchar ser_recving;
tcp_Socket xdata *s;
uchar code setsip[]={'S','E','T','S','I','P',':'};
uchar code setsal[]={'S','E','T','S','A','L',':'};
uchar code setsma[]={'S','E','T','S','M','A',':'};
uchar code setsgt[]={'S','E','T','S','G','T',':'};
uchar code setspt[]={'S','E','T','S','P','T',':'};
uchar code setsbd[] ={'S','E','T','S','B','D',':'};
uchar code setmask[] = {'S','E','T','S','M','K',':'};/*子網(wǎng)掩碼*/
uchar code TCP_conf[] ={'C','O','N','F','T','C','P',':'};
uchar code UDP_conf[] ={'C','O','N','F','U','D','P',':'};
/*如果有必要,在發(fā)送數(shù)據(jù)前設(shè)置*/
uchar code setok[10]={'S','E','T','S','B','E','O','K',0x0d,0x0a};
uchar code err[5]={'E','R','R',0x0d,0x0a};
int main(void)
{
uchar xdata *datasend;
uchar idata temp;
uint idata tempint;
watchdog(3);//no dog
// writebyte(0,0);
datasend = 0;
txok=FALSE;
rxok=FALSE;
memset(datasend,0,0x8000);
mac=0;
s =SOCKET_ADDR;
datasend=SERI_RECE_ADDR;
recv_eth=ETH_RECV_ADDR;
rcv_hdr =ETH_RECV_ADDR-SIZE_OF_8019_HDR;
send_eth=ETH_SEND_ADDR;
init_card(); //card.h
init_8019(); //8019app.h
com_init(); //card.h
timer0_init_10ms();//time.h
EA=1;
tcp_listen(LOCAL_PORT);
while(1)
{
tick();
if(txok)
{
cope_serial();
}
if((!rxok)&&(curr_conf.length!=0))
{
cope_eth();
}
}
}
uint data_send(uchar xdata *data_addr,uint len,uint local_port,ulong destip,uint remo_port)
{
// if(curr_conf.type==UDP_PROTO)return(udp_out(len,data_addr,destip,remo_port));
if ( s->hisaddr != destip )
{
tcp_abort();
}
if ( s->state != tcp_StateESTAB )
{
destip=alert_ip;
remo_port=REMO_PORT;
if ( !tcp_open(local_port,destip,remo_port ))return(0);
if ( !sock_wait_established(tcp_LONGTIMEOUT))return(0);
}
if ( !tcp_write(data_addr,len))return(0);
while(s->datalen)
{
tick();
if(!chk_timeout(tcp_TIMEOUT))break;
}
if((s->state==tcp_StateCLOSED)||(s->state==tcp_StateLISTEN))return(FALSE);
return(len-s->datalen);
}
void cope_eth(void)
{
uchar xdata *addr;
uchar xdata *f_addr;
uchar temp;
addr=SERI_SEND_ADDR;
f_addr=SERI_RECE_ADDR;
memcpy(f_addr,setok,10);
/*如果數(shù)據(jù)是設(shè)置本網(wǎng)絡(luò)通的,不發(fā)送到串口,向網(wǎng)絡(luò)發(fā)送設(shè)置成功,并初始化板卡*/
if(curr_conf.length==13)
{
/*設(shè)置報(bào)警ip*/
if(memcmp (setsal, addr, 7)==0)
{
udp_out(10,f_addr,curr_conf.dst_ip,REMO_PORT);
tcp_abort();
for(temp=0;temp<4;temp++)
{
writebyte(addr[temp+7],temp+25);
}
init_card();
curr_conf.length=0;
tcp_listen(LOCAL_PORT);
rxok=FALSE;
return;
}
/*設(shè)置ip*/
if(memcmp (setmask, addr, 7)==0)
{
udp_out(10,f_addr,curr_conf.dst_ip,REMO_PORT);
tcp_abort();
for(temp=0;temp<4;temp++)
{
writebyte(addr[temp+7],temp+29);
}
init_card();
curr_conf.length=0;
tcp_listen(LOCAL_PORT);
rxok=FALSE;
return;
}
/*設(shè)置ip*/
if(memcmp (setsip, addr, 7)==0)
{
udp_out(10,f_addr,curr_conf.dst_ip,REMO_PORT);
tcp_abort();
for(temp=0;temp<4;temp++)
{
writebyte(addr[temp+7],temp+5);
}
init_card();
curr_conf.length=0;
tcp_listen(LOCAL_PORT);
rxok=FALSE;
return;
}
/*設(shè)置網(wǎng)關(guān)*/
if(memcmp (setsgt, addr, 7)==0)
{
udp_out(10,f_addr,curr_conf.dst_ip,REMO_PORT);
tcp_abort();
for(temp=0;temp<4;temp++)
{
writebyte(addr[temp+7],temp+9);
}
init_card();
curr_conf.length=0;
tcp_listen(LOCAL_PORT);
rxok=FALSE;
return;
}
/*設(shè)置端口*/
if(memcmp (setspt, addr, 7)==0)
{
udp_out(10,f_addr,curr_conf.dst_ip,REMO_PORT);
tcp_abort();
for(temp=0;temp<4;temp++)
{
writebyte(addr[temp+7],temp+19);
}
init_card();
curr_conf.length=0;
tcp_listen(LOCAL_PORT);
rxok=FALSE;
return;
}
/*設(shè)置波特率*/
if(memcmp (setsbd, addr, 7)==0)
{
udp_out(10,f_addr,curr_conf.dst_ip,REMO_PORT);
tcp_abort();
writebyte(addr[7],23);
writebyte(addr[8],24);
// init_card();
curr_conf.length=0;
baudrate = addr[7]*0x100+addr[8];
com_init();
// tcp_listen(LOCAL_PORT);
rxok=FALSE;
return;
}
/*設(shè)置物理地址*/
if(memcmp (setsma, addr , 7)==0)
{
udp_out(10,f_addr,curr_conf.dst_ip,REMO_PORT);
tcp_abort();
for(temp=0;temp<6;temp++)
{
writebyte(addr[temp+7],temp+13);
}
curr_conf.length=0;
rxok=FALSE;
init_card();
init_8019();
tcp_listen(LOCAL_PORT);
return;
}
}
totalnum=curr_conf.length;
sendnum=0;
SBUF=addr[0];
rxok=TRUE;
while(rxok);
}
void cope_serial(void)//see type of serial datas
{
ulong xdata dst_ip;
uint bufnum;
ES = 0;
bufnum = recenum;
recenum = 0;
if(seriend>0x4800)seriend = SERI_RECE_ADDR;/*早變換早安全*/
ES = 1;
ser_recving=FALSE;
if(bufnum>0x1800)/*數(shù)據(jù)量不可能超過(guò)6K*/
{
seriend =SERI_RECE_ADDR;
seristart = SERI_RECE_ADDR;
bufnum = 0;
return;
}
/*將tcp_conf 和udp_conf一段去掉了*/
if(!data_send(seristart,bufnum,LOCAL_PORT,curr_conf.dst_ip,REMO_PORT))
{
// memcpy(f_addr,err,5);
// totalnum=5;
// sendnum=0;
// SBUF=f_addr[0];
}
seristart = seristart + bufnum;
if(seristart>seriend)seristart = SERI_RECE_ADDR; /*到了末尾,重新開(kāi)始*/
bufnum=0;
txok=FALSE;
}
void serial(void) interrupt 4
{
uchar xdata *addr;
if(RI==1)
{
// if(txok)
// {
//
// RI=0;return;
// }
RI = 0;
ser_recving=1;
*(seriend++)=SBUF;
recenum++;
if(seriend>=SOCKET_ADDR)seriend = SERI_RECE_ADDR;/*這種現(xiàn)象最好不要出現(xiàn),*/
if(recenum>1500)txok = 1;
}
if(TI==1)
{
addr=SERI_SEND_ADDR;
TI=0;
sendnum++;
if(sendnum>=totalnum)
{
s->sending=FALSE;
curr_conf.length=0;
rxok=FALSE;
}
else SBUF=addr[sendnum];
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -