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

📄 main.c

📁 完整的实现RS232与TCP/IP网络协议的转换
💻 C
字号:
#include "uip\uip.h"
#include "uip\uip_arp.h"
#include "rtl8019\rtl8019dev.h"
#include "serial.h"
#include <LCD\LCD.h>
#include <R8051.H>
#include "c51iic.h"
//#include "isd51.h"
sbit DebugPin=P1^3;
//------------parameters-----------------
// UIP_IPADDR: The IP address of this uIP node. 
UBYTE data UIP_IPADDR0 =    192;
UBYTE data UIP_IPADDR1 =     168;
UBYTE data UIP_IPADDR2 =     1;
UBYTE data UIP_IPADDR3 =     2;

// UIP_NETMASK: The netmask. 
UBYTE data UIP_NETMASK0 =   255;
UBYTE data UIP_NETMASK1 =   255;
UBYTE data UIP_NETMASK2 =   255;
UBYTE data UIP_NETMASK3 =   0;

// UIP_DRIPADDR: IP address of the default router. 
UBYTE data UIP_DRIPADDR0 =  192;
UBYTE data UIP_DRIPADDR1 =   168;
UBYTE data UIP_DRIPADDR2 =   1;
UBYTE data UIP_DRIPADDR3 =  18;

// UIP_ETHADDR: The Ethernet address. 
UBYTE data UIP_ETHADDR0  =  0x00; //'O'
UBYTE data UIP_ETHADDR1  =  0xe0; //'F'
UBYTE data UIP_ETHADDR2  =  0x4c; //'F'
UBYTE data UIP_ETHADDR3  =  0x03; //'I'
UBYTE data UIP_ETHADDR4  =  0x1d; //'C'
UBYTE data UIP_ETHADDR5  =  0x8e; //'E'

#if UIP_ACTIVE_OPEN
UWORD data REMOTE_IP[2]={0xc0a8,0x0108};
UWORD data REMOTE_PORT=1180;
#endif
//UWORD data APPport= 1180;
UBYTE data BaudRate= 0;
//port;
//-------------------------------------
//sbit SDA=P1^1;
sbit Wdog=P1^1;

sbit   LED_RED  = P3 ^ 3;	
sbit   LED_GRE  = P3 ^ 4; 
unsigned char count1=0;
bit active_connect=0;

#define BUF ((struct uip_eth_hdr *)&uip_buf[0])

#define WatchDog() Wdog=~Wdog

void InitTimer0(void) 
{
   // TMOD=TMOD&0xF0;
    TMOD=TMOD|0x01;    //模式1(16位定时器),仅受TR0控制
//    TH0=0x7d;    //Tick=100/s, 10ms evrey time
//    TL0=0xcb;    //OS_CPU_A.ASM  和  OS_TICKS_PER_SEC
//    TH0=0x3c;    //Tick, 15ms(40M) evrey time
//    TL0=0xb0;    //OS_CPU_A.ASM  和  OS_TICKS_PER_SEC
    TH0=0x2a;    //Tick, 20ms(32.768) evrey time
    TL0=0xab; 

    ET0=1;       //允许T0中断
    TR0=1;
}

void TcpIp_Init()
{
   uip_init();
   myapp_init();
   uip_arp_init();

   RTL8019dev_init();
}

void main(void)
{ 
    UBYTE i;
	 AUXR = 0x00 ;	 
     SCONF=0X03;
	 ES=0;
//   LCD_Initial();
//   LCD_print("MCU-WEB");
    Wdog=0;
//	 ISDinit ();        // initialize uVision2 Debugger and continue program run 
//	 ISDwait ();        // wait for connection to uVision2 Debugger
//--------------------------------------------
//	WatchDog();
    if(!DebugPin)goto xxxx;

	SubAddr=32;
	Number=5;//20;
	while( !IRcvStr(&Rec_data[0]) )  //读IP参数
	{
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
	}
	if((Rec_data[0]==0x55)&&(Rec_data[1]==0xaa))
	{

	 SubAddr=0;
	 Number=26;//20;
	 while( !IRcvStr(&Rec_data[0]) )  //读IP参数
	 { 
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
	 }
	//  InitSerial_0();
 	UIP_IPADDR0 = Rec_data[0];
	UIP_IPADDR1 = Rec_data[1];
	UIP_IPADDR2 = Rec_data[2];
	UIP_IPADDR3 = Rec_data[3];
	UIP_NETMASK0 = Rec_data[4];
	UIP_NETMASK1 = Rec_data[5];
	UIP_NETMASK2 = Rec_data[6];
	UIP_NETMASK3 = Rec_data[7];
	UIP_DRIPADDR0 = Rec_data[8];      //网关地址
	UIP_DRIPADDR1 = Rec_data[9];
	UIP_DRIPADDR2 = Rec_data[10];
	UIP_DRIPADDR3 = Rec_data[11]; 
	UIP_ETHADDR0 = Rec_data[12]; //'O'  //MAC
	UIP_ETHADDR1 = Rec_data[13]; //'F'
	UIP_ETHADDR2 = Rec_data[14]; //'F'
	UIP_ETHADDR3 = Rec_data[15]; //'I'
	UIP_ETHADDR4 = Rec_data[16]; //'C'
	UIP_ETHADDR5 = Rec_data[17]; //'E'
	*( (UBYTE *)(&APPport)   )= Rec_data[18]; //本地端口
	*( (UBYTE *)(&APPport)+1 )= Rec_data[19];
    #if UIP_ACTIVE_OPEN
	*( (UBYTE *)(REMOTE_IP)   )= Rec_data[20]; //远端IP
	*( (UBYTE *)(REMOTE_IP)+1 )= Rec_data[21];
	*( (UBYTE *)(REMOTE_IP)+2 )= Rec_data[22];
	*( (UBYTE *)(REMOTE_IP)+3 )= Rec_data[23];
	*( (UBYTE *)(&REMOTE_PORT)   )= Rec_data[24]; //远端PORT
	*( (UBYTE *)(&REMOTE_PORT)+1 )= Rec_data[25];
    #endif
   }
  else
  {
    xxxx:
     Rec_data[0]=	UIP_IPADDR0;
     Rec_data[1]=	UIP_IPADDR1 ;
     Rec_data[2]=	UIP_IPADDR2 ;
     Rec_data[3]=	UIP_IPADDR3 ;
     Rec_data[4]=UIP_NETMASK0 ;
     Rec_data[5]=	UIP_NETMASK1; 
     Rec_data[6]=	UIP_NETMASK2 ;
	 Rec_data[7]=UIP_NETMASK3 ;
     Rec_data[8]=  	UIP_DRIPADDR0 ;    //网关地址
     Rec_data[9]=	UIP_DRIPADDR1 ;
     Rec_data[10]=	UIP_DRIPADDR2;
     Rec_data[11]=	UIP_DRIPADDR3  ; 
     Rec_data[12]=	UIP_ETHADDR0 ; //'O'  //MAC
     Rec_data[13]=	UIP_ETHADDR1  ; //'F'
     Rec_data[14]=	UIP_ETHADDR2  ; //'F'
     Rec_data[15]=	UIP_ETHADDR3 ; //'I'
     Rec_data[16]=	UIP_ETHADDR4 ; //'C'
     Rec_data[17]= 	UIP_ETHADDR5; //'E'
     Rec_data[18]=	*( (UBYTE *)(&APPport)   ); //本地端口
     Rec_data[19]=	*( (UBYTE *)(&APPport)+1 );
     #if UIP_ACTIVE_OPEN
      Rec_data[20]=*( (UBYTE *)(REMOTE_IP)   ); //远端IP
      Rec_data[21]=	*( (UBYTE *)(REMOTE_IP)+1 );
      Rec_data[22]=	*( (UBYTE *)(REMOTE_IP)+2 );
	  Rec_data[23]=*( (UBYTE *)(REMOTE_IP)+3 );
	  Rec_data[24]=*( (UBYTE *)(&REMOTE_PORT)   ); //远端PORT
	  Rec_data[25]=*( (UBYTE *)(&REMOTE_PORT)+1 );
     #endif
	  SubAddr=0;
	  Number=16;
	while( !ISendStr(&Rec_data[0]) )  //写IP参数
	{
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
	}
	  SubAddr=16;
	  Number=10;
    while( !ISendStr(&Rec_data[16]) )  //写IP参数
	{
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
	 } 
     Rec_data[0]=0x55;
     Rec_data[1]=0xaa;
	 SubAddr=32;
	  Number=5;
    while( !ISendStr(&Rec_data[0]) )  //写IP参数
	{
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
		for(i=0;i<200;i++);
	 } 

  }

//-----------------------------------------------*/
	WatchDog();
//--------------------------------------------
   InitSerial_0();
 //  Uart0_printR(&Rec_data[0],26);
Uart0_print("start\n");
    TcpIp_Init();
//   LCD_print("main start\n");
//Uart0_print("main start\n");
    InitTimer0();
    EA=1;
    WatchDog();
    InitSerial_0();
	Rec_len=0;
    uip_connected=0;
	Rec_len=0;
            	dataRec_timecount=0;
            	data_Rec=0;
				active_connect=0;
    while(1)
     {   
	 // uip_ipaddr(REMOTE_IP, 192,168,1,8);
     // uip_connect(REMOTE_IP, 4096);
 
//	uip_connect(REMOTE_IP, REMOTE_PORT); //建立TCP连接
	    WatchDog();
         uip_len = RTL8019dev_poll();
		 if(uip_len)
		 {
      		 if(BUF->type == htons(UIP_ETHTYPE_IP))
       		 {
	           uip_arp_ipin();
	           uip_process(UIP_DATA);	           
	           if(uip_len > 0) // transmit a packet, if one is ready
	           {
	             uip_arp_out();
	             RTL8019dev_send();
	           }
      		 }     
     		 else if(BUF->type == htons(UIP_ETHTYPE_ARP))// process an ARP packet
		      {
		        uip_arp_arpin();     
		        if(uip_len > 0) // transmit a packet, if one is ready
		          RTL8019dev_send();
		      }

		  }
//----------------time out-------------------
		WatchDog();
	   if(count1>=50)  //50*20ms=1s;
	    {
			count1=0;
			//----------------------------------------
			//	Uart0_print("TimT\n");
	        for(i = 0; i < UIP_CONNS; ++i)
		    {
		       uip_periodic(i);
		       if(uip_len > 0)
	            {
	               uip_arp_out();
	               RTL8019dev_send();
	            }
	        }
	    }
//------------------end of time out-----------------------
//----------uart2tcp------------------------------------------
		WatchDog();

//dataRec_timecount=21;
       if(dataRec_timecount>=20)  //20*20ms=400ms
	   {
            if(uip_connected) //判断连接状态
			{
            	count1=0;
	        	for(i = 0; i < UIP_CONNS; ++i)
		    	{
		       		uip_periodic(i); //组织数据
		       		if(uip_len > 0)
	            	{
	               		uip_arp_out();
	               		RTL8019dev_send();  //发送
	            	}
	        	} 
            	Rec_len=0;
            	dataRec_timecount=0;
            	data_Rec=0;
				active_connect=0;
	   		}
			else
				if(dataRec_timecount>185) //100*20ms=2s
				{//Uart0_print("disc\n");
            		Rec_len=0;
            		dataRec_timecount=0;
            		data_Rec=0;
					active_connect=0;
				}
				else
				{
				#if UIP_ACTIVE_OPEN
                    if(!active_connect)
					{//Uart0_print("connect\n");
						active_connect=1;
						uip_connect(REMOTE_IP, REMOTE_PORT); //建立TCP连接
		       			uip_periodic(0);  //only one connect!
		       			if(uip_len > 0)
	            		{//Uart0_print("sendsyn\n");
	               			uip_arp_out();
	               			RTL8019dev_send();
	            		}
					}
				#else
            		Rec_len=0;
            		dataRec_timecount=0;
            		data_Rec=0;
					active_connect=0;
				#endif
				}
		}
//-----------------------------------------------------------
     }//while(1);

}


void Timer0(void)  interrupt 1
{
        TR0=0;
	    TH0=0x2a;    //Tick, 20ms(32.768) evrey time
	    TL0=0xab;
        TR0=1;

		count1++;
		if(data_Rec) dataRec_timecount++;
}

⌨️ 快捷键说明

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