如何从串行读取数据并在找到特定分隔符时处理它

时间:2017-07-15 19:04:35

标签: go

我有一个设备,它继续通过串口发送数据。 现在我想阅读并处理它。 数据发送此分隔符"!"和 一旦出现这个分隔符,我想暂停阅读以处理已经收到的数据。 我怎样才能做到这一点?是否有任何我可以阅读或遵循的文档或示例。

2 个答案:

答案 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)

另请参阅:Reading from serial port with while-loop

答案 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,以获得一些有关如何进行字符串解析的想法。