3

我正面临一个似乎很奇怪的问题。为了隔离问题,我已经非常简化了我的草图和 Ruby 代码。

Ruby 版本是 2.0.0,ruby-serialport 版本是 2.3.0。我在 Mac OS X 10.9 (Mavericks) 上。

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

串行测试.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 代码。

串行测试.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 open。然而,在我关闭 IRB 的那一刻,运行serialtest.rb不再使引脚 13 亮起。

  2. 如果我打开 Arduino 的串行监视器并保持打开状态。一旦我关闭它,灯 13 在运行时再次停止亮起serialtest.rb

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

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

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

任何帮助将不胜感激。

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

4

1 回答 1

0

关闭硬件流控制。

于 2014-12-28T19:05:26.610 回答