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 )