Comunicazione seriale arduino mega [RISOLTO]

@Uwe

In che senso cortocircuitare tx rx? a che scopo?

Le prove di inversione sono state già effettuate senza alcun risultato.

Comunque anchio credo di avere um problema simile con la Mega ed il bluetooth.

E’ possibile sapere cos’e’ il dispositivo sconosciuto, o e’ sconosciuto in senso assoluto?

Ciao
Marco

un semplice dispositivo che trasmette dati sulla seriale arduino Mega che grazie all'aiuto di Nelson abbiamo correttamente configurato con lo sketch postato e che fino a poco tempo fa ha funzionato perfettamente, ma purtroppo ora sta creando non pochi problemi.....

@Puso
cosa di preciso fa con la bluetooth?

In che modo il semplice dispositivo pilota la linea seriale?

Buongiorno a tutti.

Aggiorno il post sperando in un aiuto per un problema inspiegabile.
Il codice seguente dato dal fornitore del dispositivo basato su pic che “dovrebbe” inviare i dati al mio arduino mega (anzi lo ha sempre fatto ma ora non più), mi permette di leggere sulle porte seriali e stampare i valori riscontrati di ph e redox.
Naturalmente il codice è sia per l’uso con softserial che Serial1.

Di seguito uno screenshot di ciò che leggo a parità di dati inviati dal dispositivo sulla porta seriale simulata e su una delle seriali hardware di arduino mega.

Premetto che ho provato a testare le seriali hw di mega e funzionano perfettamente.
Come si può evincere dall’immagine, entrambe le seriali leggono perfettamente il dato iniziale 0x55 (cioè 85), ma successivamente nell’indice da 1 a 8 i valori sono decisamente errati.
Come è possibile che la seriale simulata legge correttamente i dati che arrivano mentre la seriale hardware legge dai errati?

Spero vivamente in un aiuto per dare una spiegazione logica al problema.

Grazie a tutti in anticipo.

#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);
}
//--------------------------------
int ui8Buffer[8][2];
int ui16Idx=0;
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);
                      
                      ui16Idx=0;                    
                      ui8CheckSum=0;

//Calcolo del check sum 
          
        for (ui16Idx=0;ui16Idx<7;ui16Idx++){
        
        ui8CheckSum = ui8CheckSum + ui8Buffer[ui16Idx][0];
        }
       
     Serial.println ("mio checksum");
     Serial.println (ui8CheckSum);
      ui16Idx=0;
        if (((unsigned char)ui8CheckSum)==ui8Buffer[7][0]){
          
          Serial.println("checksum calcolato:");
          Serial.println((unsigned char)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((unsigned char) ui8Buffer[1][0], (unsigned char) ui8Buffer[2][0], (unsigned char) 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((unsigned char) ui8Buffer[4][0], (unsigned char) ui8Buffer[5][0], (unsigned char) ui8Buffer[6][0])); //calcola il valore  
          //
                  
         }
         else {
          Serial.println("checksum error:");
         }
         ui16Idx=0;
}
}


}

ecco lo screenshot

Ma la seriale sw è sulla stessa mega delle hw che non vanno?
E la mega che non va è la stessa che andava due mesi fa?

Esatto, è la stessa mega di due mesi fa!
Sulla stessa mega la seriale simulata sui pin rx 10 e tx 11 (ma io collego solo rx), mentre sulla serial1 oppure serial2 oppure serial3 la trasmissione è corrotta.

Ho provato anche con un'altra mega, stesso risultato.

Dubito che sia un problema di hardware.

Sembra che stampi bene l'indice, ma il dato non arriva correttamente: arrivano dati a caso senza senso.

Simula la soft sugli stessi piedini della hw1
Se non usi la hw1 i suoi piedini sono liberi per la soft

fammi il favore di provare questo con le due seriali…

#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:");
         }
      }
   }

}

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

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

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?

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

non ho verificato tutto.... ho solo eliminato il casting delle variabili :slight_smile: 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....

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.

Patrick_M:
non ho verificato tutto.... ho solo eliminato il casting delle variabili :slight_smile: 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.

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

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