Go Down

Topic: Comunicazione seriale arduino mega [RISOLTO] (Read 1 time) previous topic - next topic

Patrick_M

fammi il favore di provare questo con le due seriali...
Code: [Select]


#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11

SoftwareSerial softSerial =  SoftwareSerial(rxPin, txPin);

//--------------------------------
int CalcChannel(unsigned char ui8type, unsigned char ui8Msb, unsigned char ui8Lsb)  {
   int ui8Temp;
   if (ui8type == 0) {
      ui8Temp = ui8Msb * 256 + ui8Lsb;
   }
   if (ui8type == 1) {
      ui8Temp = ui8Msb * 256 + ui8Lsb;
      ui8Temp = ui8Temp - 2048;
   }
   return (ui8Temp);
}
//--------------------------------
unsigned int ui8Buffer[8][2];
unsigned int ui16Idx = 0;
unsigned int ui8CheckSum = 0;
//--------------------------------
//
void setup()  {
   pinMode(rxPin, INPUT);
   pinMode(txPin, OUTPUT);
   softSerial.begin(9600);
   //Serial1.begin(9600);
   Serial.begin(9600);
   Serial.println ("test lettura seriale hw");
}
void loop() {
   // send data only when you receive data:
   if (softSerial.available() > 0) {                        // per arduino1
      //if (Serial1.available() > 0) {                      // per arduino mega
      if (softSerial.read() == 0x55) {                      // per arduino1
         //   if (Serial1.read()==0x55) {                   // per arduino mega
         Serial.println(0x55);
         ui8Buffer[0][0] = 0x55;
         ui8Buffer[0][1] = 0;
         do {
            if (softSerial.available() > 0) {               // per arduino1
               //if (Serial1.available() > 0) {             // per arduino mega
               Serial.println (ui16Idx);
               ui16Idx++;
               ui8Buffer[ui16Idx][0] = softSerial.read();   // per arduino1
               //ui8Buffer[ui16Idx][0] = Serial1.read();    // per arduino mega
               ui8Buffer[ui16Idx][1] = ui16Idx;
               Serial.println (ui8Buffer[ui16Idx][0]);
            }
         } while (ui16Idx <= 8);

         //Calcolo del check sum
         ui8CheckSum = 0;
         for (ui16Idx = 0; ui16Idx < 7; ui16Idx++) {
            ui8CheckSum = ui8CheckSum + ui8Buffer[ui16Idx][0];
         }
         Serial.println ("mio checksum");
         Serial.println (ui8CheckSum);
         if (ui8CheckSum == ui8Buffer[7][0]) {

            Serial.println("checksum calcolato:");
            Serial.println(ui8CheckSum);
            Serial.println("Pacchetto ricevuto:");

            Serial.println("Lettura del primo canale:");
            if (ui8Buffer[1][0] == 0) Serial.println("ph:");
            if (ui8Buffer[1][0] == 1) Serial.println("rx:");
            Serial.println(CalcChannel( ui8Buffer[1][0], ui8Buffer[2][0], ui8Buffer[3][0])); //calcola il valore
            //
            Serial.println("Lettura del secondo canale:");
            if (ui8Buffer[4][0] == 0) Serial.println("ph:");
            if (ui8Buffer[4][0] == 1)Serial.println("rx:");
            Serial.println(CalcChannel( ui8Buffer[4][0],  ui8Buffer[5][0],  ui8Buffer[6][0])); //calcola il valore

         } else {
            Serial.println("checksum error:");
         }
      }
   }

}
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

fafidio

#31
Aug 10, 2018, 11:10 pm Last Edit: Aug 10, 2018, 11:11 pm by fafidio
questo è quello che ottengo con la seriale hw:

85
7
2
8
183
mio checksum
678
checksum error:
85
7
2
8
183
mio checksum
678
checksum error:
85

questo è quello della softserial:
85
7
0
8
2
mio checksum
283
checksum error:
85
7
0
8
2
mio checksum
283
checksum error:
85

A parità di dati inviati dal dispositivo pic

Sulimarco

Sembra un problema di temporizzazione, cioe' baud rate fuori tolleranza o errato numero di bit di stop.
Potrebbe essere anche un problema di livelli di tensione ...

A mio parere risolvi il problema solo se confronti accuratamente il segnale di tx generato dal tuo dispositivo con quello di una Arduino che trasmette gli stessi dati, alla stessa velocita'.
Intendo confrontarli usando un oscilloscopio.

Ciao
Marco

Patrick_M

#33
Aug 11, 2018, 12:21 am Last Edit: Aug 11, 2018, 12:22 am by Patrick_M
bene almeno ora non funzionano ma danno dati coerenti ed entrambi sbagliano il checksum, quindi non è nel funzionamento hardware il problema ma come dall'inizio è probabile che sia un problema di interpretazione dei dati.... hai provato a leggere tutti e 8 i byte della trasmissione e a verificare il checksum sulla carta?

per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Standardoil

Quindi adesso non va con nessuna seriale?
Ma quando non andava ti diceva almeno checksum error oppure non stampava proprio nulla?
Comunque l'ultimo programma è sbagliato e non andrà mai
Checksum deve essere byte, non int
Non ricominciamo a fare gli stessi errori di due mesi fa
Il protocollo è gia stato compreso, il programma usato andava alla perfezione
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

Patrick_M

#35
Aug 11, 2018, 08:29 am Last Edit: Aug 11, 2018, 08:35 am by Patrick_M
non ho verificato tutto.... ho solo eliminato il casting delle variabili :) si è vero in check deve essere byte.... ma in questo caso è unsigned int quindi non credo abbia fatto danni.
Quello che vedo è che i due risultati sono coerenti, con la stessa seriale i numeri sono sempre quelli (sia una che l'altra)
vedo anche che ricevi solo 5 valori al posto di 8....
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

fafidio

Ciao Nelson,


ho fatto il test con il software fornito con il dispositivo pic solo per essere certo di non aver cambiato qualcosa nel codice.

Sia con il tuo programma che con quello originale fornito, la lettura avviene correttamente solo tramite softserial e non come vorrei sulle seriali hw.

E' apparentemente inspiegabile la cosa, perchè in teoria se legge con la simulata, dovrebbe leggere anche con la hw, e invece il risultato è che alcuni dati arrivano corrotti.

Le seriali hw non sembrano danneggiate, altrimenti non avrebbero letto neanche i dati errati.
Sembrerebbe che la seriale simulata sia più sensibile dell'altra, ma ciò non è razionale.

fafidio

#37
Aug 11, 2018, 08:39 am Last Edit: Aug 11, 2018, 08:44 am by fafidio
non ho verificato tutto.... ho solo eliminato il casting delle variabili :) si è vero in check deve essere byte.... ma in questo caso è unsigned int quindi non credo abbia fatto danni.
Quello che vedo è che i due risultati sono coerenti, con la stessa seriale i numeri sono sempre quelli (sia una che l'altra)
vedo anche che ricevi solo 5 valori al posto di 8....
sinceramente non vedo dati coerenti, tranne la lettura iniziale (cioè lo 0x55 che corrisponde ad 85) e il primo dato (cioè 7), il resto è differente.

In teoria, inviando gli stessi dati avremmo dovuto avere risultati identici.

Patrick_M

intendo che sulla stessa seriale i dati si ripetono uguali e non ogni volta numeri diversi o a caso
85
7
2
8
183
mio checksum
678
checksum error:
85
7
2
8
183
mio checksum
678
checksum error:
85

resta però che sono 5 al posto di 8
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

fafidio

questo succedeva anche prima... sembra interpretare male il dato ricevuto, ma non a casaccio, piuttosto con una regola tutta sua.

Standardoil

Ah che confusione
Sono in ferie dal furbofono, quindi vi prendete frasi brevi e dirette, non ho tastiera...
1 con il programma originale non è mai andato, che cavolo di prova sarebbe?
2 si deve usare byte e non int perché si confronta con byte e serve di scartare il riporto delle somme progressive
3 se lo op avesse detto subito che il problema non era di letture assente, ma di checksum adesso saremmo un passo avanti, ma a questo sono abituato, ho sempre dovuto capire il problema a distanza
4 non è solo che i byte stampati sono 5 invece di 8, è che proprio non stampa il numero del byte, nel programma c'è
Serial.println (ui16Idx);
Che non viene eseguita
Questo cosa significa?
Che sulla mega NON è caricato il programma giusto
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

Standardoil

Ok, ricomincio, dopo aver strucato il bottone sbagliato sul furbofono
Dicevo che c'è ampia confusione, in questa discussione
È necessario che lo op faccia un po' di chiarezza nelle prove che ha fatto, e spieghi bene che risultati ha ottenuto
"Non va" è molto differente da "non riceve" o da "checksum error" e indicano problemi differenti
Spiega bene cosa hai fatto tra quando andava e quando ha smesso di andare
E spiega anche perché hai pensato di usare una sw serial, dato che prima andava alla grande qualcosa è successo, ne sono certo
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

fafidio

ok cerco di fare un po' di chiarezza ricominciando e facendo le prove passo a passo:

il dispositivo che funzionava con il tuo programma d'un tratto senza una ragione non ha più funzionato sulla Mega.
Allora ho ripreso il programma fornito con il controlle e l'ho testato con una UNO: dato che la Uno non ha Serial1 ho adattato il codice con una softserial e conto ogni ragione logica ha funzionato.

Così ho preso la Mega, ho caricato il tuo codice con una seriale simulata e funziona perfettamente.
Adatto il codice con una Serial1 e il codice legge male;

di seguito ciò che vedo a video con il tuo codice adattato con softserial sui pin10 e 11 (utilizzo solo il 10)

alore attuale Ph: 438

Valore attuale Redox: 317
 Aggiornato rispetto ultima lettura
Ph value
4.16
Redox value
317.00
Valore attuale Ph: 416
 Aggiornato rispetto ultima lettura
Valore attuale Redox: 317

Ph value
4.16
Redox value
322.00
Valore attuale Ph: 416

Valore attuale Redox: 322


Questo è invece ciò che vedo quando carico il codice con Serial1:

Ph value
0.00
Redox value
0.00
Valore attuale Ph: 0

Valore attuale Redox: 0

Ph value
0.00
Redox value
0.00
Valore attuale Ph: 0

Penso di aver eseguito le modifiche in maniera corretta.


Standardoil

Quanto lungo il cavo tra phmetro e arduino?
Alimentazione in comune?
Prima legge di Nelson (che sono io):
A parità di risultato
maggiore è il pensiero,
minore il lavoro.
Quindi prima di fare pensa!

fafidio


Go Up