From d8910d40043e76e7c9923698722b7634225b82da Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Wed, 24 Dec 2014 23:59:59 +0100 Subject: [PATCH] Simplified API for setting port mode --- serial.go | 21 ++++++-------- serial_linux.go | 74 ++++++++++--------------------------------------- 2 files changed, 23 insertions(+), 72 deletions(-) diff --git a/serial.go b/serial.go index 993c911..262af58 100644 --- a/serial.go +++ b/serial.go @@ -12,20 +12,15 @@ import "io" type SerialPort interface { io.ReadWriteCloser - // Set port speed - SetSpeed(baudrate int) error - - // Set port parity - SetParity(parity Parity) error - - // Set data bits - SetDataBits(bits int) error - - // Set stop bits - SetStopBits(bits StopBits) error - // Set all parameters together - Set(baudrate int, parity Parity, databits int, stopbits StopBits) error + SetMode(mode *Mode) error +} + +type Mode struct { + BaudRate int + DataBits int + Parity Parity + StopBits StopBits } type Parity int diff --git a/serial_linux.go b/serial_linux.go index 7a2ab14..84b1904 100644 --- a/serial_linux.go +++ b/serial_linux.go @@ -34,71 +34,27 @@ func (port *linuxSerialPort) Write(p []byte) (n int, err error) { return syscall.Write(port.handle, p) } -func (port *linuxSerialPort) Set(baudrate int, parity Parity, databits int, stopbits StopBits) error { +func (port *linuxSerialPort) SetMode(mode *Mode) error { settings, err := port.getTermSettings() if err != nil { return err } - if err := setTermSettingsBaudrate(baudrate, settings); err != nil { + if err := setTermSettingsBaudrate(mode.BaudRate, settings); err != nil { return err } - if err := setTermSettingsParity(parity, settings); err != nil { + if err := setTermSettingsParity(mode.Parity, settings); err != nil { return err } - if err := setTermSettingsDataBits(databits, settings); err != nil { + if err := setTermSettingsDataBits(mode.DataBits, settings); err != nil { return err } - if err := setTermSettingsStopBits(stopbits, settings); err != nil { + if err := setTermSettingsStopBits(mode.StopBits, settings); err != nil { return err } return port.setTermSettings(settings) } -func (port *linuxSerialPort) SetSpeed(speed int) error { - settings, err := port.getTermSettings() - if err != nil { - return err - } - if err := setTermSettingsBaudrate(speed, settings); err != nil { - return err - } - return port.setTermSettings(settings) -} - -func (port *linuxSerialPort) SetParity(parity Parity) error { - settings, err := port.getTermSettings() - if err != nil { - return err - } - if err := setTermSettingsParity(parity, settings); err != nil { - return err - } - return port.setTermSettings(settings) -} - -func (port *linuxSerialPort) SetDataBits(bits int) error { - settings, err := port.getTermSettings() - if err != nil { - return err - } - if err := setTermSettingsDataBits(bits, settings); err != nil { - return err - } - return port.setTermSettings(settings) -} - -func (port *linuxSerialPort) SetStopBits(bits StopBits) error { - settings, err := port.getTermSettings() - if err != nil { - return err - } - if err := setTermSettingsStopBits(bits, settings); err != nil { - return err - } - return port.setTermSettings(settings) -} - -func OpenPort(portName string, exclusive bool) (SerialPort, error) { +func OpenPort(portName string, mode *Mode) (SerialPort, error) { h, err := syscall.Open(portName, syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_NDELAY, 0) if err != nil { switch err { @@ -113,7 +69,11 @@ func OpenPort(portName string, exclusive bool) (SerialPort, error) { handle: h, } - // Setup serial port with defaults + // Setup serial port + if err := port.SetMode(mode); err != nil { + port.Close() + return nil, &SerialPortError{code: ERROR_INVALID_SERIAL_PORT} + } settings, err := port.getTermSettings() if err != nil { @@ -138,14 +98,10 @@ func OpenPort(portName string, exclusive bool) (SerialPort, error) { port.Close() return nil, &SerialPortError{code: ERROR_INVALID_SERIAL_PORT} } - /* - settings->c_cflag &= ~CRTSCTS; - */ + syscall.SetNonblock(h, false) - if exclusive { - port.getExclusiveAccess() - } + port.acquireExclusiveAccess() return port, nil } @@ -176,7 +132,7 @@ func GetPortsList() ([]string, error) { // Check if serial port is real or is a placeholder serial port "ttySxx" if f.Name()[:4] == "ttyS" { - port, err := OpenPort(portName, false) + port, err := OpenPort(portName, &Mode{}) if err != nil { serr, ok := err.(*SerialPortError) if ok && serr.Code() == ERROR_INVALID_SERIAL_PORT { @@ -301,7 +257,7 @@ func setTermSettingsStopBits(bits StopBits, settings *syscall.Termios) error { // native syscall wrapper functions -func (port *linuxSerialPort) getExclusiveAccess() error { +func (port *linuxSerialPort) acquireExclusiveAccess() error { return ioctl(port.handle, syscall.TIOCEXCL, 0) }