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