From 3351cd50e044ef9fb7a3bced9067345b31396459 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Sun, 14 Dec 2014 18:38:44 +0100 Subject: [PATCH] Added SetDataBits function (linux only for now) --- serial.go | 6 ++++++ serial_linux.go | 21 +++++++++++++++++++++ test/serial_test.go | 3 +++ 3 files changed, 30 insertions(+) diff --git a/serial.go b/serial.go index 6c933a0..e205b53 100644 --- a/serial.go +++ b/serial.go @@ -20,6 +20,9 @@ type SerialPort interface { // Set port parity SetParity(parity Parity) error + + // Set data bits + SetDataBits(bits int) error } type Parity int @@ -44,6 +47,7 @@ const ( ERROR_INVALID_SERIAL_PORT ERROR_PERMISSION_DENIED ERROR_INVALID_PORT_SPEED + ERROR_INVALID_PORT_DATA_BITS ERROR_ENUMERATING_PORTS ERROR_OTHER ) @@ -60,6 +64,8 @@ func (e SerialPortError) Error() string { return "Permission denied" case ERROR_INVALID_PORT_SPEED: return "Invalid port speed" + case ERROR_INVALID_PORT_DATA_BITS: + return "Invalid port data bits" case ERROR_ENUMERATING_PORTS: return "Could not enumerate serial ports" } diff --git a/serial_linux.go b/serial_linux.go index 264a7eb..55da7a5 100644 --- a/serial_linux.go +++ b/serial_linux.go @@ -245,6 +245,27 @@ func (port *linuxSerialPort) SetParity(parity Parity) error { return setTermSettings(port.Handle, settings) } +var databitsMap = map[int]C.tcflag_t{ + 5: C.CS5, + 6: C.CS6, + 7: C.CS7, + 8: C.CS8, +} + +func (port *linuxSerialPort) SetDataBits(bits int) error { + databits, ok := databitsMap[bits] + if !ok { + return &SerialPortError{code: ERROR_INVALID_PORT_DATA_BITS} + } + settings, err := getTermSettings(port.Handle) + if err != nil { + return err + } + settings.c_cflag &= ^C.tcflag_t(syscall.CSIZE) + settings.c_cflag |= databits + 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 15d29d4..eb5a97c 100644 --- a/test/serial_test.go +++ b/test/serial_test.go @@ -33,6 +33,9 @@ func ExampleCommunication() { if err := port.SetParity(serial.PARITY_NONE); err != nil { log.Fatal(err) } + if err := port.SetDataBits(8); err != nil { + log.Fatal(err) + } n, err := port.Write([]byte("10,20,30\n\r")) if err != nil {