diff --git a/serial.go b/serial.go index e205b53..cbe0ad0 100644 --- a/serial.go +++ b/serial.go @@ -23,6 +23,9 @@ type SerialPort interface { // Set data bits SetDataBits(bits int) error + + // Set stop bits + SetStopBits(bits StopBits) error } type Parity int @@ -35,6 +38,14 @@ const ( PARITY_SPACE ) +type StopBits int + +const ( + STOPBITS_ONE StopBits = iota + STOPBITS_ONEPOINTFIVE + STOPBITS_TWO +) + // Platform independent error type for serial ports type SerialPortError struct { err string diff --git a/serial_linux.go b/serial_linux.go index 55da7a5..d06fa60 100644 --- a/serial_linux.go +++ b/serial_linux.go @@ -266,6 +266,20 @@ func (port *linuxSerialPort) SetDataBits(bits int) error { return setTermSettings(port.Handle, settings) } +func (port *linuxSerialPort) SetStopBits(bits StopBits) error { + settings, err := getTermSettings(port.Handle) + if err != nil { + return err + } + switch bits { + case STOPBITS_ONE: + settings.c_cflag &= ^C.tcflag_t(syscall.CSTOPB) + case STOPBITS_ONEPOINTFIVE, STOPBITS_TWO: + settings.c_cflag |= syscall.CSTOPB + } + return setTermSettings(port.Handle, settings) +} + func OpenPort(portName string, exclusive bool) (SerialPort, error) { handle, err := syscall.Open(portName, syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_NDELAY, 0) if err != nil { diff --git a/test/serial_test.go b/test/serial_test.go index eb5a97c..b510f5d 100644 --- a/test/serial_test.go +++ b/test/serial_test.go @@ -36,7 +36,9 @@ func ExampleCommunication() { if err := port.SetDataBits(8); err != nil { log.Fatal(err) } - + if err := port.SetStopBits(serial.STOPBITS_ONE); err != nil { + log.Fatal(err) + } n, err := port.Write([]byte("10,20,30\n\r")) if err != nil { log.Fatal(err)