Enc28j60 stops sending GET requests

I’m trying to send data to a server to store in a database, but the Enc28j60 only sends one GET request, or if I modify the program, it only send some requests and stops sending data after a minute. Why does it happen?

the code I got in many examples and is attached.

thanks
Anderson from Brazil

code.rtf (15.7 KB)

Can you repost as plain text please?

#include "etherShield.h"

static uint8_t mymac[6] = {0x54,0x55,0x58,0x10,0x00,0x24};
static uint8_t myip[4] = {192,168,1,77};
static uint16_t my_port = 1200;     // client port
int ledPin = 13;

int x = 0;

static char client_ip[] = "192.168.1.77";
 
static uint8_t dest_ip[4]={192,168,1,2};
static uint8_t dest_mac[6];
 
enum CLIENT_STATE
{
   IDLE, ARP_SENT, ARP_REPLY, SYNC_SENT
 };
 
static CLIENT_STATE client_state;
 
static uint8_t client_data_ready;
 
static uint8_t syn_ack_timeout = 0;
 
#define BUFFER_SIZE 500
static uint8_t buf[BUFFER_SIZE+1];

char sensorData[10];
 
EtherShield es=EtherShield();
 
uint16_t print_webpage(uint8_t *buf);
int8_t analyse_cmd(char *str);
// get current temperature
#define TEMP_PIN  3
void getCurrentTemp( char *temperature);
void client_process(void);
 
void setup(){
   Serial.begin(9600);
   Serial.println("setup")  ;
   /*initialize enc28j60*/
     es.ES_enc28j60Init(mymac);
   es.ES_enc28j60clkout(2); 
   delay(10);
 
    es.ES_enc28j60PhyWrite(PHLCON,0x880);
    delay(500);
    
    es.ES_enc28j60PhyWrite(PHLCON,0x990);
    delay(500);

    es.ES_enc28j60PhyWrite(PHLCON,0x880);
    delay(500);
    
    es.ES_enc28j60PhyWrite(PHLCON,0x990);
    delay(500);
 
  es.ES_enc28j60PhyWrite(PHLCON,0x476);
    delay(100);
 
  es.ES_init_ip_arp_udp_tcp(mymac,myip,80);
 
  syn_ack_timeout =0;
  client_data_ready = 0;
  client_state = IDLE;
    digitalWrite(TEMP_PIN, LOW);
    pinMode(TEMP_PIN, INPUT);      
 
}
 
void loop(){
   
        if(client_data_ready==0){
          digitalWrite(ledPin,HIGH);
          delay(1000UL);             
          //getCurrentTemp(sensorData);
          digitalWrite(ledPin,LOW);
          client_data_ready = 1;
         }
    client_process();
    
}
 
uint16_t gen_client_request(uint8_t *buf )
{
    uint16_t plen;
    byte i;
 
    plen= es.ES_fill_tcp_data_p(buf,0, PSTR ( "GET /home?sensor=1" ) );
       
        
        plen= es.ES_fill_tcp_data_p(buf,plen, PSTR ( "&valor=0" ) );
 
    plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( " HTTP/1.0\r\n" ));
    plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Host: 192.168.1.2\r\n" ));
    plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "User-Agent: AVR ethernet\r\n" ));
        plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Accept: text/html\r\n" ));
    plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Keep-Alive: 300\r\n" ));
    plen= es.ES_fill_tcp_data_p(buf, plen, PSTR ( "Connection: keep-alive\r\n\r\n" ));
 
    return plen;
}
 
void client_process ( void )
{
    uint16_t plen;
    uint8_t i;
 
    if (client_data_ready == 0)  return;
 
    if(client_state == IDLE){   // initialize ARP
       es.ES_make_arp_request(buf, dest_ip);
 
       client_state = ARP_SENT;
       return;
    }
 
    if(client_state == ARP_SENT){
 
        plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);
 
        if ( plen!=0 )
        {
            if ( es.ES_arp_packet_is_myreply_arp ( buf ) ){
                client_state = ARP_REPLY;
                syn_ack_timeout=0;
                return;
            }
 
        }
            delay(10);
        syn_ack_timeout++;
 
        if(syn_ack_timeout== 100) {  
            client_state = IDLE;
            client_data_ready =0;
            syn_ack_timeout=0;
            return;
        }
    }
 
    if(client_state == ARP_REPLY){
        // save dest mac
        for(i=0; i<6; i++){
            dest_mac[i] = buf[ETH_SRC_MAC+i];
        }
 
        es.ES_tcp_client_send_packet (
                       buf,
                       80,
                       1200,
                       TCP_FLAG_SYN_V,      
                       1,
                       1,
                       0,                                             
                       0,
              dest_mac,
              dest_ip
                       );
 
        client_state = SYNC_SENT;
    }
  if(client_state == SYNC_SENT){
    plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);
 
       // no new packet incoming
    if ( plen == 0 )
    {
        return;
    }
 
    if ( es.ES_eth_type_is_ip_and_my_ip(buf,plen)==0){
        return;
    }
 
    //if ( buf [ TCP_FLAGS_P ] == ( TCP_FLAG_SYN_V | TCP_FLAG_ACK_V ) )
    {
 
               // send ACK to answer SYNACK
               Serial.println("entrou1");
               es.ES_tcp_client_send_packet (
                       buf,
                       80,
                       1200,
                       TCP_FLAG_ACK_V,
                       0,
                       0,
                       1,
                       0, 
                        dest_mac,
                        dest_ip
                       );
               plen = gen_client_request( buf );
               // send http request packet
               // send packet with PSHACK
               es.ES_tcp_client_send_packet (
                                       buf,
                                       80,   
                                       1200,  
                                       TCP_FLAG_ACK_V | TCP_FLAG_PUSH_V,
                                       0, 
                                       0, 
                                       0,                               
                                       plen, 
                                       dest_mac,
                                       dest_ip
                                       );
               return;
       }
       if ( buf [ TCP_FLAGS_P ] == (TCP_FLAG_ACK_V|TCP_FLAG_PUSH_V) )
       {
               Serial.println("entrou2");
               plen = es.ES_tcp_get_dlength( (uint8_t*)&buf );
 
               // send ACK to answer PSHACK from server
               es.ES_tcp_client_send_packet (
                                       buf,
                                       80,     
                                       TCP_FLAG_ACK_V,   
                                       0, 
                                       0,  
                                       plen,  
                                       0,
                      dest_mac,
                      dest_ip
               );;
               // send finack to disconnect from web server
 
               es.ES_tcp_client_send_packet (
                                       buf,
                                       80,
                                       1200, 
                                       TCP_FLAG_FIN_V|TCP_FLAG_ACK_V,
                                       0,  
                                       0,  
                                       0,         
                                       0,
                                        dest_mac,
                                        dest_ip
                );
 
               return;
 
       }
       // answer FINACK from web server by send ACK to web server
       if ( buf [ TCP_FLAGS_P ] == (TCP_FLAG_ACK_V|TCP_FLAG_FIN_V) )
       {
               Serial.println("entrou3");
               // send ACK with seqack = 1
               es.ES_tcp_client_send_packet(
 
                                       buf,
                                       80,   
                                       1200,   
                                       TCP_FLAG_ACK_V,     
                                       0,   
                                       0,                                      
                                       1,                            
                                       0,
                                       dest_mac,
                                       dest_ip
                );
            client_state = IDLE; 
            client_data_ready =0;   
        }
  }
}

Moderator edit: [code][/code] tags added. (Nick Gammon)