lib/rubyserial/posix.rb in rubyserial-0.5.0 vs lib/rubyserial/posix.rb in rubyserial-0.6.0
- old
+ new
@@ -1,9 +1,9 @@
# Copyright (c) 2014-2016 The Hybrid Group
class Serial
- def initialize(address, baude_rate=9600, data_bits=8, parity=:none)
+ 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]
@@ -19,11 +19,11 @@
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)
+ @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
@@ -106,20 +106,25 @@
end
bytes.map { |e| e.chr }.join
end
- def build_config(baude_rate, data_bits, parity)
+ 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::BAUDE_RATES[baude_rate] |
- RubySerial::Posix::PARITY[parity]
+ 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