Ordine dei Byte nella Seriale

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 :sweat_smile:

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 :astonished:? 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!