当前位置: 代码迷 >> 单片机 >> uip1.0主动断开有关问题
  详细解决方案

uip1.0主动断开有关问题

热度:9   发布时间:2016-04-28 15:51:12.0
uip1.0主动断开问题
现在是使用uip1.0协议栈中的uip_close()主动断开客户端连接没反应,也就是客户端收不到断开消息,我的断开处理是在
uip_len = enc28j60_packet_receive(uip_buf, UIP_BUFSIZE );
if (uip_len > 0)
{  
  if(DATABUF->type == htons(UIP_ETHTYPE_IP)) 
  {  
  uip_arp_ipin();
  uip_input();
  if(uip_len > 0)
  {  
  uip_arp_out();
  enc28j60_packet_send(uip_buf, uip_len);  
  }  
  } 
  else if(DATABUF->type == htons(UIP_ETHTYPE_ARP))
  {  
  uip_arp_arpin();
  if(uip_len > 0) 
  enc28j60_packet_send(uip_buf, uip_len);
  }

else
{
//在这里处理断开连接,加了心跳的断开处理,但是断开没任何反应客户端仍然可以发送数据及UIP可以收取数据,希望大家能帮下忙解决,在这先谢谢大家。  
}

------解决方案--------------------
接收到数据了 只是数据不正确 看一下配置

C/C++ code
/*********************************************  * vim:sw=8:ts=8:si:et  * To use the above modeline in vim you must have "set modeline" in your .vimrc  * Author: Guido Socher  * Copyright: GPL V2  *  * Ethernet remote device and sensor  *  * Title: Microchip ENC28J60 Ethernet Interface Driver  * Chip type           : ATMEGA88 with ENC28J60  *********************************************/ #include <avr/io.h> #include "ip_arp_udp.h" #include "enc28j60.h" #include "timeout.h" #include "avr_compat.h" #include "net.h" #include "stdlib.h" // please modify the following two lines. mac and ip have to be unique // in your local area network. You can not have the same numbers in // two devices: static uint8_t mymac[6] = {0x13,0x33,0x37,0x71,0x77,0x20}; static uint8_t myip[4] = {192,168,1,10}; static uint16_t myport =1200; // listen port for udp // how did I get the mac addr? Translate the first 3 numbers into ascii is: TUX #define BUTTON_PORT PORTD #define BUTTON_PIN PIND #define BUTTON_BIT PD2 #define BUFFER_SIZE 250 static uint8_t buf[BUFFER_SIZE+1]; int main(void){                 uint16_t plen;         uint8_t i=0;         uint8_t payloadlen=0;         char message[100]={'/','e','l','l','o',0,0,0,',',0,0};                 // set the clock speed to 8MHz         // set the clock prescaler. First write CLKPCE to enable setting of clock the         // next four instructions.         CLKPR=(1<<CLKPCE);         CLKPR=0; // 8 MHZ                 /* enable PB0, reset as output */         DDRB|= (1<<DDB0);         /* set output to gnd, reset the ethernet chip */         PORTB &= ~(1<<PB0);         delay_ms(20);         /* set output to Vcc, reset inactive */         PORTB|= (1<<PB0);         delay_ms(100);                 // LED         /* enable PB1, LED as output */         DDRB|= (1<<DDB1);         /* set output to Vcc, LED off */         PORTB|= (1<<PB1);                 //Enable pullup on pin D         PORTD|= (1<<PD0);         /*initialize enc28j60*/         enc28j60Init(mymac);         delay_ms(20);                 /* Magjack leds configuration, see enc28j60 datasheet, page 11 */         // LEDB=yellow LEDA=green         //         // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit         // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10);         enc28j60PhyWrite(PHLCON,0x476);         delay_ms(20);                 /* set output to GND, red LED on */         PORTB &= ~(1<<PB1);         i=1;                 //init the ethernet/ip layer:         init_ip_arp_udp(mymac,myip);         while(1){                 // get the next new packet:                 plen = enc28j60PacketReceive(BUFFER_SIZE, buf);                 /*plen will be unequal to zero if there is a valid                  * packet (without crc error) */                 if(plen==0){                         continue;                 }                 // arp is broadcast if unknown but a host may also                 // verify the mac address by sending it to                 // a unicast address.                 if(eth_type_is_arp_and_my_ip(buf,plen)){                         make_arp_answer_from_request(buf,plen);                         continue;                 }                 // check if ip packets (icmp or udp) are for us:                 if(eth_type_is_ip_and_my_ip(buf,plen)==0){                         continue;                 }                                 if (i){                         /* set output to Vcc, LED off */                         PORTB|= (1<<PB1);                         i=0;                 }else{                         /* set output to GND, LED on */                         PORTB &= ~(1<<PB1);                         i=1;                 }                                         if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V){                         // a ping packet, let's send pong                         make_echo_reply_from_request(buf,plen);                         continue;                 }                 if (buf[IP_PROTO_P]==IP_PROTO_UDP_V){                         payloadlen=buf[UDP_LEN_L_P]-UDP_HEADER_LEN;                         if (buf[UDP_DATA_P]=='t' && payloadlen==12){                               //itoa(buf,message,10);                               while(1){                                  if (bit_is_clear(PIND,PD0)){                                      make_udp_reply_from_request(buf,message,16,myport);                                       delay_ms(50);                                       while(bit_is_clear(PIND,PD0))                                          {                                          }                                       delay_ms(50);                                       }                                 }                         }                 }         }         return (0); }