Domanda

Ho numeri interi da 0 a 255 e ho bisogno di passarli a un outputstream codificato come byte non firmati. Ho provato a convertire usando una maschera come così, ma se i = 1, l'altra estremità del mio flusso (un dispositivo seriale in attesa di Uint8_t) pensa di aver inviato un numero intero non firmato = 6.

OutputStream out;
public void writeToStream(int i) throws Exception {
    out.write(((byte)(i & 0xff)));
}

Sto parlando con un Arduino a /dev/ttyUSB0 Usando Ubuntu se questo rende le cose più o meno interessanti.

Ecco il codice Arduino:

uint8_t nextByte() {
    while(1) {
    if(Serial.available() > 0) {
        uint8_t b =  Serial.read();
      return b;
     }
    }
}

Ho anche del codice Python che funziona alla grande con il codice Arduino e l'Arduino riceve felicemente il numero intero corretto se utilizzo questo codice in Python:

class writerThread(threading.Thread): 
    def __init__(self, threadID, name):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
    def run(self):
        while True:
            input = raw_input("[W}Give Me Input!")
            if (input == "exit"):
               exit("Goodbye");
            print ("[W]You input %s\n" % input.strip())
            fval = [ int(input.strip()) ]
            ser.write("".join([chr(x) for x in fval]))

Alla fine mi piacerebbe anche farlo a Scala, ma sto tornando a Java per evitare la complessità mentre risolvo questo problema.

È stato utile?

Soluzione

Cast, poi maschera: ((byte)(i)&0xff)

Ma da allora qualcosa è molto strano:

(dec) 8 - (binario) 1000
(dec) 6 - (binario) 0110

modificare
In che modo il tuo Arduino riceve 6 (binario) 0110 quando invii 1 (binario) 0001?
/modificare

Altri suggerimenti

Penso che tu voglia solo out.write(i) qui. Solo gli otto bit di basso ordine sono scritti dall'argomento int i.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top