Io 等待Go中的串行端口输入

Io 等待Go中的串行端口输入,io,go,serial-port,system-calls,termios,Io,Go,Serial Port,System Calls,Termios,我有一个数字卡尺,可以通过串口发送测量值。 此数据的格式类似于+123.45\r,可由设备随时发送 因此,我的程序需要“侦听”第一个数据输入(总是以回车结束),并在这之后直接关闭读数,然后再继续自己的工作 专用终端喜欢并完美地处理这些不可预测的输入…但我不知道如何在Go中做到这一点(即使使用cgo) 我的系统 OSX10.9.5 Go 1.4.2达尔文/AMD64 装置 4800波特 7个数据位 偶数奇偶 2个停止位 DTR 我的实际代码 …那不行 package main impor

我有一个数字卡尺,可以通过串口发送测量值。 此数据的格式类似于
+123.45\r
,可由设备随时发送

因此,我的程序需要“侦听”第一个数据输入(总是以回车结束),并在这之后直接关闭读数,然后再继续自己的工作

专用终端喜欢并完美地处理这些不可预测的输入…但我不知道如何在Go中做到这一点(即使使用cgo)

我的系统
  • OSX10.9.5
  • Go 1.4.2达尔文/AMD64
装置
  • 4800波特
  • 7个数据位
  • 偶数奇偶
  • 2个停止位
  • DTR
我的实际代码 …那不行

package main

import (
    "bufio"
    "fmt"
    "os"
    "syscall"
    "unsafe"
)

func main() {
    f, err := os.OpenFile("/dev/tty.PL2303-00003014", syscall.O_RDWR+syscall.O_NOCTTY+syscall.O_NDELAY+syscall.O_NONBLOCK, 0666)
    if err != nil {
        panic(err)
    }
    defer f.Close()

    // Init terminal for 4800 7E2.
    t := &syscall.Termios{
        // Enable parity checking, strip to 7 bits, CR to NL, outgoing software flow control.
        Iflag: syscall.INPCK + syscall.ISTRIP + syscall.ICRNL + syscall.IXON,
        // Set 4800 bauds, 7 data bits, even parity, 2 stop bits, DTR.
        Cflag:  syscall.B4800 + syscall.CS7 + syscall.PARENB + syscall.CSTOPB + syscall.TIOCM_DTR + syscall.CREAD + syscall.CLOCAL + syscall.CSIZE,
        Cc:     [20]uint8{syscall.VMIN: 1},
        Ispeed: syscall.B4800,
        Ospeed: syscall.B4800,
    }

    _, _, errno := syscall.Syscall(syscall.SYS_FCNTL, uintptr(f.Fd()), uintptr(syscall.F_SETFL), uintptr(unsafe.Pointer(t)))
    if errno != 0 {
        panic("syscall error: " + errno.Error())
    }

    // Read until the first new line byte (\r is converted to \n with the ICRNL flag).
    fr := bufio.NewReader(f)
    line, err := fr.ReadBytes('\n')
    if err != nil {
        panic(err)
    }
    fmt.Println(string(line))
}

您提到值作为
xxxx\r
发送,但您正在等待
\n
,这是帖子中的打字错误还是代码?我在代码末尾的最后一条评论中解释:
\r
由于ICRNL iflag而转换为
\n
。在测试了一些包之后,我刚刚发现它做得非常完美,而且是开箱即用的。现在我有了一个好的基础,所以如果可能的话,我会尝试在纯GO(不带CGO)的情况下做这个。