Go Down

Topic: 6 Arduini UNO che comunicano un float a un MEGA 2560 con SoftwareSerial (Read 14905 times) previous topic - next topic

Marcobz

Ok... hai ragione... mi sfuggono sempre i dettagli...

Le masse e i collegamenti sono ok ovviamente.
Ho letto e letto attentamente lo sketch che hai postato e credo di aver capito abbastanza come lavora ma ovviamente non tanto da poterlo insegnare !  XD
Solo una domanda: il punto vale come carattere ?

Marcobz

Niente... ma porca zozza ! Ma possibile che sia così complicato trasmettere un caccoloso numero con la virgola ??? E che cos'è ? Il terzo segreto di fatima ??? Possibile che non esiste nessuno che mi sa spiegare come fare senza indovinelli, misteri e soprattutto senza scervellarmi per 5 giorni ??
Mi manca solo questo per andare avanti.....................

Scusate lo sfogo ma è frustrante.

Possibile che non esiste una guida "Inviare e ricevere float for Dummies " ??

=( =( =(

gpb01

Tutto vale come carattere ... anche il punto ;)

Guarda che non serve una guida per trasmettere i float ... perché allora servirebbe per trasmettere qualsiasi cosa ... si trasmette TUTTO allo stesso modo ... carattere a carattere e, carattere a carattere si riceve ...

Ora, con calma, ricopia e incolla qui sia il programma che trasmette, che il programma che riceve ... nella loro nuova veste, e vediamo cosa c'è che non va ...

Ah ... la fretta di voler vedere funzionare qualche cosa ... è una pessima consigliera ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Marcobz

Trasmettitore
Code: [Select]
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11);

float valore = 0.0 ;       

void setup() 
{

  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop()
{
  valore = 29.57;           
   
  if (valore > 0) {
     mySerial.print(valore);
     mySerial.print(0x0D);
     Serial.println(valore);
     
}

}


ricevitore
Code: [Select]
#include <SoftwareSerial.h>                    //includo libreria
SoftwareSerial mySerial(10,11);                //assegno pin tx e rx

#define MAXCHAR  5
#define TERCHAR 0x0D

char inputString[MAXCHAR + 1];
char inChar;
byte strIndex;


void setup() {
 
  strIndex = 0;
  inputString[strIndex] = 0x00;
 
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop() {
 
  if (mySerial.available()) {
    inChar = mySerial.read();
    // se si vogliono vedere in HEX i caratteri che si ricevono
    // togliere il commento alla riga seguente
     //Serial.println(inChar, HEX);
    if (inChar == (char) TERCHAR) {
      // è arrivato il carattere terminatore, si puo' elaborare la stringa
      // In questo esempio semplicemente la si stampa ...
      Serial.println(inputString);
      // finito il suo uso la si ripulisce per un uso successivo
      strIndex = 0;
      inputString[strIndex] = 0x00;
    }
    // NON è arrivato il carattere terminatore, si memorizza il carattere ricevuto
    // e si sposta il fine stringa ...
    inputString[strIndex] = inChar;
    strIndex++;
    if (strIndex > MAXCHAR) {
      // ... NON c'è pi` spazio nella stringa ... bisogna elaborarla e svuotarla
      // In questo esempio semplicemente la si stampa ...
      Serial.println(inputString);
      //
      // e la si ripulisce per un uso successivo
      strIndex = 0;
      inputString[strIndex] = 0x00;
    }
  }
}


E questo è il risultato
Code: [Select]
329.577 29.571329.57
1329.55 29.571329.571329.5
71329.. 29.571329.571329.571329.
5713299 29.571329.571329.571329.571329.571329.571329.
.571322 9.571329.571329.571329.571329.5713229.571329.571329.571329.57132#$
9.57133 9.571329.571329.571329.571329.5713229.571329.571329.571329.57132)*
29.5711 9.571329.571329.571329.571329.5713229.57171329.1329.571329.57132/0
329.577 9.571329.571329.571329.571329.5713229.57171329.9.571371329.5713256
1329.55 9.571329.571329.571329.571329.5713229.57171329.9.5713329.5757132;<
71329.. ..571329.571329.571329.571329.5713229.57171329.9.5713329.5771329
5713299 .9.57139.571329.571329.571329.5713229.57171329.9.5713329.5771329
.571322 .9.5713329.5729.571329.571329.5713229.57171329.9.5713329.5771329

9.57133 .9.5713329.57571329329.571329.5713229.57171329.9.5713329.5771329
29.5711 .9.5713329.5757132929.5711329.5713229.57171329.9.5713329.5771329
329.577 .9.5713329.5757132929.5711329.5713229.57171329.9.5713329.5771329
13229.. .9.5713329.5757132929.5711329.5571329.57171329.9.5713329.5771329%&
5717133 .9.5713329.5757132929.5711329.557132929.571329.9.5713329.5771329+,
29.9.55 .9.5713329.5757132929.5711329.557132929.5711329.55713329.577132912
7133299 .9.5713329.5757132929.5711329.557132929.5711329.5.571329.577132978
.577133 .9.5713329.5757132929.5711329.557132929.5711329.5.5713229.571329=>
29.9.55 29.5713329.5757132929.5711329.557132929.5711329.5.5713229.571713
7133299 29..571329.5757132929.5711329.557132929.5711329.5.5713229.571713

.575711 29..5713229.571132929.5711329.557132929.5711329.5.5713229.571713
32929.. 29..5713229.57171329..5711329.557132929.5711329.5.5713229.571713

gpb01

Mmm ... sembra che il buffer sia troppo piccolo e ci siano delle sovrascritture, o che non riconosca il terminatore. Fai una cosa, modifica così il programma di ricezione che vediamo di capire cosa veramente arriva (ti stamperà in HEX ogni singolo carattere ricevuto e poi la stringa completa) ...

Code: [Select]

#include <SoftwareSerial.h>                    //includo libreria
SoftwareSerial mySerial(10,11);                //assegno pin tx e rx

#define MAXCHAR  6
#define TERCHAR 0x0D

char inputString[MAXCHAR + 1];
char inChar;
byte strIndex;


void setup() {
 
  strIndex = 0;
  inputString[strIndex] = 0x00;
 
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop() {
 
  if (mySerial.available()) {
    inChar = mySerial.read();
    // se si vogliono vedere in HEX i caratteri che si ricevono
    // togliere il commento alla riga seguente
    Serial.print("Char ricevuto : ");
    Serial.println(inChar, HEX);
    if (inChar == (char) TERCHAR) {
      // è arrivato il carattere terminatore, si puo' elaborare la stringa
      // In questo esempio semplicemente la si stampa ...
      Serial.print("Stringa ricevuta : ");
      Serial.println(inputString);
      // finito il suo uso la si ripulisce per un uso successivo
      strIndex = 0;
      inputString[strIndex] = 0x00;
    }
    // NON è arrivato il carattere terminatore, si memorizza il carattere ricevuto
    // e si sposta il fine stringa ...
    inputString[strIndex] = inChar;
    strIndex++;
    if (strIndex > MAXCHAR) {
      // ... NON c'è pi` spazio nella stringa ... bisogna elaborarla e svuotarla
      // In questo esempio semplicemente la si stampa ...
      Serial.print("Overflow : ");
      Serial.println(inputString);
      //
      // e la si ripulisce per un uso successivo
      strIndex = 0;
      inputString[strIndex] = 0x00;
    }
  }
}


.... copialo ed incollalo così come è, compreso il MAXCHAR più grande ... e dimmi cosa ti stampa ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Marcobz

Code: [Select]
Char ricevuto : FFFFFFFE
Char ricevuto : 32
Char ricevuto : 39
Char ricevuto : 2E
Char ricevuto : 35
Char ricevuto : 37
Overflow : ?þ29.577R329.5771329.571329.571329.571329.571329.571329.571329.571329.571
Char ricevuto : 31
Char ricevuto : 33
Char ricevuto : 32
Char ricevuto : 39
Char ricevuto : 2E
Char ricevuto : 35
Char ricevuto : 37
Overflow : 1329.577R329.57252535371329.571329.571329.571329.571329.571329.571329.571

Char ricevuto : 31
Char ricevuto : 33
Char ricevuto : 32
Char ricevuto : 39
Char ricevuto : 2E
Char ricevuto : 35
Char ricevuto : 37
Overflow : 1329.577R329.5725253535253.3.71329.571329.571329.571329.571329.571329.571
Char ricevuto : 31
Char ricevuto : 33
Char ricevuto : 32
Char ricevuto : 39
Char ricevuto : 2E
Char ricevuto : 35
Char ricevuto : 37
Overflow : 1329.577R329.5725253535253.3.353.3.171329.571329.571329.571329.571329.571
Char ricevuto : 31
Char ricevuto : 33
Char ricevuto : 32
Char ricevuto : 39
Char ricevuto : 2E
Char ricevuto : 35
Char ricevuto : 37
Overflow : 1329.577R329.5725253535253.3.353.3.1.3.1.1971329.571329.571329.571329.571"#
Char ricevuto : 31
Char ricevuto : 33
Char ricevuto : 32
Char ricevuto : 39
Char ricevuto : 2E
Char ricevuto : 35
Char ricevuto : 37
Overflow : 1329.577R329.5725253535253.3.353.3.1.3.1.193.1919171329.571329.571329.571)*
Char ricevuto : 31
Char ricevuto : 33
Char ricevuto : 32
Char ricevuto : 39
Char ricevuto : 2E
Char ricevuto : 35
Char ricevuto : 37

ecco....

gpb01

Ahahahahah ... non ci sono dubbi che qualche cosa NON quadra ...  :smiley-mr-green: :smiley-mr-green:

... è chiaramente visibile che la parte ricevente stà ricevendo REGOLARMENTE (scartando il primo valore, poiché probabilmente non era ancora in ricezione quando tu hai cominciato a trasmettere e ha letto porcheria) : 0x31 che è '1', 0x33 che è '3', 0x32 che è '2', 0x39 che è '9', 0x2E che è il punto, 0x35 che è '5' e 0x37 che è '7'.

Quindi ... la stringa che riceve in continuazione è : 1329.57 e non 29.57 ... e sai perché ?

Perché (... mea culpa che non c'ho pensato) per inviare il CR (0x0D = 13 in decimale) NON puoi usare la print() che lo trasforma nei suoi due caratteri ASCII che lo compongono (1 e 3), ma la write() !!!

Code: [Select]
mySerial.print(valore);
mySerial.write(0x0D);


Modifica e prova ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Marcobz

Code: [Select]
Stringa ricevuta :
29.57
Char ricevuto : 32
Char ricevuto : 39
Char ricevuto : 2E
Char ricevuto : 35
Char ricevuto : 37
Char ricevuto : D
Stringa ricevuta :
29.57
Char ricevuto : 32
Char ricevuto : 39
Char ricevuto : 2E
Char ricevuto : D
Stringa ricevuta :
29.57
Char ricevuto : 37
Char ricevuto : 35
Char ricevuto : 35
Char ricevuto : 2E
Char ricevuto : 39
Char ricevuto : 37
Overflow :
755.977R25.9275.922755.9255.92
5.92
7.92
7792
7752
775.
775.9
75.9275.92
Char ricevuto : 35
Char ricevuto : 35
Char ricevuto : 2E
Char ricevuto : 39
Char ricevuto : 32
Char ricevuto : 35
Char ricevuto : 35
Overflow : 55.92555R25.9275.92275.922
5.92
5.92
7.92
7792
7752
775.
775.9
75.9275.92
Char ricevuto : 2E
Char ricevuto : 39
Char ricevuto : 32
Char ricevuto : D
Stringa ricevuta : .929255
R25.9275.92275.922
5.92
5.92
7.92
7792
7752
775.
775.9
75.9275.92
Char ricevuto : 35
Char ricevuto : 2E
Char ricevuto : 39
Char ricevuto : 32
Char ricevuto : D
Stringa ricevuta :
5.9255
R25.9275.92275.922
5.92
75.9
7.92
7792
7752
775.
775.9
75.9275.92
Char ricevuto : 37
Char ricevuto : 2E
Char ricevuto : 39
Char ricevuto : 32
Char ricevuto : D
Stringa ricevuta :
7.9255
R25.9275.92275.922
5.92
75.92
75.
7792
7752
775.
775.9
75.9275.92 !
Char ricevuto : 37
Char ricevuto : 37
Char ricevuto : 39
Char ricevuto : 32
Char ricevuto : D
Stringa ricevuta :
779255
R25.9275.92275.922
5.92
75.92
75.22
75
7752
775.
775.9
75.9275.92%&
Char ricevuto : 37
Char ricevuto : 37
Char ricevuto : 35
Char ricevuto : 32
Char ricevuto : D
Stringa ricevuta :
775255
R25.9275.92275.922
5.92
75.92
75.2


ci siamo quasi !

dr4gone


Ahahahahah ... non ci sono dubbi che qualche cosa NON quadra ...  :smiley-mr-green: :smiley-mr-green:

... è chiaramente visibile che la parte ricevente stà ricevendo REGOLARMENTE (scartando il primo valore, poiché probabilmente non era ancora in ricezione quando tu hai cominciato a trasmettere e ha letto porcheria) : 0x31 che è '1', 0x33 che è '3', 0x32 che è '2', 0x39 che è '9', 0x2E che è il punto, 0x35 che è '5' e 0x37 che è '7'.

Quindi ... la stringa che riceve in continuazione è : 1329.57 e non 29.57 ... e sai perché ?

Perché (... mea culpa che non c'ho pensato) per inviare il CR (0x0D = 13 in decimale) NON puoi usare la print() che lo trasforma nei suoi due caratteri ASCII che lo compongono (1 e 3), ma la write() !!!

Code: [Select]
mySerial.print(valore);
mySerial.write(0x0D);


Modifica e prova ... ;)

Guglielmo


OT

Giù il cappello.
Sto seguendo questa discussione da oggi... e da un paio di giorni i tuoi suggerimenti agli utenti del forum,.
Non c'è niente da dire. ne sai una più del diavolo! :)
Di solito non mi esprimo in questi termini.. ma in questo caso....
Si vede che di esperienza ne hai da vendere. :D
Complimenti! ;)

P.s. scusate l' OT  :smiley-mr-green:

Marcobz

In pratica le prime 35 volte ha lavorato a dovere... poi inizia a mettere quelle "stringhe" lunghissime... ho provato a mettere un delay sulla trasmittente ma non cambia nulla..

ps: concordo con dr4gone nonostante la mia frustrazione..

gpb01


...
Si vede che di esperienza ne hai da vendere. :D
Complimenti! ;)


Ma no, dai ...  :smiley-red: :smiley-red: :smiley-red:
... e che sono ... appena 30 anni che faccio questo lavoro e quindi ... ne ho viste ...  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01


In pratica le prime 35 volte ha lavorato a dovere... poi inizia a mettere quelle "stringhe" lunghissime... ho provato a mettere un delay sulla trasmittente ma non cambia nulla..


Ecco, questo invece è un bel problema ...
... perché ora il codice si comporta correttamente, ma ... ogni tanto, senza un'apparente ragione, sembra che vada in "overflow" NON controllato e sovrascriva la memoria ... e questo ... non dovrebbe comunque accadere, visto che c'è un apposito controllo sull'overflow ...  :smiley-roll:

Ci devo ragionare ...

Guglielmo
Search is Your friend ... or I am Your enemy !

Marcobz

Ahpperò... mica poco...

Potrebbe essere che MAXCHAR dopo un tot non viene preso in considerazione ? Che senso ha che per un pò va e poi sbrocca ?

gpb01

NO, quello non è possibile, invece mi sono accorto che nel codice che ti ho copiato all'inizio ... manca una riga ...  :smiley-roll:

Code: [Select]

#include <SoftwareSerial.h>                    //includo libreria
SoftwareSerial mySerial(10,11);                //assegno pin tx e rx

#define MAXCHAR  6
#define TERCHAR 0x0D

char inputString[MAXCHAR + 1];
char inChar;
byte strIndex;


void setup() {
 
  strIndex = 0;
  inputString[strIndex] = 0x00;
 
  Serial.begin(9600);
  mySerial.begin(9600);
}

void loop() {
 
  if (mySerial.available()) {
    inChar = mySerial.read();
    // se si vogliono vedere in HEX i caratteri che si ricevono
    // togliere il commento alla riga seguente
    Serial.print("Char ricevuto : ");
    Serial.println(inChar, HEX);
    if (inChar == (char) TERCHAR) {
      // è arrivato il carattere terminatore, si puo' elaborare la stringa
      // In questo esempio semplicemente la si stampa ...
      Serial.print("Stringa ricevuta : ");
      Serial.println(inputString);
      // finito il suo uso la si ripulisce per un uso successivo
      strIndex = 0;
      inputString[strIndex] = 0x00;
    }
    // NON è arrivato il carattere terminatore, si memorizza il carattere ricevuto
    // e si sposta il fine stringa ...
    inputString[strIndex] = inChar;
    strIndex++;
    inputString[strIndex] = 0x00;   // <<<<<<<<<<<<<<<<<<<<<<<< MANCAVA QUESTO
    if (strIndex > MAXCHAR) {
      // ... NON c'è pi` spazio nella stringa ... bisogna elaborarla e svuotarla
      // In questo esempio semplicemente la si stampa ...
      Serial.print("Overflow : ");
      Serial.println(inputString);
      //
      // e la si ripulisce per un uso successivo
      strIndex = 0;
      inputString[strIndex] = 0x00;
    }
  }
}


... e senza quella riga, manca il terminatore di stringa (0x00) e quindi ... quando va in stampa, succede di tutto e di più :)

Guglielmo

P.S. : Questo dovrebbe risolvere le stringhe lunghissime, ma non capisco perché, ogni tanto, riceva porcheria ... comunque aggiungi quella riga e dimmi come va ;)
Search is Your friend ... or I am Your enemy !

gpb01

... credo ci sia un'altra piccola correzione ...

Code: [Select]
if (strIndex > MAXCHAR) {

deve diventare :

Code: [Select]
if (strIndex >= MAXCHAR) {

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up