1 // (c) Bernhard Tittelbach, 2013
10 "svn.spreadspace.org/realraum/go.svn/termios"
14 // ---------- Serial TTY Code -------------
16 func openTTY(name string, speed uint) (file *os.File, err error) {
17 file, err = os.OpenFile(name,os.O_RDWR, 0600)
18 if err != nil { return }
19 if err = termios.SetRawFile(file); err != nil { return }
21 case 0: // set no baudrate
22 case 1200: err = termios.SetSpeedFile(file, termios.B1200)
23 case 2400: err = termios.SetSpeedFile(file, termios.B2400)
24 case 4800: err = termios.SetSpeedFile(file, termios.B4800)
25 case 9600: err = termios.SetSpeedFile(file, termios.B9600)
26 case 19200: err = termios.SetSpeedFile(file, termios.B19200)
27 case 38400: err = termios.SetSpeedFile(file, termios.B38400)
28 case 57600: err = termios.SetSpeedFile(file, termios.B57600)
29 case 115200: err = termios.SetSpeedFile(file, termios.B115200)
30 case 230400: err = termios.SetSpeedFile(file, termios.B230400)
33 err = errors.New("Unsupported Baudrate, use 0 to disable setting a baudrate")
38 func serialWriter(in <- chan string, serial * os.File) {
39 for totty := range(in) {
40 serial.WriteString(totty)
46 func serialReader(out chan <- [][]byte, serial * os.File) {
47 linescanner := bufio.NewScanner(serial)
48 linescanner.Split(bufio.ScanLines)
49 for linescanner.Scan() {
50 if err := linescanner.Err(); err != nil {
53 text := bytes.Fields([]byte(linescanner.Text()))
61 func OpenAndHandleSerial(filename string, serspeed uint) (chan string, chan [][]byte, error) {
62 serial, err :=openTTY(filename, serspeed)
66 wr := make(chan string, 1)
67 rd := make(chan [][]byte, 20)
68 go serialWriter(wr, serial)
69 go serialReader(rd, serial)