2

我正在使用 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

红宝石版本 1.9.3p194

4

2 回答 2

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
于 2013-07-04T07:06:03.680 回答
1

首先,检查 Priti 说了什么。

然后:

您的 rs232 设备很可能会按行发送数据。尝试sp.gets改为阅读,也许您的代码会立即工作。

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

于 2013-07-04T07:15:59.950 回答