class Serial

Copyright © 2014-2016 The Hybrid Group

Copyright © 2014-2016 The Hybrid Group

Public Class Methods

new(address, baude_rate=9600, data_bits=8, parity=:none, stop_bits=1) click to toggle source
# File lib/rubyserial/posix.rb, line 4
def initialize(address, baude_rate=9600, data_bits=8, parity=:none, stop_bits=1)
  file_opts = RubySerial::Posix::O_RDWR | RubySerial::Posix::O_NOCTTY | RubySerial::Posix::O_NONBLOCK
  @fd = RubySerial::Posix.open(address, file_opts)

  if @fd == -1
    raise RubySerial::Error, RubySerial::Posix::ERROR_CODES[FFI.errno]
  else
    @open = true
  end

  fl = RubySerial::Posix.fcntl(@fd, RubySerial::Posix::F_GETFL, :int, 0)
  if fl == -1
    raise RubySerial::Error, RubySerial::Posix::ERROR_CODES[FFI.errno]
  end

  err = RubySerial::Posix.fcntl(@fd, RubySerial::Posix::F_SETFL, :int, ~RubySerial::Posix::O_NONBLOCK & fl)
  if err == -1
    raise RubySerial::Error, RubySerial::Posix::ERROR_CODES[FFI.errno]
  end

  @config = build_config(baude_rate, data_bits, parity, stop_bits)

  err = RubySerial::Posix.tcsetattr(@fd, RubySerial::Posix::TCSANOW, @config)
  if err == -1
    raise RubySerial::Error, RubySerial::Posix::ERROR_CODES[FFI.errno]
  end
end

Public Instance Methods

close() click to toggle source
# File lib/rubyserial/posix.rb, line 36
def close
  err = RubySerial::Posix.close(@fd)
  if err == -1
    raise RubySerial::Error, RubySerial::Posix::ERROR_CODES[FFI.errno]
  else
    @open = false
  end
end
closed?() click to toggle source
# File lib/rubyserial/posix.rb, line 32
def closed?
  !@open
end
getbyte() click to toggle source
# File lib/rubyserial/posix.rb, line 71
def getbyte
  buff = FFI::MemoryPointer.new :char, 1
  i = RubySerial::Posix.read(@fd, buff, 1)
  if i == -1
    raise RubySerial::Error, RubySerial::Posix::ERROR_CODES[FFI.errno]
  end

  if i == 0
    nil
  else
    buff.get_bytes(0,1).bytes.first
  end
end
gets(sep=$/, limit=nil) { |get_until_sep(sep, limit)| ... } click to toggle source
# File lib/rubyserial/posix.rb, line 85
def gets(sep=$/, limit=nil)
  if block_given?
    loop do
      yield(get_until_sep(sep, limit))
    end
  else
    get_until_sep(sep, limit)
  end
end
read(size) click to toggle source
# File lib/rubyserial/posix.rb, line 62
def read(size)
  buff = FFI::MemoryPointer.new :char, size
  i = RubySerial::Posix.read(@fd, buff, size)
  if i == -1
    raise RubySerial::Error, RubySerial::Posix::ERROR_CODES[FFI.errno]
  end
  buff.get_bytes(0, i)
end
write(data) click to toggle source
# File lib/rubyserial/posix.rb, line 45
def write(data)
  data = data.to_s
  n =  0
  while data.size > n do
    buff = FFI::MemoryPointer.from_string(data[n..-1].to_s)
    i = RubySerial::Posix.write(@fd, buff, buff.size-1)
    if i == -1
      raise RubySerial::Error, RubySerial::Posix::ERROR_CODES[FFI.errno]
    else
      n = n+i
    end
  end

  # return number of bytes written
  n
end

Private Instance Methods

build_config(baude_rate, data_bits, parity, stop_bits) click to toggle source
# File lib/rubyserial/posix.rb, line 111
def build_config(baude_rate, data_bits, parity, stop_bits)
  config = RubySerial::Posix::Termios.new

  config[:c_iflag]  = RubySerial::Posix::IGNPAR
  config[:c_ispeed] = RubySerial::Posix::BAUDE_RATES[baude_rate]
  config[:c_ospeed] = RubySerial::Posix::BAUDE_RATES[baude_rate]
  config[:c_cflag]  = RubySerial::Posix::DATA_BITS[data_bits] |
    RubySerial::Posix::CREAD |
    RubySerial::Posix::CLOCAL |
    RubySerial::Posix::PARITY[parity] |
    RubySerial::Posix::STOPBITS[stop_bits]

  # Masking in baud rate on OS X would corrupt the settings.
  if RubySerial::ON_LINUX
    config[:c_cflag] = config[:c_cflag] | RubySerial::Posix::BAUDE_RATES[baude_rate]
  end

  config[:cc_c][RubySerial::Posix::VMIN] = 0

  config
end
get_until_sep(sep, limit) click to toggle source
# File lib/rubyserial/posix.rb, line 97
def get_until_sep(sep, limit)
  sep = "\n\n" if sep == ''
  # This allows the method signature to be (sep) or (limit)
  (limit = sep; sep="\n") if sep.is_a? Integer
  bytes = []
  loop do
    current_byte = getbyte
    bytes << current_byte unless current_byte.nil?
    break if (bytes.last(sep.bytes.to_a.size) == sep.bytes.to_a) || ((bytes.size == limit) if limit)
  end

  bytes.map { |e| e.chr }.join
end