我正面临一个似乎很奇怪的问题。为了隔离问题,我已经非常简化了我的草图和 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
在以下条件下运行有效:
如果我打开 IRB 并运行
SerialPort.new('/dev/tty.usbmodem411', 115200)
并保持 IRB open。然而,在我关闭 IRB 的那一刻,运行serialtest.rb
不再使引脚 13 亮起。如果我打开 Arduino 的串行监视器并保持打开状态。一旦我关闭它,灯 13 在运行时再次停止亮起
serialtest.rb
。如果我将整个内容输入 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 电容器。