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をインストールしておきます.

コメントする