Comunicazione seriale


salve tutti sono ancora io! :p
volevo verificare un dubbio che mi è venuto sulla comunicazione seriale. come ho già scritto in un precedente post sto costruendo un cubo led 8x8x8. per comandare l'accensione diretta dei led uso arduino, mentre per decidere quali led utilizzare uso un programma in c# scritto da me. tramite quest'ultimo io ho la possibilità di creare le animazioni grazie all'interfaccia grafica. in particolare creo frame per frame e li concateno uno dietro all'altro per poi salvarli in un file. in sostanza l'idea era quella di passare un frame per volta ad arduino in modo che lui lo accendesse. io passo quindi una riga per volta (8 byte) di una matrice tridimensionale che rappresenta appunto il mio frame. il codice del ciclo è qualcosa de tipo:
code: [select]

for (z = 0; z < 8; z++)
{
       for (y = 0; y < 8; y++)
        {
                 for (x = 0; x < 8; x++)
                 {
                  //scrivi un byte
                  }
        }
}
di seguito io gli faccio aspettare un tempo che è il prodotto del tempo che arduino ci mette ad accendere per una volta tutti piani (considerando che accendo un solo piano per volta) e il numero di volte che deve ripetere tale accensione in modo da far si che si possa vedere anche ad occhio nudo. in particolare il numero di volte dipenderà da un valore che passo precendentemente.
il programma "lato arduino" sarà invece questo:
code: [select]

void loop()
{
  byte leggi = 0;
  while(serial.available())
  {
    //legge per prima cosa il numero di frame in modo da sapere il numero di cicli che deve fare
    if(nframe == 0)
    {
      nframe = serial.read();
    }
    //se si tratta degli stati dei led allora li aggiunge alla matrice
    else
    {
      //legge la durata del frame
      freq = serial.read();
      //legge un byte per volta e lo mette nella matrice di byte
      for(int z = 0; z < 8; z++)
      {
        for(int y = 0; y < 8; y++)
        {
          for(int x = 0; x < 8; x++)
          {
            mat[x][y][z] = serial.read();
          }
        }
      }
      //freq è il parametro, passato anch'esso da seriale, che stabilisce quanto un frame deve "rimanere" acceso
      //così facendo la frequenza di aggiornamento dei frame di un'animazione non sarà costante.
      //freq indica quindi il numero di cicli da eseguire
      for(int = 0; < freq; i++) accendi(mat);
    }
  }
}

la mia domanda è: c'è un modo per essere sicuri che ogni volta che il programma in c# scrive quello su arduino legga? voglio dire così come l'ho impostato dovrebbero essere già sincronizzati nella scrittura/lettura due programmi?

ti conviene usare la easytransfert e trasferisci in blocco la matrice senza impazzire con protocolli di trasmissione.
--> http://www.billporter.info/2011/05/30/easytransfer-arduino-library/
--> https://github.com/madsci1016/arduino-easytransfer


se vuoi avere una visualizzazione in tempo reale ti conviene passare le varie righe con dei byte iniziali che definiscono la posizione.
cosi leggendoli sai dove collocarli nella matrice.
ti conviene aggiungere anche un carattere di stop.


Arduino Forum > International > Italiano > Generale (Moderator: leo72) > Comunicazione seriale


arduino

Comments

Popular posts from this blog

opencv3, tbb and rasp pi 2 - Raspberry Pi Forums

small ethernet problem - Raspberry Pi Forums

Multithumb configuration params not working? - Joomla! Forum - community, help and support