Simplified API for setting port mode

This commit is contained in:
Cristian Maglie
2014-12-24 23:59:59 +01:00
parent c5bf5a0514
commit d8910d4004
2 changed files with 23 additions and 72 deletions

View File

@@ -12,20 +12,15 @@ import "io"
type SerialPort interface { type SerialPort interface {
io.ReadWriteCloser 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 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 type Parity int

View File

@@ -34,71 +34,27 @@ func (port *linuxSerialPort) Write(p []byte) (n int, err error) {
return syscall.Write(port.handle, p) 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() settings, err := port.getTermSettings()
if err != nil { if err != nil {
return err return err
} }
if err := setTermSettingsBaudrate(baudrate, settings); err != nil { if err := setTermSettingsBaudrate(mode.BaudRate, settings); err != nil {
return err return err
} }
if err := setTermSettingsParity(parity, settings); err != nil { if err := setTermSettingsParity(mode.Parity, settings); err != nil {
return err return err
} }
if err := setTermSettingsDataBits(databits, settings); err != nil { if err := setTermSettingsDataBits(mode.DataBits, settings); err != nil {
return err return err
} }
if err := setTermSettingsStopBits(stopbits, settings); err != nil { if err := setTermSettingsStopBits(mode.StopBits, settings); err != nil {
return err return err
} }
return port.setTermSettings(settings) return port.setTermSettings(settings)
} }
func (port *linuxSerialPort) SetSpeed(speed int) error { func OpenPort(portName string, mode *Mode) (SerialPort, 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) {
h, err := syscall.Open(portName, syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_NDELAY, 0) h, err := syscall.Open(portName, syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_NDELAY, 0)
if err != nil { if err != nil {
switch err { switch err {
@@ -113,7 +69,11 @@ func OpenPort(portName string, exclusive bool) (SerialPort, error) {
handle: h, 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() settings, err := port.getTermSettings()
if err != nil { if err != nil {
@@ -138,14 +98,10 @@ func OpenPort(portName string, exclusive bool) (SerialPort, error) {
port.Close() port.Close()
return nil, &SerialPortError{code: ERROR_INVALID_SERIAL_PORT} return nil, &SerialPortError{code: ERROR_INVALID_SERIAL_PORT}
} }
/*
settings->c_cflag &= ~CRTSCTS;
*/
syscall.SetNonblock(h, false) syscall.SetNonblock(h, false)
if exclusive { port.acquireExclusiveAccess()
port.getExclusiveAccess()
}
return port, nil return port, nil
} }
@@ -176,7 +132,7 @@ func GetPortsList() ([]string, error) {
// Check if serial port is real or is a placeholder serial port "ttySxx" // Check if serial port is real or is a placeholder serial port "ttySxx"
if f.Name()[:4] == "ttyS" { if f.Name()[:4] == "ttyS" {
port, err := OpenPort(portName, false) port, err := OpenPort(portName, &Mode{})
if err != nil { if err != nil {
serr, ok := err.(*SerialPortError) serr, ok := err.(*SerialPortError)
if ok && serr.Code() == ERROR_INVALID_SERIAL_PORT { if ok && serr.Code() == ERROR_INVALID_SERIAL_PORT {
@@ -301,7 +257,7 @@ func setTermSettingsStopBits(bits StopBits, settings *syscall.Termios) error {
// native syscall wrapper functions // native syscall wrapper functions
func (port *linuxSerialPort) getExclusiveAccess() error { func (port *linuxSerialPort) acquireExclusiveAccess() error {
return ioctl(port.handle, syscall.TIOCEXCL, 0) return ioctl(port.handle, syscall.TIOCEXCL, 0)
} }