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:
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.
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... ?
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.
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.
Per ulteriore dritte potresti postare il codice mano a mano che lo sviluppi.
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));
}
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 .