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

📄 tcpapp.c

📁 是TCPIP程序
💻 C
字号:
/*2003.01.03 modi*/
/* 监听程序后一切重新开始*/
/* 串口接收修改为一种类似fifo的结构*/
/*在程序里面,判断是否主动报警,使用这样一种方法:如果已连接,则使用连接的,否则使用新的*/
//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     /* 可以忍受的最长的等待时间,单位是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 从串口上收到数据,要发送给网络*/
/*rxok 从网络上收到数据,要发送给串口*/
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',':'};/*子网掩码*/

uchar code  TCP_conf[]  ={'C','O','N','F','T','C','P',':'};
uchar code  UDP_conf[]  ={'C','O','N','F','U','D','P',':'};
/*如果有必要,在发送数据前设置*/

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);
 /*如果数据是设置本网络通的,不发送到串口,向网络发送设置成功,并初始化板卡*/

 if(curr_conf.length==13)
   {
      /*设置报警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;
       }


      /*设置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;
       }
      /*设置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;
       }
      /*设置网关*/
      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;
        }
       /*设置端口*/
      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;
        }
       /*设置波特率*/
      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;
        }
      /*设置物理地址*/
      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)/*数据量不可能超过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>0x4800)seristart = SERI_RECE_ADDR; /*到了末尾,重新开始*/
   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;/*这种现象最好不要出现,*/
    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];
   }
}


⌨️ 快捷键说明

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