Added SetParity (still missing windows implementation)
This commit is contained in:
13
serial.go
13
serial.go
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user