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

DDD
Lepaskan: 2024-10-27 16:28:28
asal
905 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!