Salve a tutti,
primo post di primo...
Sto realizzando uno sketch che muoverà degli attuatori in base ai comandi che arrivano via seriale da un PC, e fin qui nulla di nuovo.
I dati che voglio comunicare ad arduino saranno in formato RAW, ovvero valori che vanno da 0 a 255, per cui voglio usare la strategia 'un byte -> un dato'.
Nelle mie prove ho notato però un comportamento curioso riguardo la comunicazione seriale, e qui la cosa si fa interessante:
finchè i valori che trasmetto sono compresi tra 32 e 126 (set di caratteri ASCII editabili) il dato ricevuto è corretto.
Ma se invio valori al di fuori di questo intervallo, il dato ricevuto è completamente falsato secondo una logica che mi sfugge.
Ad esempio, se il valore è al di sotto di 32, il dato ricevuto è sempre 63, mentre se è superiore a 126 il risultato non è prevedibile ( ma si ripete uguale quando riceve input uguali).
Vi sottopongo il codice incriminato, e più sotto i risultati ottenuti col monitor seriale, così che chi ne ha voglia possa sperimentare quanto dico:
//variabili globali
byte X_value = 0;
byte Y_value = 0;
byte Z_value = 0;
void setup() {
Serial.begin(19200); // apro la seriale
}
void loop() {
byte caratteri; //conta il numero di caratteri ricevuti
byte buff[4];
//controllo se c'è qualcosa in arrivo sulla seriale
if (Serial.available()) {
caratteri=Serial.readBytes(buff,4);
if (buff[0] == 's' ){
// Tutti i comandi in posizione neutra
X_value = 0;
Y_value = 0;
Z_value = 0;
}
if (buff[0] == 'C' ){
// legge i tre bytes successivi
X_value = (buff[1] > 255? 255: buff[1]);
Y_value = (buff[2] > 255? 255: buff[2]);
Z_value = (buff[3] > 255? 255: buff[3]);
}
Serial.print(X_value, BIN); Serial.print(" "); Serial.println(X_value, DEC);
Serial.print(Y_value, BIN); Serial.print(" "); Serial.println(Y_value, DEC);
Serial.print(Z_value, BIN); Serial.print(" "); Serial.println(Z_value, DEC);
analogWrite(X_out, X_value);
analogWrite(Y_out, Y_value);
analogWrite(Z_out, Z_value);
}
}
Qui gli output che ottengo dandogli per esempio 'CAAA', 'C~⌂Ç' (byte= 126, 127, 128) e 'Cüéâ' (byte= 129, 130, 131):
1000001 65
1000001 65
1000001 65
1111110 126
111111 63
11000111 199
11111100 252
11101001 233
11100010 226
Cercando in rete non ho trovato nulla che mi potesse aiutare.
Che voi sappiate è un problema noto, e quindi c'è la soluzione?
Oppure ho sbagliato qualche cosa nel codice?
Grazie in anticipo
Primo