首页 >后端开发 >Golang >Go中如何使用分隔符高效地读取串口数据?

Go中如何使用分隔符高效地读取串口数据?

Patricia Arquette
Patricia Arquette原创
2024-10-27 07:37:31965浏览

How to Efficiently Read Data from a Serial Port in Go Using Delimiters?

等待 Go 中串行端口的输入

您正在尝试使用 Go 通过串行端口与传感器进行通信。您当前的实现包括对 time.Sleep 的调用,以在写入端口后延迟尝试读取。此方法不是最佳方法,您正在寻求使用 while 循环来连续读取数据的替代方法。

循环的问题

循环的问题您提供的 while 循环是 Read 返回任何可用数据,即使它不完整。因此,buf 很可能在每次循环迭代期间被覆盖。

解决方案:使用基于分隔符的方法

您可以读取数据,而不是依赖延迟,直到遇到指示消息结束的特定分隔符。在您的情况下,似乎 x0a 可以作为分隔符。

为此目的,您可以使用 bufio.Reader,如下所示:

<code class="go">package main

import (
    "fmt"
    "github.com/tarm/goserial"
    "bufio"
)

func main() {
    // Establish serial port connection
    c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 9600}
    s, err := serial.OpenPort(c)

    if err != nil {
        fmt.Println(err)
    }

    // Write to the port
    _, err = s.Write([]byte("\x16\x02N0C0 G A\x03\x0d\x0a"))

    if err != nil {
        fmt.Println(err)
    }

    // Create a bufio.Reader for delimited reading
    reader := bufio.NewReader(s)

    // Read data until the delimiter is encountered
    reply, err := reader.ReadBytes('\x0a')
    if err != nil {
        panic(err)
    }

    // Print the received message
    fmt.Println(reply)
    
    s.Close()
}</code>

此方法将连续读取来自串行端口,直到遇到分隔符,提供一种更有效、更可靠的方式来检索传入消息。

以上是Go中如何使用分隔符高效地读取串口数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn