浅草ギ研の製品で,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をインストールしておきます.