Menggunakan Gelung Sementara untuk Membaca Data Secara Berterusan daripada Port Bersiri
Apabila berinteraksi dengan penderia atau peranti melalui port bersiri, ia selalunya diperlukan untuk membaca data masuk secara berterusan. Dalam konteks ini, persoalan timbul - bagaimana untuk mencapai ini menggunakan gelung sementara?
Pertimbangkan contoh program Go yang digunakan untuk komunikasi bersiri:
<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>
Dalam coretan ini, percubaan awal untuk membuat gelung sementara untuk bacaan berterusan tidak berfungsi seperti yang diharapkan. Tidak seperti fungsi Read() yang menyekat, kaedah Read() pakej bersiri kembali serta-merta, walaupun tiada data tersedia. Tingkah laku ini membawa kepada menimpa penimbal dan ketidakupayaan untuk menangkap semua data masuk.
Untuk menangani isu ini, pendekatan yang lebih mantap ialah menggunakan bufio.Reader, yang menyediakan keupayaan penimbalan. Dengan menggunakan pembaca dengan pembatas yang ditentukan (contohnya, "x0a" untuk aksara baris baharu), seseorang boleh membaca secara berterusan sehingga pembatas ditemui.
Berikut ialah coretan kod diubah suai yang menggabungkan pendekatan ini:
<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>
Dengan memasukkan perubahan ini, program kini boleh membaca data masuk secara berterusan dan boleh dipercayai, tanpa mengira kadar aliran data.
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Pembacaan Data Port Bersiri Berterusan Menggunakan While-Loop dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!