首页  >  文章  >  后端开发  >  如何在Go中非阻塞地从串口读取数据?

如何在Go中非阻塞地从串口读取数据?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-02 18:38:30940浏览

How to Read Data from a Serial Port Non-Blockingly in Go?

使用 While 循环进行非阻塞串行端口读取

在此程序中,目标是通过串行与传感器进行通信同时避免使用time.Sleep端口来读取数据。不幸的是,由于每次循环迭代都会覆盖数据缓冲区,使用 while 循环的最初尝试失败了。

解决方案在于实现面向字节的读取方法,并以 bufio.Reader 的引入为先导。这种面向流的读取器为串行通信提供了更复杂和强大的机制。

<code class="go">package main

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

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

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

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

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

    reader := bufio.NewReader(s)
    reply, err := reader.ReadBytes('\x0a') // Read until a newline character is encountered
    if err != nil {
        panic(err)
    }

    fmt.Println(reply)

    s.Close()
}</code>

通过此修改,程序将连续读取传入数据,直到遇到指定的分隔符(在本例中为 x0a)。这种方法可确保可靠的数据检索,而不需要阻塞操作。

以上是如何在Go中非阻塞地从串口读取数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

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