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