Sto impazzendo!
Ho la necessità di inviare le letture di un encoder via seriale in modo da inviarle da modulo xbee e di riuscire a leggerle tramite l'altro modulo.
In particolare vorrei inviare i valori della velocità e della distanza con qualcosa di simile:
vel40
dist50
dove 40 e 50 sono i valori della velocità e della distanza.
Il problema è che riesco a inviare e riconoscere (dall'altro lato) le stringhe di caratteri, ma non capisco come fare a splittare le stringhe definendo eventualmente un carattere di delimitazione (una virgola o il carriage return).
Oppure se questo è un pò troppo complesso, mi basterebbe anche solo inviare i valori degli impulsi letti e poi fare i calcoli con i dati ricevuti sull'altro modulo però anche qui non riesco ad inviare unicamente degli interi perchè da quanto ho capito si possono solo inviare dei caratteri tramite Serial.print().
Sulla seriale i dati viaggiano per singoli byte per cui la stringa "vel40" che invii arriva come 5 caratteri distinti. Lato PC non devi far altro che riassemblare i singoli byte in un'unica stringa.
Allora fai in un modo più semplice, spedisci singoli byte. Ti crei un piccolo protocollo di trasmissione con un piccolo elenco dei "comandi" supportati.
Ad esempio (il $ indica valori in esadecimale):
$00 - vel
$01 - dist
$02 - butt la past
ecc...
Se poi i numeri che devi spedire stanno tutti in un singolo byte (che ricordo va da 0 a 255 come valori), puoi spedire subito il valore.
Esempio:
$00$32 per vel50
Sull'altro Arduino non devi fare altro che stare in ascolto sulla seriale. Appena arriva qualcosa, raccogli i byte. Sai che il primo è il comando, quindi ti serve ad interpretare il dato che arriva dopo. Lo assegni ad una variabile ed hai subito questa che contiene il valore spedito.
Se i valori possono essere maggiori, spedisci un int diviso in 2 byte e poi ricomponi il dato.
Esempio:
int dato=1000;
Serial.write(1); //comando per "dist"
Serial.write(highByte(dato)); //parte alta di "dato"
Serial.write(lowByte(dato)); //parte bassa di "dato"
Sull'altro Arduino ricomponi con
dato=Serial.read()*256; //rimetti a posto la parte alta
data = dato + Serial.read(); //aggiungi la parte bassa
Ciao leo, ti ringrazio per l'aiuto!
Tuttavia, la vedo un pò troppo difficile da implementare così come l'hai proposta e per quelle che sono le mie conoscenze..
Perché ragioni in termini di linguaggi più evoluti dove hai questi che protocollano la trasmissione dei tuoi dati mentre qui sei costretto a fare tutto tu
Invii una stringa ad esempio a120b123c123 e metti un ";" alla fine come fine della trasmissione! Ovviamente puoi inviare solo la "a" oppure aggiungere altre lettere per altre variabili!
Ho provato ad usare il codice per vedere come funzionava, però dando una stringa del tipo "a123b345c456;" non mi trova nulla e quindi non mi stampa nulla.
Non so se magari il problema è perchè uso Arduino 1.0.1 in cui la libreria NewSoftSerial è diventata SoftwareSerial..
Adesso funziona, ma dovuto sostituire tutte le occorrenze di NewSoftSerial con Serial standard, solo che comunque se gli mando degli interi grandi non li legge bene
Il problema è che i miei interi crescono al passare del tempo, quindi quella soluzione andrebbe bene all'inizio ma poi dopo no perchè gli interi a 4 cifre non sempre gli vanno a genio
Si si, però ho dovuto togliere la libreria newsoftserial perchè non mi funzionava bene e non mi leggeva nulla.
Utilizzo lo stesso codice, ma faccio tutto con Serial..
Guarda, a me funziona quello.. Ho messo pure qualche piccolo accorgimento nel caso in cui si volessero inviare solo alcuni valori e non tutti, tipo a100c101;
sketch_jul04b.cpp: In function 'void loop()':
sketch_jul04b:65: error: 'stoi' was not declared in this scope
sketch_jul04b:66: error: 'stoi' was not declared in this scope
sketch_jul04b:67: error: 'stoi' was not declared in this scope