2012年3月4日日曜日

em-serialport:EventMachineでシリアルポートをつかう

急遽「おまえ、Rubyやれるのか!やれんのか!」的な話が来たのをいいことに、RubyのEventMachineであそんでいます。おれがイベント駆動。イベント駆動といえばArduino。Arduinoが出すなんらかの値はシリアル通信でうけとるのが楽なので、EventMachineでシリアル入力をトリガーにするためのライブラリem-serialportを使ってみます。

例:シリアルポートでうけた値をターミナルに表示させる

#!/usr/bin/env ruby
require 'em-serialport'

#serial = EventMachine.open_serial('/dev/tty.usbserial-A6008iDi', 9600, 8, 1, 0) 

EM.run do
    serial = EM.open_serial('/dev/tty.usbserial-A6008iDi', 9600, 8, 1, 0)

    serial.on_data do |data|
        print data
    end
end

requireはem-serialportのみ。require 'eventmachine'もつけると、名前の衝突かなにかでえエラーがでます。

open_serialの引数は順にシリアルポート名、ボーレート(もちろんスケッチに書いてあるものを)、データビット長、ストップビット、パリティの有無になっています。特に気にするのは前2つで、後ろは基本このままで大丈夫そうですね。4行目に同じものがコメントアウトになっていますが、ここでメソッドを呼び出すとダメみたいです。ループのなかにあるような感じが微妙に気持ち悪いんですけど、こういうものということで。

serial.on_dataが受信後に実行するコールバック関数。いまはprintのみを入れて、ターミナルに表示させているだけです。

Rubyはほぼ初めてなんですが、いままで書いたコードは命令のあとにセミコロンが必須のものばかりだったので、セミコロンなしインデント至上主義のコードに若干とまどっています。がしかし、やってみると楽しいものね。

注意

on_dataの引数で入ってくる値は、シリアルポートで受けた値がバッファを通すことなく直接入ってきます。上の例のようにそのままターミナルに吐き出す場合はよいのですが、値を拾ってスクリプト内でどうこうとなるとバッファに取り込んだうえで改行(\r\n)をめどに分割する必要があります。

0 件のコメント:

コメントを投稿