Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Rubyでシリアルポートをつかう

Rubyで、Buffalo RemoteStationを使う話の続きです。まず、TEXCELL Rubyシリアル通信ライブラリ(Windwos用)だが、やってみると、ボーレートは115,200bpsに設定してみると問題なく動作した。ハマッたのは、Serial::receive()関数を呼んでも、nilが返ってきてしまい、うまくデータが受信できないこと。適当にsleepを埋め込んでみてやっとわかったのは、このメソッドは、データが受信できていないときに、ブロックせずにすぐにnilで戻ること。考えてみれば、そうなっていないとちょっと困る場合がありますね。
 そこで、nilが返ってきたら、sleepで0.1秒ほど待つというのを繰り返し、timeoutで与えられるまで、データが受け取れなかったら、タイムアウトで異常終了し、あとはあらかじめ与えられた(expectedLength)長さのデータがそろったらそれを返すようにしました。途中で1バイトでも受信したら、タイムアウト用のタイマはリセットしています。

ということで、RemoteStationをWindows+Rubyで使えるようになりました。なんか、やる気でてきたぞ・・・

  def receiveData( expectedLength, timeout = 1 )
    now = Time.now
    data = ""
    while (now + timeout > Time.now)
      str = receive()
      if str == nil
        sleep 0.1
      else
        data += str
        now = Time.now
        if data.length >= expectedLength
          return data
        end
      end
   end
   nil
  end # def receiveData( expectedLength, timeout = 0.5 )



コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://diesaliquanti.blog.fc2.com/tb.php/592-5e80465f
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。