3

私は非常に奇妙な問題と思われるものに直面しています。問題を切り分けるために、スケッチと Ruby コードを非常に単純化しました。

Ruby のバージョンは 2.0.0、ruby-serialport のバージョンは 2.3.0 です。Mac OS X 10.9 (マーベリックス) を使用しています。

これが私のスケッチです。ご覧のとおり、シリアル データを受信すると、ピン 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のシリアルモニターを開いてそのままにしておくと. 閉じるとすぐに、再び、実行中にライト 13 が点灯しなくなりますserialtest.rb

  3. 全体をIRBに入力すると。しかし、それは行ごとでなければなりません。コピーして貼り付けると、13番ピンが点灯しません(この場合、実行する必要はありませんserialtest.rb)。

とても奇妙です。この質問で問題は解決すると思いましたが、そうではありませんでした (ご覧sp.flushのとおり、ファイルの最後に配置しました。また、ファイルの最初とその間のすべての場所に配置しようとしました。また、接続を開いた直後に設定しようsp.sync = trueとしましたが、それも機能しません)。sp.syswriteバッファリングされていないはずの の呼び出しも行いません。動作する唯一のことは、別のプロセスでシリアル接続を開くことです。

serialport は実際にはファイル内から接続を確立できず、外部で接続する必要があるようです (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 に答える