2009-10-15 14 views
5

No tengo claro cómo escribir matrices de códigos de bytes simples con ruby, more-so Estoy absolutamente perplejo sobre cómo usar la biblioteca Ruby SerialPort, para ser sincero, tengo funciona bastante bien, pero solo he tenido éxito en enviar ASCII por el puerto serie.Escribir matrices de bytes a serial con Ruby

Por ejemplo es muy sencillo escribir ASCII:

@sp = SerialPort.new "/dev/tty.usbserial-A6004cNN", 19200 
@sp.write "test" 

Lo que obviamente escribe test a ese dispositivo serie. Esto funciona bien y he podido obtener todos los resultados esperados enviados a un microcontrolador (arduino) en este caso. La cuestión es que necesito para escribir salida que el dispositivo serie leerá así:

{0x01,0x09,0x04,0x00, 'f',0xff,0xcc,0x33} 

He intentado usar str.unpack pero sigo siendo incapaz de producir la salida deseada valores hexadecimales como bytes que el anterior.

En Java es simple usando su biblioteca de serie:

byte[] cmd = { 0x01,0x09,0x04,0x00, 'f',(byte)0xff,(byte)0xcc,(byte)0x33 }; 
serialPort.write(cmd); 

¿Cómo puedo emitir el código de bytes adecuado para mi dispositivo en serie con Ruby?

Respuesta

6
@sp.write [32.chr, 7.chr, 8.chr, 65.chr].to_s 
@sp.write ["\x01\x09\x04\x00", 'f', "\xff\xcc\x33"].to_s 

Pero podemos tener más divertido que eso (muhahaha ...)

class Array 
    def chr 
    self.map { |e| e.chr } 
    end 
end 

Entonces:

>> [1,2,3,65,66,67].chr 
=> ["\001", "\002", "\003", "A", "B", "C"] 
>> [1,2,3,65,66,67].chr.to_s 
=> "\001\002\003ABC" 
+0

wow ... grande. No me di cuenta que podría ser así de simple. ¡Gracias! –

Cuestiones relacionadas