我有一个设备,它继续通过串口发送数据。
现在我想阅读并处理它。
数据发送此分隔符"!"
和
一旦出现这个分隔符,我想暂停阅读以处理已经收到的数据。
我怎样才能做到这一点?是否有任何我可以阅读或遵循的文档或示例。
答案 0 :(得分:1)
要从串口读取数据,您可以在Github上找到一些包,例如: tarm/serial
您可以使用此程序包从串行端口读取数据。为了在达到特定分隔符之前进行读取,您可以使用以下内容:
config := &serial.Config{Name: "/dev/ttyUSB", Baud: 9600}
s, err := serial.OpenPort(config)
if err != nil {
// stops execution
log.Fatal(err)
}
// golang reader interface
r := bufio.NewReader(s)
// reads until delimiter is reached
data, err := r.ReadBytes('\x21')
if err != nil {
// stops execution
log.Fatal(err)
}
// or use fmt.Printf() with the right verb
// https://golang.org/pkg/fmt/#hdr-Printing
fmt.Println(data)
答案 1 :(得分:1)
对于每个来这里的人……我都有类似的任务,bufio
对我没有用。一段时间后它一直崩溃!绝对不行,因为我需要一个非常稳定的低性能系统解决方案。
我的建议是在短短的一周内实施this suggestion。如前所述,如果您不使用bufio,则每次调用时缓冲区都会被覆盖
n, err := s.Read(buf0)
要解决此问题,请将buf0中的字节追加到第二个缓冲区:
if n > 0 {
for _, b := range buf0[:n] {
buf1 = append(buf1, b)
}
然后解析存储在buf1中的字符串。 如果找到所需的子字符串,请进一步处理。 (!)确保在成功解析后清除缓冲区 (!)确保清除缓冲区(如果缓冲区达到一定大小)以避免内存问题。 现在,我知道这不是一个完美的解决方案,但是它产生的开销最小,您可以立即看到发生了什么,并且在我的应用程序中可以很好地工作。
请查看this post,以获得一些有关如何进行字符串解析的想法。