皆さん今晩は、田鎖です。

From: WATANABE Hirofumi <eban / os.rim.or.jp>
Subject: [ruby-list:23215] Re: Access serial port (cygwin32)
Date: Tue, 13 Jun 2000 19:00:16 +0900

> わたなべです.
> 
> Hagemu Higuchi <hahiguc / pop11.odn.ne.jp> writes:
> 
> :	file = open("/dev/com1", "r")
> :
> :という方法でいいのでしょうか?
> 
> たぶん.
> 
> :通信速度など設定したい場合は、どのようにしたらいいのですか?
> 
> tcgetattr, tcsetattr あたりで.
> これは ruby-termios 拡張ライブラリを make するか Win32API で
> 呼び出すようにすればいいでしょう.
> #stty でできるかどうかはわからない.

やまださんの termios モジュールが必要ですが、こんなの書いて使っています。
とりあえずスピードの変更は可能です。利点は、cygwin でも、linux でも共通
に使えるところでしょうか。


						'00.06.15 tag

------------------------------ここから

#!/usr/local/bin/ruby

require "termios"

class Comport

  def initialize(port)
    @dev = open(port,File::RDWR | File::NOCTTY)
    @speed = 9600
    @parity = "N"
    @numbit = 8
    @stopbit = 1
    @timeout = 5

    @oldatt = Termios::getattr(@dev)
    @newatt = Termios::new_termios()
    @newatt.c_cflag = (Termios::B9600 | Termios::CRTSCTS | Termios::CS8 | Termios::CLOCAL | Termios::CREAD)
    @newatt.c_iflag = Termios::IGNPAR
    @newatt.c_oflag = 0
    @newatt.c_lflag = 0
    @newatt.c_ispeed = @newatt.c_ospeed = Termios::B9600
    @newatt.c_cc[Termios::VTIME] = @timeout * 10 # timeout = 5 sec
    @newatt.c_cc[Termios::VMIN] = 0  # nobuffer
    
    Termios::flush(@dev, Termios::TCIFLUSH)
    Termios::setattr(@dev, Termios::TCSANOW, @newatt)
  end

  def speed(n=nil)
    return @speed if n == nil
    @newatt.c_ispeed = @newatt.c_ospeed = eval("Termios::" + "B" + n.to_s)
    
    Termios::flush(@dev, Termios::TCIFLUSH)
    Termios::setattr(@dev, Termios::TCSANOW, @newatt)
    @speed = n
  end

  def parity(p=nil)
    return @parity if p == nil
  end

  def bitlen(l=nil)
    return @numbit if l == nil
  end

  def stopbit(s=nil)
    return @stopbit if s == nil
  end

  def timeout(n=nil)
    return @timeout if n == nil
    @newatt.c_cc[Termios::VTIME] = n * 10 # timeout = n sec
    
    Termios::flush(@dev, Termios::TCIFLUSH)
    Termios::setattr(@dev, Termios::TCSANOW, @newatt)
    @timeout = n
  end

  def putc(c)
    @dev.putc(c)
  end

  def getc
    @dev.getc
  end

  def read(cnt=1000 ,termchar=nil)
    (termchar = cnt ; cnt = 0) if cnt.type == String
    r = ""
    begin
      n = @dev.getc
      return r if n == nil # may be time out
      r << n.chr 
      return r if r[-1,1] == termchar
    end while (cnt -= 1) != 0
    r
  end

  def write(s)
    cnt = 0
    s.each_byte {|c| @dev.putc c.chr ; cnt += 1}
    cnt
  end

  def close
    Termios::flush(@dev, Termios::TCIFLUSH)
    Termios::setattr(@dev, Termios::TCSANOW, @oldatt)
    @dev.close
  end
end

if __FILE__ == $0
  dev = Comport.new(if /WIN/oi =~ RUBY_PLATFORM then "/dev/com1" else "/dev/ttyS0" end)
  dev.write("*idn?\n")
  print dev.read("\n")
end

------------------------------------------ここまで