我已經寫在圍棋一個簡短的程序通過串口與傳感器進行通信:從串口讀取與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()
}
它工作正常,但寫我有到港後等待大約半秒後才能開始閱讀。我想用while循環代替time.Sleep
來讀取所有傳入的數據。我嘗試不起作用:
buf := make([]byte, 40)
n := 0
for {
n, _ := s.Read(buf)
if n > 0 {
break
}
}
fmt.Println(string(buf[:n]))
我猜buf
每一個循環後傳被覆蓋。有什麼建議麼?
謝謝您的建議。到目前爲止,它工作正常,但我仍然必須使用'time.Sleep',否則我會遇到'恐慌:EOF',因爲讀取時緩衝區是空的。 (順便說一句:最後的分隔符是\ x03',之後是兩個十六進制字節的校驗和。) – laserbrain
奇怪 - 我不會認爲串行設備應該給EOF,它絕對不應該只是因爲緩衝區是空的。我能想到的唯一可能就是丟棄DTR/DSR。確保您使用的電纜僅連接了引腳2和引腳3(Rx和Tx),將所有其他握手線路斷開。您可能必須將DTR循環回設備上的DSR,但不必在PC上。 –
您可能需要檢查並查看您使用的軟件包是否具有阻止的Read調用,或者可能是阻塞的「WaitForData」調用。 「沒有數據」和「永遠不會有更多的數據」(後者是EOF表示的)是有區別的,所以我很困惑他們爲什麼給你EOF - 他們不應該這樣做。在任何情況下,如果實施,阻止呼叫可能會做你正在尋找的東西。 – joshlf