91 lines
1.7 KiB
Go
91 lines
1.7 KiB
Go
|
// +build linux,!cgo
|
||
|
|
||
|
package serial
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
"os"
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
func openPort(name string, baud int) (rwc io.ReadWriteCloser, err error) {
|
||
|
|
||
|
var bauds = map[int]uint32{
|
||
|
50: syscall.B50,
|
||
|
75: syscall.B75,
|
||
|
110: syscall.B110,
|
||
|
134: syscall.B134,
|
||
|
150: syscall.B150,
|
||
|
200: syscall.B200,
|
||
|
300: syscall.B300,
|
||
|
600: syscall.B600,
|
||
|
1200: syscall.B1200,
|
||
|
1800: syscall.B1800,
|
||
|
2400: syscall.B2400,
|
||
|
4800: syscall.B4800,
|
||
|
9600: syscall.B9600,
|
||
|
19200: syscall.B19200,
|
||
|
38400: syscall.B38400,
|
||
|
57600: syscall.B57600,
|
||
|
115200: syscall.B115200,
|
||
|
230400: syscall.B230400,
|
||
|
460800: syscall.B460800,
|
||
|
500000: syscall.B500000,
|
||
|
576000: syscall.B576000,
|
||
|
921600: syscall.B921600,
|
||
|
1000000: syscall.B1000000,
|
||
|
1152000: syscall.B1152000,
|
||
|
1500000: syscall.B1500000,
|
||
|
2000000: syscall.B2000000,
|
||
|
2500000: syscall.B2500000,
|
||
|
3000000: syscall.B3000000,
|
||
|
3500000: syscall.B3500000,
|
||
|
4000000: syscall.B4000000,
|
||
|
}
|
||
|
|
||
|
rate := bauds[baud]
|
||
|
|
||
|
if rate == 0 {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
f, err := os.OpenFile(name, syscall.O_RDWR|syscall.O_NOCTTY|syscall.O_NONBLOCK, 0666)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
defer func() {
|
||
|
if err != nil && f != nil {
|
||
|
f.Close()
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
fd := f.Fd()
|
||
|
t := syscall.Termios{
|
||
|
Iflag: syscall.IGNPAR,
|
||
|
Cflag: syscall.CS8 | syscall.CREAD | syscall.CLOCAL | rate,
|
||
|
Cc: [32]uint8{syscall.VMIN: 1},
|
||
|
Ispeed: rate,
|
||
|
Ospeed: rate,
|
||
|
}
|
||
|
|
||
|
if _, _, errno := syscall.Syscall6(
|
||
|
syscall.SYS_IOCTL,
|
||
|
uintptr(fd),
|
||
|
uintptr(syscall.TCSETS),
|
||
|
uintptr(unsafe.Pointer(&t)),
|
||
|
0,
|
||
|
0,
|
||
|
0,
|
||
|
); errno != 0 {
|
||
|
return nil, errno
|
||
|
}
|
||
|
|
||
|
if err = syscall.SetNonblock(int(fd), false); err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
return f, nil
|
||
|
}
|