>  기사  >  백엔드 개발  >  Go에서 While 루프를 사용하여 연속 직렬 포트 데이터 읽기를 달성하는 방법은 무엇입니까?

Go에서 While 루프를 사용하여 연속 직렬 포트 데이터 읽기를 달성하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-27 16:28:28896검색

How to Achieve Continuous Serial Port Data Reading Using a While-Loop in Go?

While 루프를 사용하여 직렬 포트에서 지속적으로 데이터 읽기

직렬 포트를 통해 센서 또는 장치와 상호 작용할 때 종종 필요한 경우가 있습니다. 들어오는 데이터를 지속적으로 읽습니다. 이러한 맥락에서 질문이 생깁니다. while 루프를 사용하여 이를 달성하는 방법은 무엇입니까?

직렬 통신에 사용되는 Go 프로그램의 예를 고려하십시오.

<code class="go">package main

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

func main() {
    // ... (code to open the serial port and write data)

    time.Sleep(time.Second / 2)

    var buf []byte

    for {
        n, err := s.Read(buf)

        if n > 0 {
            break
        }
    }

    fmt.Println(string(buf[:n]))

    // ... (code to close the serial port)
}</code>

이 스니펫에서 초기 시도는 연속 읽기를 위한 while 루프를 만드는 것이 예상대로 작동하지 않습니다. 차단 Read() 함수와 달리 직렬 패키지의 Read() 메서드는 사용 가능한 데이터가 없더라도 즉시 반환합니다. 이 동작으로 인해 버퍼를 덮어쓰게 되고 들어오는 모든 데이터를 캡처할 수 없게 됩니다.

이 문제를 해결하기 위한 보다 강력한 접근 방식은 버퍼링 기능을 제공하는 bufio.Reader를 사용하는 것입니다. 정의된 구분 기호(예: 개행 문자의 경우 "x0a")가 있는 판독기를 사용하면 구분 기호를 만날 때까지 계속해서 읽을 수 있습니다.

다음은 이 접근 방식을 통합하는 수정된 코드 조각입니다.

<code class="go">package main

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

func main() {
    // ... (code to open the serial port and write data)

    // Create a bufio.Reader with a defined delimiter
    reader := bufio.NewReader(s)

    // Continuously read data until the delimiter is encountered
    reply, err := reader.ReadBytes('\x0a')

    // Print the received data
    fmt.Println(string(reply))

    // ... (code to close the serial port)
}</code>

이러한 변경 사항을 통합함으로써 이제 프로그램은 데이터 스트림 속도에 관계없이 수신되는 데이터를 지속적이고 안정적으로 읽을 수 있습니다.

위 내용은 Go에서 While 루프를 사용하여 연속 직렬 포트 데이터 읽기를 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.