Inviare dati ad arduino da Flex

Ciao a tutti,
sto provando a inviare dei dati ad arduino, ma sono insicuro sull'approccio migliore.

I dati che devo inviare sono le coordinate 3d, di uno o più punti.

Inizialmente pensavo di concatenare le variabili X+Y+Z+IdentificativoPunto in una stringa e inviarla con la libreria firmata, ma non riesco a modificare i vari esempi che ci sono per questa libreria e comunque non vorrei prendere una strada sbagliata, mi vorrei affidare alla vostra esperienza.

Il massimo sarebbe poter inviare un array di punti, del tipo:

[{x:20, y:10, z:30, idPunto:"manoDestra"},
{x:20, y:10, z:30, idPunto:"manoSinistra"},
{x:20, y:10, z:30, idPunto:"gomitoDestro"}]

Grazie.

Dovresti crearti un protocollo di trasmissione dove il primo carattere indica l'id e i seguenti tre numeri l'x, la y e la z.
In ricezione memorizzi i 4 dati salvandoli in un array.
Non ti conviene inviare parentesi o cose più complicate che poi dovresti interpretare lato Arduino.

Ciao,
grazie per la risposta.

Quindi che tu sappia non esiste qualcosa di già fatto? nella comunicazione con i server utilizzo un protocollo AMF, quando invio o ricevo i dati sono già in un formato nativo per flash.

Anche l'invio di un xml andrebbe banissimo.... cavolo non avevo pensato a xml, ci saranno già delle librerie... ?

Forse in giro trovi qualche libreria per creare un parser xml su arduino.

Ancora grazie, avvolte serve proprio uno scambio di idee.

Ho trovato questo post con del codice che mi ha reso più chiaro come leggere la stringa.
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1158138779

Grazie ancora.

Nel codice del link al posto di tutti gli if potresti usare uno switch case :wink: (http://arduino.cc/en/Reference/SwitchCase)

direi che xml è troppo ridondante per una comunicazione (seriale) che è già lenta di suo.

[{x:20, y:10, z:30, idPunto:"manoDestra"},
{x:20, y:10, z:30, idPunto:"manoSinistra"},
{x:20, y:10, z:30, idPunto:"gomitoDestro"}]

questo mi pare un protocollo molto migliore, però eviterei la stringa che da il nome: tanto hai già l'id.al massimo crei una stringa apposta del tipo

idPunto:nome

così dici una volta sola l'id a quale nome corrisponde e sei a posto.

eviterei di inviare anche x: y: e z:, i valori separati da virgole vanno più che bene, anzi son più facili da gestire perchè fai una split sulla virgola e hai già i 4 valori che ti servono, senza ulteriori lavorazioni.

[{20,10,30, idPunto},
{20,10,30, idPunto},
{20,10,30, idPunto}]

Si in effetti, anche se esistono librerie che rendono tutto più semplice, preferisco trovare la soluzione più performante.

Non capisco una cosa, per quale motivo dovrei mettere i dati che mi arrivano in un array?

while (serialAvailable()){
strArray = serialRead();

  • i++;*
  • }*
    Quindi mi arriva la stringa come scomposta e la devo successivamente ricomporre?

i dati li metti dove vuoi, una struttura, un array, un'array di strutture...

Quindi mi arriva la stringa come scomposta e la devo successivamente ricomporre?

se intendi che non la laeggi tutta insieme, hai ragione. ma in base al tuo protocollo sai benissimo che ce la stringa iniza per < devi aspettare >, e se invece inizia per { devi aspettare }. tutti i dati che ricevi al di fuori di questi vanno scartati come dati corrotti.

Ottimo, ora mi sono chiare un paio di cose che non riuscivo a capire.

Ok, già con queste info, credo di poter creare un ciclo per decodificare una struttura di dati, ottimo, ti ringrazio.

Se ti vengono in mente delle dritte da darmi, fai pure.

Per ulteriore dritte potresti postare il codice mano a mano che lo sviluppi. :grin:
Qui siamo molto disponibili con chi condivide e ci da i mezzi per farsi aiutare. 8)

Ciao, finalmente sono riuscito a leggere i dati dalla seriale e convertirli in 3 valori numerici, che rappresentano le coordinate 3D inviate dal computer.
ho fatto veramente fatica a capire il funzionamento delle variabili in c++, ed ancora ora non credo di averle capite bene.
Dichiarando le variabili all'interno di una funzione, ho la certezza che usciti da qualle funzione venga liberata la memoria?

Ecco il codice di tutto il programmino per Arduino, inviando trmmite il monito della serviale una stringa del tipo "A11|12|13|" dovrebbe accendersi il led 13.

int x;
int y;
int z;


void setup()
{
  Serial.begin(57600);
  pinMode(13, OUTPUT); 
}

void loop()
{

}


boolean controlloPosizione3D(int posX, int posY, int posZ, int range){
//  Serial.println("boolean controlloPosizione3D(int posX, int posY, int posZ, int range)");
//  Serial.println("if(controlloPosizione(x,posX,range))");
  if(controlloPosizione(x,posX,range)){
//     Serial.println("if(controlloPosizione(y,posY,range))");
    if(controlloPosizione(y,posY,range)){
//       Serial.println("if(controlloPosizione(z,posZ,range))");
      if(controlloPosizione(z,posZ,range)){
//        Serial.println("return true;");
        return true;  
      }
    }
  }
//  Serial.println("return false;");
  return false;
}

// controlla se il valore A è vicino al valore B, utilizzando range come distanza per il controllo
boolean controlloPosizione(int valueA, int valueB, int range){
//  Serial.println("boolean controlloPosizione(int valueA, int valueB, int range)");
//  Serial.println("if((valueB + range) < valueA and  (valueB - range) > valueA)");
  if((valueB + range) > valueA and  (valueB - range) < valueA){
//    Serial.println("return true;");
    return true;
  }
//  Serial.println("return false;");
  return false;
}

void serialEvent() {
    readSerialString();
    if(controlloPosizione3D(10,10,10,20)){
        digitalWrite(13, HIGH);   // set the LED on
    } else {
        digitalWrite(13, LOW);    // set the LED off
    }
 }

void readSerialString () {
  char stringaParametri[10];
  int valori[3];
  int i = 0;
  int j = 0;
  while (Serial.available()){ 
    char inChar = (char)Serial.read();
    //Serial.println("inChar : " + String(inChar));
    stringaParametri[i] = inChar;
    if(inChar == '|'){
      //Serial.println("if(inChar == '|')");
      int valore = atoi(stringaParametri);
      valori[j] = valore;
      //Serial.println("j : " + String(j));
      //Serial.println("String(valori[j]) : " + String(valori[j]));
      i=0;
      j++;
    } 
    else {
      i++;
    }
  }

  x = valori[0];
  y = valori[1];
  z = valori[2];

  Serial.println("x : " + String(x));
  Serial.println("y : " + String(y));
  Serial.println("z : " + String(z));
}

lluuccaa:
Dichiarando le variabili all'interno di una funzione, ho la certezza che usciti da qualle funzione venga liberata la memoria?

certo. O meglio, le variabili dichiarate all'interno di un blocco ({ } per intenderci) muoiono al termine del blocco.

non ho guardato il codice, sono al lavoro e di fretta

Scusate, ma come mai non c'è nulla nel setup e nel loop e funziona ugualmente?

perchè la funzione serialEvent() viene chiamata in automatico dal micro quando arriva qualcosa via seriale. Però credo che sei sempre nel contesto interrupt, quindi è sbagliatisimo il fatto che il programma si basi su questa metodologia. La funzione dovrebbe riempire un buffer o cmq fare delle cose semplici, che poi vengono rilevate dal codice del loop che esegue la parte di logica "pesante".

Grazie.
Non conoscevo serialEvent().
Gestisce tutte le seriali? (Nel senso viene scatenata se qualunque delle 3 del MEGA riceve qualcosa)?
Ci sono altre funzioni del genere (diciamo generati da eventi generici)?

Però credo che sei sempre nel contesto interrupt, quindi è sbagliatisimo

Parli del programma in questione o di altro?
Qui stavo solo cercando di capire il codice.

Un mio interrupt la interromperebbe?
Esistono sezioni critiche?
Dovrei disabilitare (detachInterrupt) in serialEvent?
Dove trovo doc su queste cose.

La funzione dovrebbe riempire un buffer o cmq fare delle cose semplici, che poi vengono rilevate dal codice del loop che esegue la parte di logica "pesante".

Su fatto che interrupt e cose simili debbano eseguire codice essenziale mi è chiaro .

Grazie

trovi tutto sul reference: Arduino - Home

Arduino Mega only:
void serialEvent1(){
//statements
}

void serialEvent2(){
//statements
}

void serialEvent3(){
//statements
}

Parli del programma in questione o di altro?
Qui stavo solo cercando di capire il codice.

parlo della logica, del fatto che sta "sovraccaricando" l'interrupt