gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:26 24 4
gpt4 key购买 nike

我正面临一个看似非常奇怪的问题。为了隔离问题,我已经大大简化了草图和 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 不再使 pin 13 亮起。

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

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

这很奇怪。我以为this question会解决这个问题,但它没有(正如你所看到的,我已经把 sp.flush 放在文件的末尾。我也试过把它放在文件的开头,以及之间。我还尝试在打开连接后立即设置 sp.sync = true,但这也不起作用)。调用 sp.syswrite 也没有,它应该是无缓冲的。 唯一的工作似乎是让另一个进程打开串行连接。

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

如有任何帮助,我们将不胜感激。

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

最佳答案

关闭硬件流控制。

关于ruby-serialport 仅在串行监视器打开或 IRB 保持打开状态时发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21738958/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com