ruby-serialport仅在串行监视器打开或IRB处于打开状态时发送数据

时间:2014-02-12 20:32:41

标签: ruby serialization serial-port arduino ruby-serialport

我正面临着一个非常奇怪的问题。我已经非常简化了草图和Ruby代码以便隔离问题。

Ruby版本是2.0.0,ruby-serialport版本是2.3.0。我使用的是Mac OS X 10.9(Mavericks)。

这是我的草图。如您所见,如果接收到任何串行数据,它只会将引脚13点亮500毫秒。

serialtest.ino

void setup(){
  Serial.begin(115200);
  pinMode(13, OUTPUT);
}

void loop(){
  while(Serial.available()){
    byte x = Serial.read();

    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
  }
}

这是我的Ruby代码。

serialtest.rb

require 'serialport'
# This is the correct port file, don't worry
sp = SerialPort.new('/dev/tty.usbmodem411', 115200)
sp.write "a"
sp.flush

此代码如果单独运行,则不起作用。没有显示任何异常或警告,但引脚13上的LED不亮(即使Arduino上的RX灯短暂闪烁)。但是,在以下条件下运行serialtest.rb

  1. 如果我打开IRB并运行SerialPort.new('/dev/tty.usbmodem411', 115200)打开IRB 。但是,当我关闭IRB时,运行serialtest.rb不再使引脚13亮起。

  2. 如果我打开Arduino的串口显示器并将其打开。一旦我关闭它,在运行serialtest.rb时,灯13再次点亮。

  3. 如果我将整个内容输入IRB。但它必须是逐行的。如果我复制并粘贴它,则引脚13不会亮起(在这种情况下,我不必运行serialtest.rb)。

  4. 这很奇怪。我认为this question会解决问题,但它没有(正如您所看到的那样,我已将sp.flush放在文件的末尾。我也尝试将其放在文件的开头,介于两者之间的任何地方。我也尝试在打开连接后立即设置sp.sync = true,这也不起作用。也没有调用sp.syswrite,它应该是无缓冲的。 唯一工作似乎是让另一个进程打开串行连接。

    似乎serialport无法在文件中实际建立连接,并且必须在外部完成(将SerialPort.new(...)代码复制到Thread.new内部也不起作用)

    非常感谢任何帮助。

    编辑:似乎问题源于每次Ruby尝试建立串行连接时Arduino被重置的事实(而IRB和串行监视器保持连接打开,导致SerialPort.new调用{ {1}}被忽略)。 最终,我的解决方案是在Arduino上的RESET和GND之间放置一个10uF电容。

1 个答案:

答案 0 :(得分:0)

关闭硬件流控制。