Arduino UNO + Ethernet Problema Sketch

Salve a tutti, ho un problema con lo sketch di un progetto e dopo che l'ho guardato e riguardato non riesco a venire a capo di una soluzione.

Ora vi spiego il progetto:
Ho due arduini Uno con ethernet shield W5100 collegati tra di loro con un router dedicato su una lan solo per loro, il primo trasmette: un carattere di controllo per identificare l'inizio della tresmissione, 3 variabili float e un ultimo carattere di controllo per chiudere la trasmissione. il secondo riceve solamente per poi scrivere ciò che riceve su un display (anche se per adesso lo fa sul monitor seriale).

Allego gli sketch
TX (premetto che per cercare di risolvere il problema trasmette sempre gli stessi valori 11.11, 22.22, 33.33):

char nomeprog[]="LAN COM TX TEST";
char versione[]="v0    ser.";
#define LanID 'P' // id di riconoscimento
#define LanBreak 'p' // separatore variabili trasmesse

//parte Ethernet
#include <Ethernet.h>
#include <SPI.h>

// ****** PARAMETRI ETHERNET ******
// assign a MAC address for the Ethernet controller.
// fill in your address here:
byte mac[] = {
  0xDE, 0xED, 0xBE, 0xEF, 0xFE, 0xED
};
// assign an IP address for the controller:
IPAddress PowerIp (132, 180, 0, 3); // indirizzo ufficiale
//IPAddress ip(192, 168, 1, 182); // test lan casa

IPAddress serverMAIN(132,180,0,2);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
//EthernetServer server(80);
EthernetClient POWERclient;

int port = 80;

void setup() 
{
  Serial.begin(9600);
  
 // PRESENTAZIONE
  Serial.println(nomeprog);
  Serial.println(versione);
  Serial.print("\n");
  
  // BOOT PARTE ETHERNET
  // start the SPI library:
  SPI.begin();
  Serial.println("SPI ok");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, PowerIp);
    Serial.println("ethernet ok");
  
  //server.begin();
    Serial.println("server ok");
    Serial.println(LanID);

  // Fine Boot Ethernet

Serial.println(" \nBOOT COMPLETO\n \n \n");
delay(1500);
//Fine boot
//FINE_SETUP
}

void loop() 
{
POWERclient.connect (serverMAIN, port);
  if (POWERclient.connected() == true) 
  {
    Serial.println("connected");
    POWERclient.println(LanID);
    
    POWERclient.println("11.11");
    //POWERclient.println(LanBreak);
    POWERclient.println("22.22");
    //POWERclient.println(LanBreak);
    POWERclient.println("33.33");
    POWERclient.println(LanBreak);
    //POWERclient.println(LanBreak);
    POWERclient.stop();
    delay(1500);
  } 
  else 
  {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }

}

RX:

char nomeprog[]="LAN COM RX TEST";
char versione[]="v0    ser.";

//parte Ethernet
#include <Ethernet.h>
#include <SPI.h>

String LanIn = "", LanIn2= "", LanIn3= "";
#define PwrID 'P' // id di riconoscimento
#define PwrEND 'p' // chiusura paccheto variabili trasmesse PWR

// ****** PARAMETRI ETHERNET ******
// assign a MAC address for the Ethernet controller.
// fill in your address here:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
// assign an IP address for the controller:
IPAddress ip(132, 180, 0, 2);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

float Voltbatt1, Voltbatt2, Voltbatt3;

void setup()
{
  Serial.begin(9600);

// PRESENTAZIONE
  Serial.println(nomeprog);
  Serial.println(versione);
  Serial.print("\n");
  
  // BOOT PARTE ETHERNET
  // start the SPI library:
  SPI.begin();
  Serial.println("SPI ok");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
    Serial.println("ethernet ok");
  
  server.begin();
  server.available();
    Serial.println("server ok");

  // Fine Boot Ethernet
  Serial.println(" \nBOOT COMPLETO\n \n \n");
  delay(1500);
//FINE_SETUP
}

void loop()
{
  EthernetClient client = server.available();
  if (client)
  {
    char c;
    Serial.println("Got a client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected())
    {
      if (client.available())
      {
        c = client.read();
        //Serial.print(c);

        char ver=' ';
        int b;
        if (c==PwrID)
        {
          ver=c;
          b=1;
          
          
        }

        while (ver==PwrID)
        {
          
          c = client.read();
          //Serial.print(c);

            if (c != '\n') // ricezione batt1
            { 
                if (b=1)
              {
                LanIn += (char)c;
              }

                if (b=2)
              {
                LanIn2 += (char)c;
              }

                if (b=3)
              {
                LanIn3 += (char)c;
              }
              
            }
            else 
            {
              if (b=1)
              {
                Voltbatt1=LanIn.toFloat();
                //Serial.println(LanIn);
                //Serial.println(Voltbatt1);
                LanIn = "";
                b=2;
              }

              if (b=2)
              {
                Voltbatt2=LanIn2.toFloat();
                //Serial.println(LanIn2);
                //Serial.println(Voltbatt2);
                LanIn2 = "";
                b=3;
              }

              if (b=3)
              {
                Voltbatt3=LanIn3.toFloat();
                //Serial.println(LanIn3);
                //Serial.println(Voltbatt3);
                LanIn3 = "";
                b=4;
              }

        
              
            }// fine ricezione 1
          

          if(c==PwrEND) //controllo per uscita while
          {
            ver='x';
          }
         
        
        }// Fine While PWR
        Serial.println("****");
        Serial.println(Voltbatt1); 
        Serial.println(Voltbatt2);
        Serial.println(Voltbatt3);
      }
    }
  }
}

Il problema è che così comè il tutto mi sembra corretto, ma correggetemi se sbaglio, solamente che ottengo come risultato:

Got a client
****
33.33
33.33
33.33

quale può essere il problema?

Grazie a tutti per la pazienza e per le eventuali risposte.

La prima cosa che devi fare è ripassare la differenza tra = e == :).

SukkoPera:
La prima cosa che devi fare è ripassare la differenza tra = e == :).

se metto == ricevo 0.00 se invece metto = ricevo 33.33.
so che = corrisponde all'assegnazione di un valore ad una variabile che sta prima del simbolo, mentre == si usa per fare le comparazioni ma ripeto se metto == dove serve non funziona nulla

giagiga:
so che = corrisponde all'assegnazione di un valore ad una variabile che sta prima del simbolo, mentre == si usa per fare le comparazioni

... ecco, allora se lo sai è inutile che perseveri nell'errore, nel IF metti l'operatore corretto (==) e poi scopri perché non funziona (... c'è sicuramente qualche altra cosa che ti sfugge) !

Non puoi sperare che inserendo un ERRORE (perché sperare di fare un confronto con l'operatore di assegnazione è un ERRORE) si aggiustino le cose, non ti sembra ? ::slight_smile:

Guglielmo

gpb01:
... ecco, allora se lo sai è inutile che perseveri nell'errore, nel IF metti l'operatore corretto (==) e poi scopri perché non funziona (... c'è sicuramente qualche altra cosa che ti sfugge) !

Non puoi sperare che inserendo un ERRORE (perché sperare di fare un confronto con l'operatore di assegnazione è un ERRORE) si aggiustino le cose, non ti sembra ? ::slight_smile:

Guglielmo

ho riportato il tutto con l'operatore di assegnazione perché nell'ultimo test utilizzando l'operatore appropriato non funziona nulla. Dato per assodato che c'è un'errore di operatore, notate qualcos'altro fuori posto? E secondo voi perché non funziona? Non ne riesco a venire a capo e non vorrei abbandonare il progetto.

Sì ma questo non ha alcun senso. È come dire "Fa freddo, ho acceso il riscaldamento ma non funziona, quindi tolgo il giubbotto".

Lo so che non ha senso, però non vorrei che adesso ci si fermi sugli operatori e non sul problema vero e proprio.
Notate altri errori all'interno dei programmi che possono causare questo malfunzionamento? (Appartenenti gli operatori che sono stati corretti)

Posta gli sketch corretti, potrebbe comunque esserti sfuggito qualche operatore.

TX:

char nomeprog[]="LAN COM TX TEST";
char versione[]="v0    ser.";
#define LanID 'P' // id di riconoscimento
#define LanBreak 'p' // separatore variabili trasmesse

//parte Ethernet
#include <Ethernet.h>
#include <SPI.h>

// ****** PARAMETRI ETHERNET ******
// assign a MAC address for the Ethernet controller.
// fill in your address here:
byte mac[] = {
  0xDE, 0xED, 0xBE, 0xEF, 0xFE, 0xED
};
// assign an IP address for the controller:
IPAddress PowerIp (132, 180, 0, 3); // indirizzo ufficiale
//IPAddress ip(192, 168, 1, 182); // test lan casa

IPAddress serverMAIN(132,180,0,2);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
//EthernetServer server(80);
EthernetClient POWERclient;

int port = 80;

void setup() 
{
  Serial.begin(9600);
  
 // PRESENTAZIONE
  Serial.println(nomeprog);
  Serial.println(versione);
  Serial.print("\n");
  
  // BOOT PARTE ETHERNET
  // start the SPI library:
  SPI.begin();
  Serial.println("SPI ok");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, PowerIp);
    Serial.println("ethernet ok");
  
  //server.begin();
    Serial.println("server ok");
    Serial.println(LanID);

  // Fine Boot Ethernet

Serial.println(" \nBOOT COMPLETO\n \n \n");
delay(1500);
//Fine boot
//FINE_SETUP
}

void loop() 
{
POWERclient.connect (serverMAIN, port);
  if (POWERclient.connected() == true) 
  {
    Serial.println("connected");
    POWERclient.println(LanID);
    
    POWERclient.println("11.11");
    //POWERclient.println(LanBreak);
    POWERclient.println("22.22");
    //POWERclient.println(LanBreak);
    POWERclient.println("33.33");
    POWERclient.println(LanBreak);
    //POWERclient.println(LanBreak);
    POWERclient.stop();
    delay(1500);
  } 
  else 
  {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }

}

RX:

char nomeprog[]="LAN COM RX TEST";
char versione[]="v0    ser.";



//parte Ethernet
#include <Ethernet.h>
#include <SPI.h>

String LanIn = "", LanIn2= "", LanIn3= "";
#define PwrID 'P' // id di riconoscimento
#define PwrEND 'p' // chiusura paccheto variabili trasmesse PWR

// ****** PARAMETRI ETHERNET ******
// assign a MAC address for the Ethernet controller.
// fill in your address here:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
// assign an IP address for the controller:
IPAddress ip(132, 180, 0, 2);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);

float Voltbatt1, Voltbatt2, Voltbatt3;

void setup()
{
  Serial.begin(9600);

// PRESENTAZIONE
  Serial.println(nomeprog);
  Serial.println(versione);
  Serial.print("\n");
  
  // BOOT PARTE ETHERNET
  // start the SPI library:
  SPI.begin();
  Serial.println("SPI ok");

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
    Serial.println("ethernet ok");
  
  server.begin();
  server.available();
    Serial.println("server ok");

  // Fine Boot Ethernet
  Serial.println(" \nBOOT COMPLETO\n \n \n");
  delay(1500);
//FINE_SETUP
}

void loop()
{
  EthernetClient client = server.available();
  if (client)
  {
    char c;
    Serial.println("Got a client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected())
    {
      if (client.available())
      {
        c = client.read();
        //Serial.print(c);

        char ver=' ';
        int b;
        if (c==PwrID)
        {
          ver=c;
          b=1;
          
          
        }

        while (ver==PwrID)
        {
          
          c = client.read();
          //Serial.print(c);

            if (c != '\n') // ricezione batt1
            { 
                if (b==1)
              {
                LanIn += (char)c;
              }

                if (b==2)
              {
                LanIn2 += (char)c;
              }

                if (b==3)
              {
                LanIn3 += (char)c;
              }
              
            }
            else 
            {
              if (b==1)
              {
                Voltbatt1=LanIn.toFloat();
                //Serial.println(LanIn);
                //Serial.println(Voltbatt1);
                LanIn = "";
                b=2;
              }

              if (b==2)
              {
                Voltbatt2=LanIn2.toFloat();
                //Serial.println(LanIn2);
                //Serial.println(Voltbatt2);
                LanIn2 = "";
                b=3;
              }

              if (b==3)
              {
                Voltbatt3=LanIn3.toFloat();
                //Serial.println(LanIn3);
                //Serial.println(Voltbatt3);
                LanIn3 = "";
                b=4;
              }

        
              
            }// fine ricezione 1
          

          if(c==PwrEND) //controllo per uscita while
          {
            ver='x';
          }
         
        
        }// Fine While PWR
        Serial.println("****");
        Serial.println(Voltbatt1); 
        Serial.println(Voltbatt2);
        Serial.println(Voltbatt3);
      }
    }
  }
}

risultato:

Got a client
****
0.00
0.00
0.00

Ok, non vedo niente di palesemente errato, a parte che il tutto è più complesso di quel che serve sia. Se decommenti il print(c) cosa esce?

se commento tutto il blocco di if, per capirci da if (c!='\n') fino alla fine del suo else e tolgo il commento a print(c) viene stampato tutto ciò che trasmetto correttamente

Bene, questo già ti fa capire che il problema è nel ricevitore. Cosa succede se NON commenti if (c!='\n')... ma decommenti SOLO il print?

stampa correttamente i caratteri ma quando deve stampare le variabili stampa sempre 0.00

Prova a mettere, come prima istruzione del secondo while:

if (client.connected() && client.available()) {

E chiudilo alla fine del while.

niente, sempre 0.00

Allora non saprei, suggerisco di mettere un po' di print() nei vari if in modo da capire esattamente cosa succede e da quali parti di codice passa.

togliendo un po di commenti ai vari print che avevo inserito noto che se chiedo di stampare le stringhe che vado a creare per poi convertire i numeri stampa righi vuoti

mi potete confermare se la sintassi di questo comando per aggiungere un nuovo carattere ad una stringa è corretta?

nomestringa += (char)carattere;

non so perchè ma continuo ad avere stringhe vuote.

Sì, ma perché non provi a fare come ti ho suggerito? Metti una print dopo quell'istruzione e dovresti vedere la tua stringa crescere man mano!

SukkoPera:
Sì, ma perché non provi a fare come ti ho suggerito? Metti una print dopo quell'istruzione e dovresti vedere la tua stringa crescere man mano!

l'ho fatto ma stampa solo un rigo vuoto. quindi il problema è che non aggiunge caratteri alla stringa, o sbaglio?