Последовательный порт получает сообщение о проблеме с данными в golang на macOS с использованием tarm / serial

#macos #go #serial-port

#macos #Вперед #последовательный порт

Вопрос:

Я успешно записал массив байтов в порт, но не смог прочитать из него. функция «read» возвращает «read /dev /tty.usbserial1: прерванный системный вызов» ошибка, я запускаю его на macOS sierra 10.12.6, использую «github.com/tarm/serial «, кто-нибудь сталкивался с такой же проблемой? вот код:

 func TestTarmSerialDataRecvAndSend(t *testing.T) {
    c := amp;serial.Config{
        Name: "/dev/cu.usbserial1",
        Baud: 9600,
    }

    s, err := serial.OpenPort(c)
    if err != nil {
        fmt.Println(err)
        return
    }

    for i := 0; i < 10; i   {
        n, err := s.Write([]byte("test"))
        if err != nil {
            fmt.Println(err)
            return
        }

        fmt.Printf("send byte : %v", n)
    }

    fmt.Println("send over")

    buf := make([]byte, 128)
    n, err := s.Read(buf)
    if err != nil {
        fmt.Println(err)
        return
    }

    fmt.Printf("%q", buf[:n])
}
  

Ответ №1:

 func sendCommand(p *serial.Port, command string, waitForOk bool) string {
    log.Println("--- SendCommand: ", command)
    var status string = ""
    p.Flush()
    _, err := p.Write([]byte(command))
    if err != nil {
        log.Fatal(err)
    }
    buf := make([]byte, 32)
    var loop int = 1
    if waitForOk {
        loop = 10
    }
    for i := 0; i < loop; i   {
        // ignoring error as EOF raises error on Linux
        n, _ := p.Read(buf)
        if n > 0 {
            status = string(buf[:n])
            log.Printf("SendCommand: rcvd %d bytes: %sn", n, status)
            if strings.HasSuffix(status, "OKrn") || strings.HasSuffix(status, "ERRORrn") {
                break
            }
        }
    }
    return status
}
  

решения здесь: https://golang.hotexamples.com/examples/github.com.tarm.serial/Port/Read/golang-port-read-method-examples.html