Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Rs232 poco stabile

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto Utentexyz, Foto UtenteWALTERmwp

0
voti

[1] Rs232 poco stabile

Messaggioda Foto Utentewimatech » 3 apr 2022, 19:31

Buongiorno a tutti,
Mi hanno dato un distanziometro laser che comunica con il PC tramite un adattatore, questo:
dofly.PNG

Ho fatto un programmino in VB net e comunica perfettamente.
Ho poi tolto la schedina e l'ho collegata all'arduino Mega, invio il comando di lettura e poi mi metto in "ascolto" della misura, il sistema funziona ma ogni tanto alcuni byte ritornano errati.

Il comando di lettura lo mando così:
Codice: Seleziona tutto
byte CmdFastMeasure[] = {0xAA,0x00,0x00,0x20,0x00,0x01,0x00,0x02,0x23};//Cmd lettura
char Cmd;
const int BUFFER_SIZE = 13;
byte Buff[BUFFER_SIZE];

Serial1.write(CmdFastMeasure,9);


La ricezione e stampa a monitor così:
Codice: Seleziona tutto
  if(Serial1.available() > 0) {
    Serial1.readBytes(Buff,BUFFER_SIZE);

    if (Buff[0]==0xAA){
     
      for( int i=0; i<BUFFER_SIZE; i++ ){
        Serial.print(Buff[i],HEX);
        Serial.print(" - ");       
      }
     
        Serial.println("");
      for( int i=0; i<BUFFER_SIZE; i++ ){
        Serial.print(Buff[i],DEC);
        Serial.print(" - ");       
      }
        Serial.println("");

        int A = Buff[9];
        int B = Buff[8];
        int C = Buff[7];
        int D = Buff[6];
        int Tot = A +(B*256) + (B*256*256) + (A*256*256*256);
        Serial.print(Tot);
    }
  }


I byte 6,7,8,9 contengono la misura che interessa a me ma alcune volte soprattutto il byte 8 ha valore 0 inaspettatamente, alleo alcune misure (la misura che mi aspetto è 5120):

Codice: Seleziona tutto
AA - 0 - 0 - 22 - 0 - 3 - 0 - 0 - 14 - 0 - 0 - 2 - 8E -
170 - 0 - 0 - 34 - 0 - 3 - 0 - 0 - 20 - 0 - 0 - 2 - 142 -
5120
AA - 0 - 0 - 20 - 0 - 3 - 0 - 0 - 14 - 0 - 0 - 42 - 85 -
170 - 0 - 0 - 32 - 0 - 3 - 0 - 0 - 20 - 0 - 0 - 66 - 133 -
5120
AA - 0 - 0 - 22 - 0 - 3 - 0 - 0 - 15 - 0 - 0 - 32 - 7E -
170 - 0 - 0 - 34 - 0 - 3 - 0 - 0 - 21 - 0 - 0 - 50 - 126 -
5376
AA - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 8 - 0 - 3F - 81 -
170 - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 8 - 0 - 63 - 129 -
8
AA - 0 - 0 - 22 - 0 - 3 - 0 - 0 - 14 - 0 - 0 - 30 - 7A -
170 - 0 - 0 - 34 - 0 - 3 - 0 - 0 - 20 - 0 - 0 - 48 - 122 -
5120
AA - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 8 - 0 - 3B - 78 -
170 - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 8 - 0 - 59 - 120 -
8
AA - 0 - 0 - 22 - 0 - 3 - 0 - 0 - 14 - 0 - 0 - 30 - 7B -
170 - 0 - 0 - 34 - 0 - 3 - 0 - 0 - 20 - 0 - 0 - 48 - 123 -
5120
AA - 0 - 0 - 22 - 0 - 3 - 0 - 0 - 14 - 0 - 0 - 2 - 85 -
170 - 0 - 0 - 34 - 0 - 3 - 0 - 0 - 20 - 0 - 0 - 2 - 133 -
5120
AA - 0 - 0 - 20 - 0 - 2 - 0 - 0 - 0 - 9 - 0 - 3C - 7E -
170 - 0 - 0 - 32 - 0 - 2 - 0 - 0 - 0 - 9 - 0 - 60 - 126 -
9
AA - 0 - 0 - 20 - 0 - 3 - 0 - 0 - 14 - 0 - 0 - 38 - 7E -
170 - 0 - 0 - 32 - 0 - 3 - 0 - 0 - 20 - 0 - 0 - 56 - 126 -
5120
AA - 0 - 0 - 22 - 0 - 3 - 0 - 0 - 14 - 0 - 0 - 38 - 80 -
170 - 0 - 0 - 34 - 0 - 3 - 0 - 0 - 20 - 0 - 0 - 56 - 128 -
5120


Con l'adattatore USB la misura era molto più stabile, sbaglio qualcosa io nel programma o serve qualcosa di hardware? magari delle resistenze di pull/up o pull/down sui fili della seriale?
Avatar utente
Foto Utentewimatech
10 3
New entry
New entry
 
Messaggi: 63
Iscritto il: 24 feb 2022, 9:34

0
voti

[2] Re: Rs232 poco stabile

Messaggioda Foto Utenteboiler » 3 apr 2022, 19:45

Non so se è la causa del problema, ma questo è proprio brutto:
Codice: Seleziona tutto
  if(Serial1.available() > 0) {
    Serial1.readBytes(Buff,BUFFER_SIZE);


In questo modo, se raggiungi questa sezione nel codice proprio nel momento in cui stai ricevendo i dati, la seriale ha 1 byte disponibile e tu cerchi di leggerne 13.

Usa un while e restaci fino ad aver ricevuto tutti i bytes, che leggerai singolarmente dalla seriale, man mano che arrivano. Un timeout per uscire dal while in caso di una trasmissione parziale è fortemente raccomandato.

Boiler
Avatar utente
Foto Utenteboiler
20,7k 5 7 13
G.Master EY
G.Master EY
 
Messaggi: 4055
Iscritto il: 9 nov 2011, 12:27

0
voti

[3] Re: Rs232 poco stabile

Messaggioda Foto Utentewimatech » 3 apr 2022, 20:22

Quando esegue il comando readBytes il ciclo non si blocca finché non ha finito di leggerli tutti?

Consigli di fare una cosa così?
Codice: Seleziona tutto
  if(Serial1.available() > 0) {
    int i=0;
    while(Serial1.available() > 0) {
      Buff[i]=Serial1.read();
      i++;
    }
  }
Avatar utente
Foto Utentewimatech
10 3
New entry
New entry
 
Messaggi: 63
Iscritto il: 24 feb 2022, 9:34

0
voti

[4] Re: Rs232 poco stabile

Messaggioda Foto Utentenicsergio » 4 apr 2022, 8:11

La readBytes() attende la lettura del numero di byte specificati, è questa:

Codice: Seleziona tutto
size_t Stream::readBytes(char *buffer, size_t length)
{
  size_t count = 0;
  while (count < length) {
    int c = timedRead();
    if (c < 0) break;
    *buffer++ = (char)c;
    count++;
  }
  return count;
}


dove timeRead() legge di volta in volta un byte, con un controllo di timeout:

Codice: Seleziona tutto
int Stream::timedRead()
{
  int c;
  _startMillis = millis();
  do {
    c = read();
    if (c >= 0) return c;
  } while(millis() - _startMillis < _timeout);
  return -1;     // -1 indicates timeout
}


il timeout predefinito dovrebbe essere 1 secondo e si può impostare con:
Codice: Seleziona tutto
Serial.setTimeout(<ms>);



Non sono esperto in queste cose, ma anch'io comunque preferisco l'approccio di Foto Utenteboiler, magari con l'utilizzo di un carattere fisso di inizio trasmissione ed uno di fine (terminatore).
Avatar utente
Foto Utentenicsergio
3.977 3 9 13
Master
Master
 
Messaggi: 685
Iscritto il: 1 gen 2020, 16:42

0
voti

[5] Re: Rs232 poco stabile

Messaggioda Foto Utenteboiler » 4 apr 2022, 9:56

Se la funzione blocca il processo, allora va bene anche così.
Ammetto di non avere dimestichezza con Arduino.

Per tornare al problema iniziale, un oscilloscopio aiuterebbe a verificare cosa succede sulla linea.

Boiler
Avatar utente
Foto Utenteboiler
20,7k 5 7 13
G.Master EY
G.Master EY
 
Messaggi: 4055
Iscritto il: 9 nov 2011, 12:27

0
voti

[6] Re: Rs232 poco stabile

Messaggioda Foto UtenteMarcoD » 4 apr 2022, 10:59

Ho poi tolto la schedina e l'ho collegata all'arduino Mega, invio il comando di lettura e poi mi metto in "ascolto" della misura, il sistema funziona ma ogni tanto alcuni byte ritornano errati.

Solo per mia curiosità HW: lo hai collegato alla presa USB di arduino, o a una delle porte seriali ?. Non ricordo bene, mi pare che qualcuna sia a livello TTL. O_/
Avatar utente
Foto UtenteMarcoD
10,3k 5 9 13
Master EY
Master EY
 
Messaggi: 5242
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[7] Re: Rs232 poco stabile

Messaggioda Foto Utentewimatech » 4 apr 2022, 11:37

nicsergio : Stasera applico le modifiche che mi hai segnalato e provo

MarcoD : Quando testavo con la schedina avevo la schedina collegata all'USB del PC e usavo un programma scritto in VBnet poi ho scollegato la schedina e ho collegato il laser direttamente alla COM1 di arduino Mega e a sua volta avevo il Mega collegato in USB al PC e per vedere cosa viene letto dal laser Arduino rispedisce il valore al PC
Avatar utente
Foto Utentewimatech
10 3
New entry
New entry
 
Messaggi: 63
Iscritto il: 24 feb 2022, 9:34

0
voti

[8] Re: Rs232 poco stabile

Messaggioda Foto Utenteboiler » 4 apr 2022, 11:47

Marca e modello del misuratore laser?

Boiler
Avatar utente
Foto Utenteboiler
20,7k 5 7 13
G.Master EY
G.Master EY
 
Messaggi: 4055
Iscritto il: 9 nov 2011, 12:27

0
voti

[9] Re: Rs232 poco stabile

Messaggioda Foto Utentewimatech » 4 apr 2022, 11:52

Vedo di recuperarli
Avatar utente
Foto Utentewimatech
10 3
New entry
New entry
 
Messaggi: 63
Iscritto il: 24 feb 2022, 9:34

0
voti

[10] Re: Rs232 poco stabile

Messaggioda Foto UtenteMarcoD » 4 apr 2022, 11:53

● Serial: 0 (RX) and 1 (TX); Serial 1: 19 (RX) and 18 (TX); Serial 2: 17 (RX)
and 16 (TX); Serial 3: 15 (RX) and 14 (TX). Used to receive (RX) and transmit
(TX) TTL serial data. Pins 0 and 1 are also connected to the corresponding pins of the
ATmega8U2 USB-to-TTL Serial chip


Se è un serial TTL, perché, nel titolo, lo hai chiamato RS232 ?
Avatar utente
Foto UtenteMarcoD
10,3k 5 9 13
Master EY
Master EY
 
Messaggi: 5242
Iscritto il: 9 lug 2015, 16:58
Località: Torino

Prossimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti