Simplified API for setting port mode
This commit is contained in:
21
serial.go
21
serial.go
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user