我正面临着一个非常奇怪的问题。我已经非常简化了草图和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
:
如果我打开IRB并运行SerialPort.new('/dev/tty.usbmodem411', 115200)
并打开IRB 。但是,当我关闭IRB时,运行serialtest.rb
不再使引脚13亮起。
如果我打开Arduino的串口显示器并将其打开。一旦我关闭它,在运行serialtest.rb
时,灯13再次点亮。
如果我将整个内容输入IRB。但它必须是逐行的。如果我复制并粘贴它,则引脚13不会亮起(在这种情况下,我不必运行serialtest.rb
)。
这很奇怪。我认为this question会解决问题,但它没有(正如您所看到的那样,我已将sp.flush
放在文件的末尾。我也尝试将其放在文件的开头,介于两者之间的任何地方。我也尝试在打开连接后立即设置sp.sync = true
,这也不起作用。也没有调用sp.syswrite
,它应该是无缓冲的。 唯一工作似乎是让另一个进程打开串行连接。
似乎serialport无法在文件中实际建立连接,并且必须在外部完成(将SerialPort.new(...)
代码复制到Thread.new
内部也不起作用)
非常感谢任何帮助。
编辑:似乎问题源于每次Ruby尝试建立串行连接时Arduino被重置的事实(而IRB和串行监视器保持连接打开,导致SerialPort.new
调用{ {1}}被忽略)。 最终,我的解决方案是在Arduino上的RESET和GND之间放置一个10uF电容。
答案 0 :(得分:0)
关闭硬件流控制。