Può essere una soluzione.
Oppure prima dell'invio spedisci un byte che indica cos'è che sta arrivando: magari "N" per numero e "S" per stringa. Il ricevitore, letto questo byte, si regola poi di conseguenza.
Io ho pensato di inviare numero e virogla e quando ho finito la trasmissione l'ultimo carattere cha invio è 'E'.
Oggi provo, per ora grazie mille.
Ciao, ho notato che if(val>='0' && val<='9')
la verifica non funziona.
Da processing faccio port.write(1) e la verifica funziona se la faccio così if(val>=0 && val<=9)
perchè?
Tieni conto che a volte nessuno ti risponde perchè non sappiamo. Io ad esempio Processing l'ho provato solo un paio di volte.
Amche su Arduino sono un neofita. Le risposte che ti dò sono sulla programmazione in C/C++ (sono un programmatore professionista) e a volte anche io posso scrivere c...azzate.
Da processing faccio port.write(1) e la verifica funziona se la faccio così
if(val>=0 && val<=9)
perchè?
Perchè port.write(1) dovrebbe spedire il valore uno come numero (byte), non come '1' carattere uno (che dovrebbe essere invece il valore 49 in quanto '0'=48 numero ascii)
Ok grazie mille.
Sta sera provo di nuovo.
C'è qualcosa che non quadra.
se da process faccio port.write(25)
e su arduino
val=Serial.read();
if(val>=10&&val<=90) readvalue[i]=val;
if(val==',') allora scrivo in eeprom: EEPROM.write(0,readvalue[i]);
Quando leggo dalla eeprom mi trovo il valore 44 scritto....che corrisponde alla virgola, perchè?
Boh, forse non capisco io, ma Arduino esegue quello che hai scritto nel codice (a meno che manchino dei pezzi).
Ma tu non fai solo la write di 25, se guardo il tuo primo msg, tu dici che fai
port.write(10); e subito dopo port.write(',');
Perciò in realtà hai provato con port.write(25); e subito dopo port.write(',');
val=Serial.read();
--- la virgola è 44 perciò esegue anche questa istruzione
if(val>=10&&val<=90) readvalue[i]=val;
--- val vale 44 perciò virgola quindi in eeprom cella 0 metti readvalue*, ovvero val ovvero virgola*
if(val==',') allora scrivo in eeprom: EEPROM.write(0,readvalue*);*
La fregatura è che spedire
port.write(44); oppure port.write(','); E' IDENTICO in quanto il valore ascii di ',' è 44
Dovresti scegliere un carattere/valore che non spedirai mai, ad esempio 255 oppure 0
*_ <em>* port.write(25); port.write(0);*</em> _*
Fra l'altro così potrai solo spedire da 0-255 come valore. Ti basta?
Oppure fai una cosa diversa, spedisci la cifra come caratteri:
*_ <em>* port.write("25"); port.write(',');*</em> _*
Allora il codice sopra funzione se nell'if metti
* if(val>='0' && val<='9') readvalue[i]=val; *
Grazie dei chiarimenti. 8)
Quindi dato che uso E come terminatore se faccio port.write('E') e il relativo controllo in arduino val=Serial.read(); val ora vale 69 giusto?
Per separare un numero dal successivo potrei usare 255 che tanto non lo userò mai (per fortuna), ma per evitare di tenere il conto di quanti caratteri ho ricevuto volevo usare un terminatore per la tx...non vedo soluzioni di invio di un carattere perchè dato che corrisponde ad un numero come posso fare?
Non comprendo.
Se invii byte/numeri ovvero port.write(69) viene difficile sapere se stai inviando il numero 69 oppure 'E'
Se invece invi caratteri, beh di solito si inviano da '0' a '9' e lettere da 'A' a 'Z' perciò puoi usare un qualsiasi carattere per separatore/terminatore, esempio # per separatore e $ per terminatore.
port.write("123"); // primo numero composto da 3 char
port.write("#"); // separatore numeri
port.write("45"); // secondo numero composto da 2 char
port.write("$"); // terminatore
dovresti ricevere 123#45$ che dovrai interpretare come 2 numeri, '1' '2' '3'->123 e '4' '5'->45
Praticamente così stabiliamo un PROTOCOLLO di comunicazione. Stabiliamo come interpretare i dati trasmessi.
Inoltre in questo modo i numeri sono a lunghezza variabile.
Sono d'accordissimo con ciò che hai detto.
In processing ho degli interi dentro un array da mandare, quindi come li scrivo in port.write()?
devo prima convertire l'intero in stringa e poi mandare la stringa? come si fa?
La comunicazione sono riuscito a farla ma inviando numeri e non stringhe, però sto cercando di uniformare il protocollo di comunicazione.
Ma quando invii il caraterre # arduino non riceve un numero?
Ciao,
io ora sto facendo così:
port.write(numero);
port.write(',');
port.write(numero);
port.write(',');
port.write('E');
Io alla fine mando una E, arduino la mette in val: val=Serial.read(); dove val è un char. Quindi in val c'è scritto E e non 69, sbaglio?
Sbagli. Devi ragionare come il computer, tu invii una 'E' che in ascii=69. Ovvero tu spedisci 69 che può essere interpretato (da te) come 69 numero o ascii 69 perciò 'E'.
Se spedisci numeri allora dovresti usare il valore 255 che dici non ti serve come numero.
port.write(numero); port.write(numero); port.write(255);
A questo punto il separatore non ti serve più perchè ogni byte è il tuo numero tranne 255 che il fine trasmissione.
OK grazie mille sei stato molto chiaro ed esaustivo oltre che paziente.
Sono in debito con te...se per caso hai bisogno di una mano per elettronica volentieri.
Ultima cosa. Se invece volessi mandare e ricevere dei float?
azz, un casino.
Un float è in realtà memorizzato in 4 byte (spezza mantissa ed esponente).
Si può fare ma per ricostruire alla ricezione il numero c'e' una tecnica un pò strana.
Non te lo consiglio.
Effettivamente in elettronica sono una capra!!! XD
Diciamo che non è cosi fondamentale avere dei float ma è per essere più accurato.
Riesci gentilmente a illustrarmi come fare?
Se hai bisogno in elettronica chiedi pure anche con mess privati.
Non l'ho mai fatto. Non mi è mai capitato. Ho letto che si può fare.
Necessario usare la copia in memoria diretta (memcpy):
memcpy (dest_struct, source_struct, sizeof (dest_struct));
la seconda variabile è un float, la prima un vettore di 4 byte, siccome un float su arduino=4 byte
Se il compilatore si rifiuta, allora affoghi il tutto in una struct (record)
struct { float mf; } sf;
struct { byte mvb[4]; } sb;
sf.mf=123.4;
memcpy (sb, sf, sizeof(sf));
in teoria dopo la memcpy dentro a sb.mvb[0] sb.mvb[1] sb.mvb[2] sb.mvb[3] dovresti avere il float "spezzato" in 4 byte
Sò però che ci possono essere molti problemi.