Ruby start_with?串行数据

时间:2013-07-04 06:59:58

标签: ruby string serial-port

我正在使用Ruby成功读取串口。串口数据来自带有GSM屏蔽的Arduino,所以我从GSM屏蔽中获得了很多额外的字符串。为了过滤我想要的SMS消息,我试图使用start_with?方法。我在IRB中对此进行了测试,它正确地返回true或false。

rb(main):006:0> 'Timedgf'.start_with? 'Time'
=> true
irb(main):007:0> 'AT'.start_with? 'Time'
=> false

当我不使用start_with时?所有的串行数据都包括SMS。当我使用start_with?如下面的代码所示,即使我发送一些以Time开头的内容,我也什么也得不到。 我的代码如下:

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

2 个答案:

答案 0 :(得分:1)

这是因为getc

  

从ios读取一个字符的字符串。如果在文件末尾调用,则返回nil。

这就是原因:

'T'.start_with? 'Time' # => false
'Time'.start_with? 'T' # => true

String#start_with说:

  

如果str使用给定的前缀之一启动,则返回true。

'Time'.start_with?('L','Ti') # => true
'AT'.start_with?('Time','A') # => true

答案 1 :(得分:1)

首先,看看普里蒂说的话。

然后:

您的rs232设备最有可能以行的形式发出数据。请尝试通过sp.gets阅读,也许您的代码会立即生效。

OTOH,如果你的设备没有(或者如果它溢出缓冲区等)并且gets开始返回部分数据,那么你将不得不迭代地获取/或/获取并在你自己的缓冲区中累积该数据,并且然后分析缓冲区的内容,而不仅仅是查看最近发现的内容。