[risolto] Possibile ricevere più pacchetti UDP contemporaneamente?

Rifacendomi ai codici di questo post, mi confermate che un ethernet shield W5100 è in grado di ricevere un solo pacchetto UDP alla volta, e finché non viene scaricato dal suo buffer gli altri eventuali in arrivo si perdono?

Volevo provare a fare un server UDP in grado di ricevere da N stazioni che potrebbero trasmettere anche in contemporanea. Ok, contemporanea su ethernet significa comunque un pacchetto accodato all'altro, ma, appunto volevo sapere se il W5100 ha la possibilità di accodare gli altri mentre si sta leggendo/gestendo il primo arrivato.


Risposta: si, è possibile, i pacchetti vengono accodati e possono essere letti anche secondi dopo il loro arrivo, purché non si riempia il buffer interno di ricezione del W5100 (a quanto ho capito 8kbyte).

Bravo! Ma ultimamente ti stai "Marzullando"... :smiley:

docdoc:
Bravo! Ma ultimamente ti stai “Marzullando”… :smiley:

Vero :stuck_out_tongue: Infatti adesso ne avrei un’altra e non so se farla :drooling_face:

Ma riguarda l’accensione di un Esp-01, che non si connette se non lo lascio prima partire e poi gli do un reset fisico…

Poi una volta connesso non perde un colpo, se il router viene spento e riacceso si riconnette subito, naturalmente ho verificato anche con quello che accodi i pacchetti, anche 500 al colpo, per poi sgranocchiarli con calma uno per uno :slight_smile:


L’unica patch che ho trovato è una macchinetta a stati per tenere sotto controllo la connessione e rifare dei tentativi. In questo modo se non al primo giro, nel secondo o terzo ci riesce:

#include <ESP8266WiFi.h>

//----------------------------------------------------------------------------------

const char* ssid = "........";
const char* PASSWORD = ".....................";
IPAddress   IP(192, 168, 1, 31);
IPAddress   GATEWAY(192, 168, 1, 1);
IPAddress   SUBNET(255, 255, 255, 0);

//----------------------------------------------------------------------------------

bool connessione()
{
    static uint8_t  s = 0;
    static uint32_t t;

    if (0 == s)
    {
        WiFi.mode(WIFI_STA);
        WiFi.config(IP, GATEWAY, SUBNET);
        WiFi.begin(ssid, PASSWORD);
        t = millis();
        s = 1;
    }
    else if ((1 == s) && (WiFi.status() == WL_CONNECTED))  { s = 3;  return true;       }
    else if ((1 == s) && (millis()-t > 4000))              { WiFi.disconnect();  s = 0; }
    else if ((3 == s) && (WiFi.status() != WL_CONNECTED))  { WiFi.disconnect();  s = 0; }
    else if (3 == s)                                       { return true;               }
    else                                                   {                            }    

    return false;
}

//----------------------------------------------------------------------------------

void setup() 
{
    while (!connessione()) { delay(100); }
}
  
//----------------------------------------------------------------------------------

void loop() 
{
    if (!connessione()) { delay(10);  return; }

    delay(10);
}