受信するデータ
X-CUT や TeraTerm などでCOMポートを見ると、以下のようなデータを受信します。(ASCIIや16進数で表示されますが、ここでは2進数にしてあります。)
01111110 00000000 00001010 10000011 00000000 00000000 00111110 00000000 00000001 00000000 00000001 00000000 00000000 00111100
スイッチを切り替えると、以下のようなデータになります。
01111110 00000000 00001010 10000011 00000000 00000000 00111100 00000000 00000001 00000000 00000001 00000000 00000001 00111101
このデータの説明は、付属の product-manual_XBee_OEM_RF-Modules_802.15.4.pdf に書いてあるのですが、どうも書いてある内容とデータが違います。
データの意味はよく分かりませんでしたが、このデータの13バイト目(後ろから二つ目)が、DIO0〜DIO7 までのデータです。
これをRubyで必要な部分だけ書き出すようにします。
以下のスクリプトを参考にしました。
http://ruby.g.hatena.ne.jp/garyo/20061130/1164845977
class Com @comno @speed @parity @data @stop @com attr_accessor :comno, :speed, :parity , :data , :stop, :com def initialize @comno="1" @speed="9600" @parity="N" @data="8" @stop="1" end def open(n) @comno=n.to_s modestr = "MODE COM#{@comno} BAUD=#{@speed} PARITY=#{@parity} DATA=#{@data} STOP=#{@stop}" system modestr @com = open("com#{@comno}", "r+b")#.binmode end def close @com.close end def recv @com.readpartial(1024 * 1024) # RS232C IN end end com1=Com.new com1.speed="9600" com1.open(1) # USBの開発ボードを使っている場合は、この数字が変ります。環境に応じて変えてください。 loop { unless com1.com.eof? then a = com1.recv while a.size < 14 a += com1.recv unless com1.com.eof? end abort a.size.to_s + "is too large." if a.size > 14 0.upto(13) {|i| print "%08b"%(a[i].to_i) + " " } puts "" print "%08b"%(a[12].to_i) + " " puts "" end sleep(0.2) } com1.close