Added SetParity (still missing windows implementation)

This commit is contained in:
Cristian Maglie
2014-12-14 17:54:16 +01:00
parent 340397b32a
commit 1d5eedba28
3 changed files with 53 additions and 2 deletions

View File

@@ -17,8 +17,21 @@ type SerialPort interface {
// Set port speed // Set port speed
SetSpeed(baudrate int) error SetSpeed(baudrate int) error
// Set port parity
SetParity(parity Parity) error
} }
type Parity int
const (
PARITY_NONE Parity = iota
PARITY_ODD
PARITY_EVEN
PARITY_MARK
PARITY_SPACE
)
// Platform independent error type for serial ports // Platform independent error type for serial ports
type SerialPortError struct { type SerialPortError struct {
err string err string

View File

@@ -24,6 +24,14 @@ package serial
static const tcflag_t IUCLC = 0; static const tcflag_t IUCLC = 0;
#endif #endif
#if defined(PAREXT)
const tcflag_t FIXED_PAR_FLAG = PAREXT;
#elif defined(CMSPAR)
const tcflag_t FIXED_PAR_FLAG = CMSPAR;
#else
const tcflag_t FIXED_PAR_FLAG = 0;
#endif
// ioctl call is not available through syscall package // ioctl call is not available through syscall package
//int ioctl_wrapper(int d, unsigned long request) { //int ioctl_wrapper(int d, unsigned long request) {
// return ioctl(d, request); // return ioctl(d, request);
@@ -209,6 +217,34 @@ func (port *linuxSerialPort) SetSpeed(speed int) error {
return setTermSettings(port.Handle, settings) return setTermSettings(port.Handle, settings)
} }
func (port *linuxSerialPort) SetParity(parity Parity) error {
settings, err := getTermSettings(port.Handle)
if err != nil {
return err
}
switch parity {
case PARITY_NONE:
settings.c_cflag &= ^C.tcflag_t(syscall.PARENB | syscall.PARODD | C.FIXED_PAR_FLAG)
settings.c_iflag &= ^C.tcflag_t(syscall.INPCK)
case PARITY_ODD:
settings.c_cflag |= syscall.PARENB | syscall.PARODD
settings.c_cflag &= ^C.tcflag_t(C.FIXED_PAR_FLAG)
settings.c_iflag |= syscall.INPCK
case PARITY_EVEN:
settings.c_cflag &= ^C.tcflag_t(syscall.PARODD | C.FIXED_PAR_FLAG)
settings.c_cflag |= syscall.PARENB
settings.c_iflag |= syscall.INPCK
case PARITY_MARK:
settings.c_cflag |= syscall.PARENB | syscall.PARODD | C.FIXED_PAR_FLAG
settings.c_iflag |= syscall.INPCK
case PARITY_SPACE:
settings.c_cflag &= ^C.tcflag_t(syscall.PARODD)
settings.c_cflag |= syscall.PARENB | C.FIXED_PAR_FLAG
settings.c_iflag |= syscall.INPCK
}
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

@@ -27,8 +27,10 @@ func ExampleCommunication() {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
err = port.SetSpeed(9600) if err = port.SetSpeed(9600); err != nil {
if err != nil { log.Fatal(err)
}
if err := port.SetParity(serial.PARITY_NONE); err != nil {
log.Fatal(err) log.Fatal(err)
} }