我正在嘗試對舊的DOS CNC程序進行反向工程,並且我的成功有限。我聞從DOS程序接收/發送數據流,並看到這個...從串行端口讀取所有數據,但傳入流沒有一致的流尾
從DOS TX:
"OUTPUT TEST" 0D
的Rx從機:
"OUTPUT TEST" 0D 0D 0A
0D 0A
"TEST" 0D 0A
"0001> +09000 +09000 +00000 +00000 +00000 +00032 +00000 D O " 0D 0A
"0002> +00000 +03000 +00000 +00000 +00000 +00032 +00000 B N " 0D 0A
"0003> +00000 +03000 +00000 +00000 +00000 +00032 +00000 B N " 0D 0A
"0004> +00000 +03000 +00000 +00000 +00000 +00032 +00000 B N " 0D 0A
"0005> +00000 +03000 +00000 +00000 +00000 +00033 +00000 B N " 0D 0A
"0006> +00000 +03000 +00000 +00000 +00000 +00033 +00000 B N " 0D 0A
"0007> +00000 +03000 +00000 +00000 +00000 +00033 +00000 B N " 0D 0A
"0008> +00000 +03000 +00000 +00000 +00000 +00033 +00000 B N " 0D 0A
"0009> +00000 +03000 +00000 +00000 +00000 +00033 +00000 B N " 0D 0A
"0010> +09000 +17000 +00000 +00000 +00000 +00064 +00000 B X . " 0D 0A
14 0D 0A
"PIN> "
當然,我不得不重新格式化該流是可讀的。
如您所見,最後一行是而非有一個換行符。這使ReadLine無用,因爲最後一行只會顯示在下一個請求中。我需要能夠發送一個命令並讀到最後。我能夠實現這一目標的唯一方法是讓睡眠時間足夠長,以便在機器上完成傳輸,然後在PC上處理數據。在某些機器上,延遲必須設置爲高達5秒。我不想這樣做,但它的工作原理。
While spUISC.BytesToRead > 0
buffer &= spUISC.ReadExisting
Threading.Thread.Sleep(100)
End While
摘要
我怎麼能知道,如果沒有一個終止符的輸入流做?
爲什麼當你使用'DataReceived'事件時你需要'睡眠'?將傳入數據附加到緩衝區,檢查它是否包含「結束標記」(PIN>?),然後處理它。 「等待」I/O通常沒有多大意義。 – igrimpe
我在等待整個流進來的事件中睡覺。我的問題是「PIN>」不是可靠的結束標記。現在,我已經切換到使用ReadTimeout來檢測流何時停止。 –