Serial.write(50000);
Se non sbaglio vengono spediti due Byte, ma in che ordine?..Prima che più significativo o quello meno?
Serial.write(50000);
Se non sbaglio vengono spediti due Byte, ma in che ordine?..Prima che più significativo o quello meno?
Ragazzi sto usando questo codice:
Arduino:
void loop(){
//Trasmettitore
if (Serial.available()>1) {
Serial.readBytes(stringa, 2);
Attuale = ((stringa[0]<<8) | stringa[1]);
Serial.write(Attuale>>8);
Serial.write(Attuale);/*
Processing:
arduino.write(4000>>8);
arduino.write(4000);
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(arduino.available()>1){
byte[] lettura = new byte[2];
arduino.readBytes(lettura);
println(((lettura[0]<<8) | lettura[1]));
}
Perchè mi stampa sempre: -15356?
Non dovrebbe ristamparmi 4000?
E aggiungo..funziona fino a stampare numeri fino al 895..poi comincia a darmi numeri negativi partendo da -128..
che rigiro assurdo!
if (Serial.available()>1) {
Serial.readBytes(stringa, 2);
Attuale = ((stringa[0]<<8) | stringa[1]);
Serial.write(Attuale>>8);
Serial.write(Attuale);/*
non è meglio:
if (Serial.available()>1) {
Serial.readBytes(stringa, 2);
Serial.write(stringa[0]);
Serial.write(stringa[1]);/*
lo steso vale per processing... comunque vengono spediti prima i byte più a destra
Grazie Lesto. Ma ho ancora qualche problema..in pratica perdo dei bit mi sa
Guarda questo codice Processing:
byte z1 = (byte)(4500>>8);
byte z2 = (byte)(4500);
int z3 = ((z1<<8)+ z2);
println(z3);
Mi stampa sempre 4244, perchè perdo 256? :astonished:
Aggiungo:
byte z1 = (byte) (4500>>8);
println(Integer.toBinaryString(z1));
byte z2 = (byte)(4500);
println(Integer.toBinaryString(z2));
Risultato:
10001
11111111111111111111111110010100
perchè il secondo Byte me lo stampa con 32 cifre ? non dovrebbero essere 8?
Forse qua però sto sbagliando io..
Integer in java è a 32bit, quindi ok
byte z1 = (byte)(4500>>8);
byte z2 = (byte)(4500);
int z3 = ((z1<<8)+ z2);
println(z3);
diventa
byte z1 = (byte)(4500>>8);
byte z2 = (byte)(4500);
int z3 = (( ((int)z1)<<8)+ z2);
println(z3);
in pratica l'operazione viene eseguita tra byte non combini nulla di buono. devi essere sucuro che i campi risultato siano grandi abbastanza (in questo caso forzando z1 ad essere int prima di fare lo schift
Ho copiato il tuo codice..niente da fare.. =( continua a darmi 4244.. assurdo quante ore sto perdendo per questa cosa..
Risolto (partendo da un aiuto fornitomi su un altro forum:
byte z1 = (byte) (4500>>8);
byte z2 = (byte)(4500);
int z3 = (z1 << 8) | (z2 & 0x00FF);
println(z3);
In pratica mancava l'And. Perchè altrimenti il Byte che ho ricavato troncando l'INT non ha più il bit del segno, ma Java pensa che ci sia e quindi l'int ricavato è palesemente sbagliato, con l'And tutti i BIT dopo l'ottavo posto 1 vengono eliminati!
ah, già, avevo già litigato su sta cosa perchè non esistono unsigned in java... mi è completamente sfuggito!