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

@@ -24,6 +24,14 @@ package serial
static const tcflag_t IUCLC = 0;
#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
//int ioctl_wrapper(int d, unsigned long request) {
// return ioctl(d, request);
@@ -209,6 +217,34 @@ func (port *linuxSerialPort) SetSpeed(speed int) error {
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) {
handle, err := syscall.Open(portName, syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_NDELAY, 0)
if err != nil {