Added SetDataBits function (linux only for now)

This commit is contained in:
Cristian Maglie
2014-12-14 18:38:44 +01:00
parent 83038c8ed9
commit 3351cd50e0
3 changed files with 30 additions and 0 deletions

View File

@@ -20,6 +20,9 @@ type SerialPort interface {
// Set port parity // Set port parity
SetParity(parity Parity) error SetParity(parity Parity) error
// Set data bits
SetDataBits(bits int) error
} }
type Parity int type Parity int
@@ -44,6 +47,7 @@ const (
ERROR_INVALID_SERIAL_PORT ERROR_INVALID_SERIAL_PORT
ERROR_PERMISSION_DENIED ERROR_PERMISSION_DENIED
ERROR_INVALID_PORT_SPEED ERROR_INVALID_PORT_SPEED
ERROR_INVALID_PORT_DATA_BITS
ERROR_ENUMERATING_PORTS ERROR_ENUMERATING_PORTS
ERROR_OTHER ERROR_OTHER
) )
@@ -60,6 +64,8 @@ func (e SerialPortError) Error() string {
return "Permission denied" return "Permission denied"
case ERROR_INVALID_PORT_SPEED: case ERROR_INVALID_PORT_SPEED:
return "Invalid port speed" return "Invalid port speed"
case ERROR_INVALID_PORT_DATA_BITS:
return "Invalid port data bits"
case ERROR_ENUMERATING_PORTS: case ERROR_ENUMERATING_PORTS:
return "Could not enumerate serial ports" return "Could not enumerate serial ports"
} }

View File

@@ -245,6 +245,27 @@ func (port *linuxSerialPort) SetParity(parity Parity) error {
return setTermSettings(port.Handle, settings) 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) { func OpenPort(portName string, exclusive bool) (SerialPort, error) {
handle, err := syscall.Open(portName, syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_NDELAY, 0) handle, err := syscall.Open(portName, syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_NDELAY, 0)
if err != nil { if err != nil {

View File

@@ -33,6 +33,9 @@ func ExampleCommunication() {
if err := port.SetParity(serial.PARITY_NONE); err != nil { if err := port.SetParity(serial.PARITY_NONE); err != nil {
log.Fatal(err) log.Fatal(err)
} }
if err := port.SetDataBits(8); err != nil {
log.Fatal(err)
}
n, err := port.Write([]byte("10,20,30\n\r")) n, err := port.Write([]byte("10,20,30\n\r"))
if err != nil { if err != nil {