Napisałem krótki program w Go do komunikacji z czujnikiem za pośrednictwem portu szeregowego:Odczyt z portu szeregowego z pętli while-
package main
import (
"fmt"
"github.com/tarm/goserial"
"time"
)
func main() {
c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 9600}
s, err := serial.OpenPort(c)
if err != nil {
fmt.Println(err)
}
_, err = s.Write([]byte("\x16\x02N0C0 G A\x03\x0d\x0a"))
if err != nil {
fmt.Println(err)
}
time.Sleep(time.Second/2)
buf := make([]byte, 40)
n, err := s.Read(buf)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(buf[:n]))
s.Close()
}
To działa dobrze, ale po napisaniu do portu muszę poczekaj około pół sekundy, zanim zacznę czytać. Chciałbym użyć pętli while zamiast time.Sleep
, aby odczytać wszystkie przychodzące dane. Moja próba nie działa:
buf := make([]byte, 40)
n := 0
for {
n, _ := s.Read(buf)
if n > 0 {
break
}
}
fmt.Println(string(buf[:n]))
Chyba buf
pobiera nadpisywane po każdym przejściu pętli. Jakieś sugestie?
Dziękuję za sugestię. Do tej pory działa dobrze, ale nadal muszę używać 'time.Sleep', w przeciwnym razie dostanę' panikę: EOF', ponieważ bufor jest pusty w momencie odczytu. (Nawiasem mówiąc: ogranicznik końcowy to '\ x03', po którym następuje suma kontrolna dwóch bajtów szesnastkowych.) – laserbrain
Dziwne - nie sądziłem, że urządzenie szeregowe powinno kiedykolwiek dawać EOF, a zdecydowanie nie powinno tak być ponieważ bufor jest pusty. Jedyną możliwością, o której mogę pomyśleć, jest odrzucenie DTR/DSR. Upewnij się, że używasz kabla z podłączonymi tylko pinami 2 i pin 3 (Rx i Tx), pozostawiając wszystkie inne linie uzgadniania odłączone. Być może będziesz musiał przywrócić DTR do DSR na urządzeniu, ale nie powinieneś tego robić na komputerze. –
Możesz chcieć sprawdzić, czy pakiet, którego używasz, blokuje wywołanie Read lub może blokować wywołanie "WaitForData". Różnica między "brakiem danych" i "nigdy nie będzie więcej danych" (ten ostatni jest tym, co oznacza EOF), więc nie rozumiem, dlaczego dają ci EOF - nie powinni tego robić . W każdym razie połączenie blokujące może zrobić to, czego szukasz, jeśli jest zaimplementowane. – joshlf