Go Down

Topic: Ricevere via Seriale tutte le variabili Booleane di 3 Array Bidimensionali! (Read 644 times) previous topic - next topic

Elius94

Ciao Ragazzi, sto cercando di escogitare un metodo per ricevere continuamente, via seriale, i valori di 3 Array bidimensionali:

Code: [Select]
boolean REDvalue[4][4] = {
 {true,true,true,true},
 {true,true,true,true},
 {false,false,false,false},
 {true,true,true,true}
};

boolean GREENvalue[4][4] = {
 {true,true,true,true},
 {false,false,false,false},
 {true,true,true,true},
 {true,true,true,true}
};
boolean BLUEvalue[4][4] = {
 {false,false,false,false},
 {true,true,true,true},
 {true,true,true,true},
 {true,true,true,true}
};


Vorrei fare in modo di ricevere in continuazione, via seriale, tutti i valori di quegli array binari (booleani),

un idea ce l'avrei, usare un 3 cicli for che da 0 a 3, mettano ti valori di ogni fila dell'array, assegnandoli al valore serial read:

Code: [Select]
void loop() {

  // send data only when you receive data:
  if (Serial.available() > 0) {

    for(n2=0; n2<4; n2++){
      for(n=0; n<4; n++) {
        REDvalue[n2][n] = Serial.read();
      }
    }

    for(n2=0; n2<4; n2++){
      for(n=0; n<4; n++) {
        BLUEvalue[n2][n] = Serial.read();
      }
    }

    for(n2=0; n2<4; n2++){
      for(n=0; n<4; n++) {
        GREENvalue[n2][n] = Serial.read();
      }
    }
  }
}


Non l'ho ancora provato, prima devo creare un programma in c++ che controlli quelle variabili dal pc, comunque, in teoria dovrebbe funzionare, però non so come faccia a riconoscere quale dei valori inviati dal computer sia quello giusto, e che quindi magari riceva valori sfasati, e non sincronizzati, che dite?

Grazie :D

leo72

Usa un piccolo protocollo. Metti un byte di start e uno di stop per racchiudere i valori tra 2 estremi, poi puoi usare anche un piccolo checksum come CRC16/32:
http://arduino.cc/forum/index.php/topic,161221.0.html

Elius94

O mio Dio, che stupido! E dire che studio a scuola Telecomunicazioni
Ho appena studiato i protocolli, come l'xmodem, e tanti altri!
Oltre ai protocolli, conosco anche i codici , come il crc, il codice di paritá ed il codice di maggioranza, effettivamente ci avevo pensato, ma mi ero chiesto se nella libreria seriale dell'arduino, ci fosse giá un protocollo software per la correzione dei bit errati, grazie!.

leo72

Che io sappia nell lib di Arduino non c'è nessuna funzione per il controllo dei byte errati.

Elius94

Oook, sai darmi un esempio di utilizzo di bit di start o di stop, oppure nell'utilizzo di un protocollo sincrono (per velocizzare)?
Magari un tuo vecchio skatch :)

PaoloP

Se vuoi trasferite i dati in blocco ti può essere utile la librerie EasyTransfer (https://github.com/madsci1016/Arduino-EasyTransfer)
Si tratta di creare una struttura dati che viene trasferita tra 2 Arduino. --> http://www.billporter.info/2011/05/30/easytransfer-arduino-library/



Elius94

Ok, sto cercando di creare un sistema con bit di start e bit di stop, come il protocollo XON e XOFF, comelo fareste voi?


astrobeed


Ok, sto cercando di creare un sistema con bit di start e bit di stop, come il protocollo XON e XOFF, comelo fareste voi?


Stai facendo un sacco di confusione tra protocollo di trasmissione, protocolo uart e handshake, l'UART gestisce in hardware la trasmissione del byte con tanto di relativi bit di start e stop, XON e XOFF sono due fossili dell'era passata, si usavano al posto del handshake hardware, e sono stati pensionati da molti anni.
Quello che a te serve è un protocollo trasmissione dati, ne esistono tanti più o meno complessi e sicuri a seconda di quello che devi fare, prova a cercare modbus e trovi librerie pronte all'uso sia per Arduino che per il PC.

Elius94

ok, questo l'avevo caito, scusate, mi sono espresso male!
La connessione che dovrei fare, è davvero semplice, quindi ho fatto una cosa del genere! che ne dite?

Code: [Select]
// send data only when you receive data:
 if (Serial.available() > 0) {
  if (Serial.read() == 0xCD){
   StringComplete = false;
   for(n2=0; n2<4; n2++){
     for(n=0; n<4; n++) {
       REDvalue[n2][n] = Serial.read();
     }
   }

   for(n2=0; n2<4; n2++){
     for(n=0; n<4; n++) {
       BLUEvalue[n2][n] = Serial.read();
     }
   }

   for(n2=0; n2<4; n2++){
     for(n=0; n<4; n++) {
       GREENvalue[n2][n] = Serial.read();
     }
   }
  }
  if (Serial.read() == 0xDC){
  StringComplete = true;
  }
 }

Che ne dite?

usare i tag code per favore

leo72


Go Up