E' da un paio d'ore che mi sto scervellando per risolvere questo problema ma non riesco ad arrivare ad una conclusione.
Quindi, prima di andare a dormire vi chiedo un aiuto.
Voglio inviare dati tra raspberry e arduino in entrambe le direzioni, però il Serial.read() permette di leggere un byte alla volta quindi ho pensato inviare una stringa di dati separati da una virgola. Per fare ciò ho bisogno di trasformare i dati che ricevo in decimali (ovvero per inviare 21 invio il 2 e poi l'1 e poi li unisco facendo ((2*10)+1) ).
Ho pensato di accumulare i dati in un vettore fino a quando non viene premuto invio (stavo simulando la virgola) ma non riesco nel mio tentativo.
int LED_1=11,LED_2=12,LED_3=13,x,y,z;
int SerialTotal,c=0,buf[3];
void setup(){
Serial.begin(9600);
pinMode(LED_1,OUTPUT);
pinMode(LED_2,OUTPUT);
pinMode(LED_3,OUTPUT);
}
void loop(){
if (Serial.available() > 0){
buf[c] = Serial.read()- '0';
c=c+1;
Serial.println(buf[c];
}
//Vedo se l'ultimo dato corrisponde ad un invio
if(buf[c]==-38){
c=0;
SerialTotal = ((buf[2]) + (buf[1]*10) + (buf[0]*100) );
Serial.print("I received: ");
Serial.println(buf[0]);
Serial.println(buf[1]);
Serial.println(buf[2]);
Serial.println(SerialTotal);
}
}
C'è una strada più veloce per quello che voglio realizzare?
Altrimenti, potreste dirmi gentilmente dove sbaglio? Grazie
Grazie PaoloP per il tuo suggerimento, ho cercato dove mi hai detto e in più ho girato in giro per internet e sono giunto a ciò che cercavo.
Posto il codice per chi in futuro dovesse incontrare il mio stesso bisogno:
//Alex96T 23/04/2014
//Streaming data with delimiters.
//After uploaded the code on your Arduino try to type:
// <125,25,3654,487,598,63>
const char sdel = '<'; //starting delimiter
const char edel = '>'; //starting delimiter
const int n_el = 6; //number of element to acquire
int el[n_el];
void processdata(){
if (Serial.read() == sdel){
for(int i=0;i<n_el;i++){
el[i]= Serial.parseInt();
}
if (Serial.read() == edel){
for(int i=0;i<n_el;i++){
Serial.println(el[i]);
}
}
}
}
void setup(){
Serial.begin(115200);
}
void loop(){
while (Serial.available() > 0){
processdata();
}
}
Invece mi si presenta un altro problema, ovvero non riesco a inviare e trasmettere dati dal raspberry ad arduino.
Questo è il codice in python:
import serial
ser = serial.Serial('/dev/ttyACM0',115200)
while True :
ser.write('34') #invio un dato
ser.readline() #leggo la seriale
Su arduino è caricato un semplice programma che legge la seriale e printa carattere dopo carattere (sempre in seriale).
La velocità è impostata su entrambe le schede a 115200... non so proprio dove sto sbagliando..
La butto li, non sò se questo può essere il problema. Raspberry di solito usi un sistema Linux, la seriale potrebbe avere i permessi di lettura per il tuo utente e non quelli in scrittura. E' solo una idea.
paulus1969:
Se usi il sistema di prima, forse dovresti usare
ser.write ('<34>')
No, prima di provare quella tecnica ho caricato un semplicissimo programma che ricevuto in input dei dati li riscrive su seriale (legge seriale /scrive seriale). ho provato a fare delle prove sull'emulatore della seriale da pc e funziona (com3)
nid69ita:
la seriale potrebbe avere i permessi di lettura per il tuo utente e non quelli in scrittura. E' solo una idea.
Ho già provato a fare un test sola scrittura/sola lettura e funzionava..