受信するデータ

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