Pregunta

Tengo enteros de 0 a 255, y necesito pasarlos a una salida de salida codificada como bytes sin firmar. He tratado de convertir usando una máscara como así, pero si i = 1, el otro extremo de mi transmisión (un dispositivo serie que espera UINT8_T) cree que he enviado un entero sin firmar = 6.

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

Estoy hablando con un arduino en /dev/ttyUSB0 Usar ubuntu si esto hace las cosas más o menos interesantes.

Aquí está el código Arduino:

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

También tengo algún código de Python que funcione muy bien con el código Arduino, y el Arduino recibe felizmente el entero correcto si uso este código en 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]))

También me gustaría hacer esto en Scala, pero me estoy volviendo a caer a Java para evitar la complejidad mientras resuelvo este problema.

¿Fue útil?

Solución

Elenco, luego enmascarar: ((byte)(i)&0xff)

Pero, algo es muy extraño desde:

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

editar
¿Cómo recibe su Arduino 6 (binario) 0110 cuando envía 1 (binario) 0001?
/editar

Otros consejos

Creo que solo quieres out.write(i) aquí. Solo los ocho bits de bajo orden se escriben a partir del argumento INT i.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top