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

📄 main.c

📁 嵌入式TCP/IP模块
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "config.h"
#include "../include/cfg_net.h"
#include "../include/main.h"

void printf (const char *fmt, ...)
{
      u8 i,length=0;
      for(i=0;*fmt!=0x00;i++,length++)
      {
             uart0.SendBuf[i]=*fmt;                          
             if(*fmt=='\n')
             {
                i++;
                uart0.SendBuf[i]='\r';  
                length++;           
             } 
             fmt++;             
      }        
      uart0.SendIndex=0;	
      uart0.SendLength=length;    
      U0THR=uart0.SendBuf[uart0.SendIndex];  
}
/************************************************************/
 int main (void)
{
    PINSEL0 = (0x00000005)|(0x03<<18);      //P0.0 P0.1用作UART
    PINSEL1 = 0x00000000;      //其余为GPIO
  
	ReadModuleP();     // 读参数
    SetNetPort();  
	InitializeInterrupt();        
	InitNic(0);			//RTL8019芯片初始化,在global.c中定义
	
	//WDTC  =27662592;  //2s
	//WDMOD =0X03;
	
	printf("Start OK!\n");	
    while(1)
    {
         if(WorkMode==CLIENTHOST)        //TCP客户端
             ClientHostProcess();
               
         if(WorkMode==SERVERHOST)             //tcp 服务器
             ServerHostProcess();

         if(WorkMode==UDPHOST)   //UDP 模式
             UDPHostProcess();

     }    
     return 0;
}



/*======================================================================================
UDP 服务器的功能函数

=======================================================================================*/
/****************************************************/
void UDPHostProcess (void)
{
     uint16 i;
     InitialPort();
     while(WorkMode==UDPHOST)
     {
         // WdtFeed();
          if(Rec_Packet()!=0) 
          if(Rec_Ethernet_Packed(&REC_BUFF[0].bytes[4],0)==2)       //  
          {
              i=IP_PROCESS(&REC_BUFF[0].bytes[18],0);
              switch(i)
              {
                  case 'U':
                  if(UDP_Check(UDPSocket,&RECQ[0])!=0)  
                  {
                   for(i=0;i<udprelength;i++)
                          uart0.SendBuf[i]=UdpRecBuff[0].udpdata[i];     
                   uart0.SendIndex=0;	
                   uart0.SendLength=udprelength;    
                   U0THR=uart0.SendBuf[uart0.SendIndex];  
                  }
                  break;
                  case 'T':     
                  Process_Tcp1((Rec_Ptr *)&RECQ[0]);      
                  if(TcpStatus[0].State==TCP_STATE_ESTABLISHED)  
                  {
                      if(TcpRecFlag&&(TcpRecLength>0))
                      {      
                          if(TcpStatus[0].My_Port==80)                        
                                 HttpProcess(&TcpStatus[0].TcpDataQ[0]);      //设置端口不发送             
                          TcpRecFlag=0;
                          TcpRecLength=0;                 
                      }              
                  }  
                  break;
                  default:
                      break ;                                      
                };//end of switch
           }     
           if(uart0.ReFinished==1)  //RS32接收标记
           {
               for(i=0;i<uart0.ReLength;i++)
                   UdpSendBuff[0].Udp.udpdata[i]=uart0.ReBuf[i];
               UdpSendBuff[0].Udp.length=uart0.ReLength;
               UDPsend(&UdpSendBuff[0]); 
               uart0.ReFinished=0;      
           }
     }     
}

/*======================================================================================
TCP 服务器的功能函数

=======================================================================================*/
/****************************************************/
void ServerHostProcess (void)
{  
    uint16 i;
    InitializeServer();
    while(WorkMode==SERVERHOST)    
    {  
         WdtFeed();                
         if(Rec_Packet()!=0) 
         if(Rec_Ethernet_Packed(&REC_BUFF[0].bytes[4],0)==2)       //       
         if(IP_PROCESS(&REC_BUFF[0].bytes[18],0)=='T')   
         {         
             Process_Tcp1((Rec_Ptr *)&RECQ[0]);
         }                       
         if(TcpStatus[0].State==TCP_STATE_ESTABLISHED)  
         {
                if(TcpRecFlag&&(TcpRecLength>0))
                {    
                       if(TcpStatus[0].My_Port==80)                         
                          HttpProcess(&TcpStatus[0].TcpDataQ[0]);      //设置端口不发送  
                       else
                       {
                           for(i=0;i<TcpRecLength;i++)
                              uart0.SendBuf[i]=TcpStatus[0].TcpDataQ[i];     
                           uart0.SendIndex=0;	
                           uart0.SendLength=TcpRecLength;    
                           U0THR=uart0.SendBuf[uart0.SendIndex];           
                           //send(0,&TcpStatus[0].TcpDataQ[0], TcpRecLength, 0);   //通信端口
                       }                        
                       TcpRecFlag=0;
                       TcpRecLength=0;                                    
                }
                if(uart0.ReFinished==1)  //RS32接收标记
                {
                      send(0,&uart0.ReBuf[0], uart0.ReLength, 0); 
                      uart0.ReFinished=0;      
                }
                 
          }              
    }
}



/*======================================================================================
TCP 客户端的功能函数

=======================================================================================*/
/****************************************************/
void ClientHostProcess (void)
{
    uint16 j;
    LastData.State=FALSE;
    while(WorkMode==CLIENTHOST)
    {
         WdtFeed();
         if(TcpStatus[0].State<=TCP_STATE_LISTEN)
         {
             j=InitializeClient();    
             ConTimer=0;                               //重新开始计时     
             if(j=='A')
                ConTimer=REPEAT_CON_TIMER-40;          //两秒钟后重发连接命令,第一次发ARP COMMAND
         }
         if(TcpStatus[0].State!=TCP_STATE_ESTABLISHED)
         {  
               if(ConTimer>=REPEAT_CON_TIMER)            //20秒钟后重发连接命令                
                    TcpStatus[0].State=TCP_STATE_CLOSED;      
         }   
         if(Rec_Packet()!=0) 
         if(Rec_Ethernet_Packed(&REC_BUFF[0].bytes[4],0)==2)       //       
         if(IP_PROCESS(&REC_BUFF[0].bytes[18],0)=='T')     
         {
               Process_Tcp1((Rec_Ptr *)&RECQ[0]);
         }            
         if(TcpStatus[0].State==TCP_STATE_ESTABLISHED)  
         {
               if(TcpRecFlag&&(TcpRecLength>0))
               {    
                       if(TcpStatus[0].My_Port==80)                         
                          HttpProcess(&TcpStatus[0].TcpDataQ[0]);      //设置端口不发送  
                       else
                       {   
                            for(j=0;j<TcpRecLength;j++)
                                uart0.SendBuf[j]=TcpStatus[0].TcpDataQ[j];            
                            uart0.SendIndex=0;	
                            uart0.SendLength=TcpRecLength;    
                            U0THR=uart0.SendBuf[uart0.SendIndex]; 
                       }           
                       TcpRecFlag=0;
                       TcpRecLength=0;                 
               }   
               if(uart0.ReFinished==1)  //RS32接收标记
               {
                      send(0,&uart0.ReBuf[0], uart0.ReLength, 0); 
                      uart0.ReFinished=0;      
               }                          
         }
         
     }           
}




/******************************************************/
void InitializeServer (void)
{
	    TcpStatus[0].State=TCP_STATE_LISTEN;
		TcpStatus[0].My_Ip[0]=My_ip[0];
		TcpStatus[0].My_Ip[1]=My_ip[1];
		TcpStatus[0].My_Ip[2]=My_ip[2];
		TcpStatus[0].My_Ip[3]=My_ip[3];
		TcpStatus[0].My_Port=MyServerPort;
		TcpStatus[0].StaSem=0x82;
}


/****************************************************/
void InitialPort(void)
{
	    TcpStatus[0].State=TCP_STATE_LISTEN;
		TcpStatus[0].My_Ip[0]=My_ip[0];
		TcpStatus[0].My_Ip[1]=My_ip[1];
		TcpStatus[0].My_Ip[2]=My_ip[2];
		TcpStatus[0].My_Ip[3]=My_ip[3];
		TcpStatus[0].My_Port=MyServerPort;
		TcpStatus[0].StaSem=0x82;		
        UDPSocket.SourceIP[0]=My_ip[0];
        UDPSocket.SourceIP[0]=My_ip[1];
        UDPSocket.SourceIP[0]=My_ip[2];
        UDPSocket.SourceIP[0]=My_ip[3];
        UDPSocket.DesPort=MyServerPort;   
}



/***************************************
void ReadModuleP(void)
{
         SourceMAC[0]=0x00;
         SourceMAC[1]=0x14;
         SourceMAC[2]=0x97;
         SourceMAC[3]=0x0f;
         SourceMAC[4]=0x17;
         SourceMAC[5]=0xcd;                                      

         My_ip[0]=192;
         My_ip[1]=168;
         My_ip[2]=1;
         My_ip[3]=100;         
         MyServerPort=2000;
                  
         GateWayIP[0]=192;    
         GateWayIP[1]=168;    
         GateWayIP[2]=1;    
         GateWayIP[3]=1;  
         
         SubIPMark[0]=255; 
         SubIPMark[1]=255; 
         SubIPMark[2]=255; 
         SubIPMark[3]=0;                            
            
}*/









/***************************************/
void ReadModuleP(void)
{
    uint8 i,j;
    uint8 *p;
    uint8 Temp[32];
    ReadEEprom(Temp,MACADDRESS,6);
    if(Temp[0]==0xff && Temp[1]==0xff && Temp[2]==0xff
       && Temp[3]==0xff && Temp[4]==0xff && Temp[5]==0xff)
    {
         SourceMAC[0]=0x00;
         SourceMAC[1]=0x14;
         SourceMAC[2]=0x97;
         SourceMAC[3]=0x0f;
         SourceMAC[4]=0x17;
         SourceMAC[5]=0xcd;                                      
    }  
    else
    {
       for(i=0;i<6;i++)
          SourceMAC[i]=Temp[i];      
    } 
    

⌨️ 快捷键说明

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