我正在使用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
答案 0 :(得分:1)
这是因为getc
:
从ios读取一个字符的字符串。如果在文件末尾调用,则返回nil。
这就是原因:
'T'.start_with? 'Time' # => false
'Time'.start_with? 'T' # => true
如果str使用给定的前缀之一启动,则返回true。
'Time'.start_with?('L','Ti') # => true
'AT'.start_with?('Time','A') # => true
答案 1 :(得分:1)
首先,看看普里蒂说的话。
然后:
您的rs232设备最有可能以行的形式发出数据。请尝试通过sp.gets
阅读,也许您的代码会立即生效。
OTOH,如果你的设备没有(或者如果它溢出缓冲区等)并且gets开始返回部分数据,那么你将不得不迭代地获取/或/获取并在你自己的缓冲区中累积该数据,并且然后分析缓冲区的内容,而不仅仅是查看最近发现的内容。