Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 你从什么开始?串行数据_Ruby_String_Serial Port - Fatal编程技术网

Ruby 你从什么开始?串行数据

Ruby 你从什么开始?串行数据,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时

我正在使用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时?所有的串行数据通过包括短信。当我使用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