> 백엔드 개발 > Golang > 구분 기호를 사용하여 Go에서 직렬 포트의 데이터를 효율적으로 읽는 방법은 무엇입니까?

구분 기호를 사용하여 Go에서 직렬 포트의 데이터를 효율적으로 읽는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-10-27 07:37:31
원래의
964명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿