AGB65シリーズに接続

浅草ギ研の製品で,AGB65-232Cというボードがあります.これを通すと,AGB65-ADCなどのデバイスRS-232Cを通じて制御できます.
で,それをLinuxから制御するときのRubyスクリプトがこちら.

require 'rubygems'
require 'serialport'

class AGB65
	@@sp=nil
	def initialize(port, id)
		# 重複して同じものを開くのを防ぐ
		@@sp = SerialPort.new(port, 9600, 8, 1, SerialPort::NONE) if @@sp==nil
		@id = id
	end

	def is_open
		return true unless @@sp==nil
		return false
	end

	def AGB65.open(port, id)
		agb=AGB65.new(port,id)
		unless agb.is_open
			print "オープンに失敗しました\n"
			return nil
		end
		
		# ブロックなしの場合はAGB65のインスタンスを返す
		return agb unless block_given?
		# ブロック付きの場合はブロックを実行
		yield agb
		# 終了処理
		agb.close
	end

	def setID(id)
		@id=id
	end

	def close
		raise "シリアルポートをオープンできていません\n" if @@sp==nil
		@@sp.close
		@@sp=nil
	end

########## 低レベルコマンド
	def send(length,cmd)
		raise "シリアルポートをオープンできていません\n" if @@sp==nil
		# データの配列をC*(unsigned char)に変換して送る
		@@sp.write([255, @id, length, cmd].pack("C*"))
	end

	def recv(n)
		raise "シリアルポートをオープンできていません\n" if @@sp==nil
		# 受信する文字列
		res = ""
		# nバイト分繰り返し
		n.times{
			# 1バイト読み込んでresの後ろに付け足す
			res << @@sp.getc
		}
		# unsigned charの文字列を,数値の配列に戻す
		res.unpack("C*")
	end

########## 以下は上レベルコマンド
	def check
		send(254)
		recv(4)
	end

	def setmode(n)
		# 12bitモードを明示的に指定したときのみ12bitモードにする
		if n == 12
			send(100)
		else
			send(0)
		end
	end
end

これが,デバイスを制御するクラスで,

#!/usr/bin/ruby
# -*- coding: utf-8 -*-

require 'AGB65.rb'

# 接続開始 デバイス名とIDを指定
agb = AGB65.new("/dev/ttyS0", 120)
begin
	# セルフチェック
	p agb.check

	# コマンドを送信
	agb.send(1,1)

	# データを受信
	p agb.recv(19)

ensure
	# 接続終了
	agb.close
end

# 実はこんな使い方も(こっちの方がbegin/ensureやcloseが不要な分便利)
AGB65.open("/dev/ttyS0",120) do |agb|
	# セルフチェック
	agb.check

	# コマンドを送信
	agb.send(1,1)
	# データを受信
	p agb.recv(19)
end

こう使います.
このとき,あらかじめ

gem install serialport

Ruby-Serialportをインストールしておきます.