Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mencapai Pembacaan Data Port Bersiri Berterusan Menggunakan While-Loop dalam Go?

Bagaimana untuk Mencapai Pembacaan Data Port Bersiri Berterusan Menggunakan While-Loop dalam Go?

DDD
DDDasal
2024-10-27 16:28:28896semak imbas

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn