2011-06-15 31 views
10

Estoy tratando de usar ruby ​​para hacer una simple operación de lectura y escritura en un puerto serie.Lectura desde un puerto serie con Ruby

Este es el código que tengo hasta ahora. Estoy usando la gema serialport.

require 'rubygems' 
require 'serialport' 

ser = SerialPort.new("/dev/ttyACM0", 9600, 8, 1, SerialPort::NONE) 

ser.write "ab\r\n" 
puts ser.read 

Pero la secuencia de comandos se bloquea cuando se ejecuta.

+0

¿Dónde se cuelga? – sml

+0

@psp ¿Has encontrado una solución para esto? – RomanKapitonov

+0

Y después de leer, ¿no es necesario algo de cerca? – andrea

Respuesta

9

Tuve el problema. Es porque usar ser.read le dice a Ruby que siga leyendo para siempre y Ruby nunca deja de leer y cuelga el guión. La solución es leer solo una cantidad particular de caracteres.

Así, por ejemplo:

ser.readline(5) 
3

hacerse eco de lo dicho user968243, esa llamada ser.read va a esperar a que finalice el archivo. Si su dispositivo no está enviando EOF, esperará por siempre. Puede leer solo una cierta cantidad de caracteres según lo sugerido.

Su dispositivo puede estar terminando cada respuesta con un carácter de fin de línea. Intente leer hasta el próximo retorno de carro:

response = ser.readline("\r") 
response.chomp! 
print "#{response}\n" 
2

Me encontré con este mismo problema y encontré una solución. Use las líneas de lectura del método Ruby IO.

puts ser.readlines 
1

Intente establecer el valor #read_timeout para el puerto serie. Tenga en cuenta que se puede hacer lo mismo para una operación de escritura utilizando el valor #write_timeout.

Cuestiones relacionadas