Pagina 1 di 3

Rs232 poco stabile

MessaggioInviato: 3 apr 2022, 19:31
da wimatech
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?

Re: Rs232 poco stabile

MessaggioInviato: 3 apr 2022, 19:45
da boiler
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

Re: Rs232 poco stabile

MessaggioInviato: 3 apr 2022, 20:22
da wimatech
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++;
    }
  }

Re: Rs232 poco stabile

MessaggioInviato: 4 apr 2022, 8:11
da nicsergio
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).

Re: Rs232 poco stabile

MessaggioInviato: 4 apr 2022, 9:56
da boiler
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

Re: Rs232 poco stabile

MessaggioInviato: 4 apr 2022, 10:59
da MarcoD
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_/

Re: Rs232 poco stabile

MessaggioInviato: 4 apr 2022, 11:37
da wimatech
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

Re: Rs232 poco stabile

MessaggioInviato: 4 apr 2022, 11:47
da boiler
Marca e modello del misuratore laser?

Boiler

Re: Rs232 poco stabile

MessaggioInviato: 4 apr 2022, 11:52
da wimatech
Vedo di recuperarli

Re: Rs232 poco stabile

MessaggioInviato: 4 apr 2022, 11:53
da MarcoD
● 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 ?