arrays - []byte{10} 或 []byte("\n") 与 []byte{92, 110}
问题描述
我正在github.com/tarm/serial
与一些串行仪器接口。在开发中,我正在使用/dev/ttyp0
and/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\n
forecho foo
和\r\n\r\n
for echo "foo\n"
。
所以我的问题是:
(1)为什么这里的行为有所不同?
(2)我如何通过回车终止我真正想要的行为?也许我应该改用 EOT?人类永远不会直接输入这个。
解决方案
推荐阅读
- python - Numpy获取二维数组中arange的索引
- python - 从模块导入类是否会在导入时执行整个模块?蟒蛇 3
- python - 如何用不同形状的数组替换数组
- c# - 隐藏文本框控件时流布局面板消失
- jenkins - 无法在 Jenkins 中配置系统电子邮件地址
- docker-compose - 如何使用 docker-compose 杀死特定的 docker 容器?
- python - 在带有 'season' (season1, season2...) 列的 pandas DF 中,需要将 6 个月或 ~182 天添加到最后一个不为空的季节
- git - 合并相关的 Git 存储库
- firebase - 批量写入的并发字段值增量是否会导致批处理失败
- python - python pandas将dataframe列拆分为两个新列并删除原始列