首页 > 解决方案 > []byte{10} 或 []byte("\n") 与 []byte{92, 110}

问题描述

我正在github.com/tarm/serial与一些串行仪器接口。在开发中,我正在使用/dev/ttyp0and/dev/ptyp0对,我的 go 过程连接到一个,我screen用来连接到另一个。我编写了一个函数,结合serial.Config.ReadTimeout, 读取最多ReadTimeout或接收给定的字节序列。该功能是:

func readToTermination(s serial.Port, termination []byte, rate time.Duration) []byte {
    var out []byte
    lterm := len(termination)
    for {
        buf := make([]byte, 128)
        n, _ := s.Read(buf)
        out = append(out, buf[:n]...)
        l := len(out)
        if l >= lterm {
            if bytes.Compare(out[l-lterm:], termination) == 0 {
                break
            }
        }
        time.Sleep(rate)
    }
    return out
}

这避免了在去抖动的情况下烧掉 CPU 周期。当我使用termination = []byte("\n")和屏幕进行测试时,它break永远不会触发,因为它会变成[]byte{97, 11}(两个不同的元素,比如每次击键后屏幕刷新)。另一方面,如果我做类似echo "foo" > /dev/ptyp0的事情,中断会正确触发。Echo 似乎隐含地发送了一个\n,或者连接的关闭这样做了。我看到\r\nforecho foo\r\n\r\nfor echo "foo\n"

所以我的问题是:

(1)为什么这里的行为有所不同?

(2)我如何通过回车终止我真正想要的行为?也许我应该改用 EOT?人类永远不会直接输入这个。

标签: arraysgonewlinebytebuffer

解决方案


推荐阅读