Ruby 你从什么开始?串行数据
我正在使用Ruby成功读取串行端口。串行数据来自带有GSM屏蔽的Arduino,因此我从GSM屏蔽中获得了很多额外的字符串。为了过滤我想要的短信,我尝试使用start_?方法。我已经在IRB中测试过了,它正确地返回true或falseRuby 你从什么开始?串行数据,ruby,string,serial-port,Ruby,String,Serial Port,我正在使用Ruby成功读取串行端口。串行数据来自带有GSM屏蔽的Arduino,因此我从GSM屏蔽中获得了很多额外的字符串。为了过滤我想要的短信,我尝试使用start_?方法。我已经在IRB中测试过了,它正确地返回true或false rb(main):006:0> 'Timedgf'.start_with? 'Time' => true irb(main):007:0> 'AT'.start_with? 'Time' => false 当我不使用start_with时
rb(main):006:0> 'Timedgf'.start_with? 'Time'
=> true
irb(main):007:0> 'AT'.start_with? 'Time'
=> false
当我不使用start_with时?所有的串行数据通过包括短信。当我使用start_with时?在下面的代码中,即使我用短信发送以时间开头的东西,我也什么也得不到。
我的代码如下:
require "rubygems"
require "serialport"
require "data_mapper"
#params for serial port
port_str = "/dev/ttyACM0"
baud_rate = 19200
data_bits = 8
stop_bits = 1
parity = SerialPort::NONE
sp = SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)
loop do
sp_char = sp.getc
if sp_char.start_with? 'Time'
printf("%c", sp_char)
end
end
Ruby版本1.9.3p194这是因为:
从ios读取一个单字符字符串。如果在文件末尾调用,则返回nil
这就是为什么:
'T'.start_with? 'Time' # => false
'Time'.start_with? 'T' # => true
说:
如果str以给定的前缀之一开头,则返回true
首先,看看普里蒂说了什么 然后: 您的rs232设备很可能以行的形式发送数据。尝试通过
sp.get
读取,也许您的代码会立即生效
OTOH,如果您的设备没有(或者如果它溢出了缓冲区等),并且GET开始返回部分数据,那么您必须迭代地获取C/or/gets并将该数据累积到您自己的缓冲区中,然后分析缓冲区的内容,而不是仅仅查看最近通过线路传输的内容。难道你不得到单个字符而不是完整的行吗?这可能就是user2549208的原因:您的rs232设备很可能以行的形式发送数据。尝试通过
sp.get
读取,也许您的代码会立即生效。OTOH,如果您的设备没有(或者如果它溢出了缓冲区等),并且GET开始返回部分数据,那么您必须迭代地获取C/or/gets并将该数据累积到您自己的缓冲区中,然后分析缓冲区的内容,而不是仅仅查看最近通过线路传输的内容。感谢Priti,伊尔坦波和格扎尔卡特。已更改为sp.get,并将printf参数更改为%s。现在一切正常。下一个端口映射器!
'Time'.start_with?('L','Ti') # => true
'AT'.start_with?('Time','A') # => true