2012-12-12 22 views
1

我正在嘗試對舊的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 

摘要

我怎麼能知道,如果沒有一個終止符的輸入流做?

+0

爲什麼當你使用'DataReceived'事件時你需要'睡眠'?將傳入數據附加到緩衝區,檢查它是否包含「結束標記」(PIN>?),然後處理它。 「等待」I/O通常沒有多大意義。 – igrimpe

+0

我在等待整個流進來的事件中睡覺。我的問題是「PIN>」不是可靠的結束標記。現在,我已經切換到使用ReadTimeout來檢測流何時停止。 –

回答

1

我個人修正環路做到以下幾點:

  1. 查看可用的字節到緩衝區
  2. 嘗試驗證緩衝對#2的有效響應
  3. 如果是的話,消耗緩衝區並退出循環。否則不斷等待更多數據。

如果您可以執行阻止讀取,則根本不需要休眠。你只會繼續循環,直到你得到一個有效的框架。顯然,可能需要其他錯誤處理。

-1

做一個阻塞閱讀,但你需要按字符處理,而不是線。

「0D 0A PIN>」似乎是一個提示(Process INput?)。不要閱讀直到行尾,直到看到該提示(使用正則表達式來識別它)並處理提示前面的字節爲止。它似乎迴應你發送的命令字符,因此在檢查放棄這些字符後留下乾淨的迴應。

要反向工程師將測試盒連接到終端程序,並用手執行該命令的命令。命令可能以0D,0A或兩者都結束。例如。空白命令「HELP」,「?」或無效的命令可能會提供有用的信息。

+0

PIN是機器的名稱,可以設置爲任何內容。我仍然在流的最後一行查找更多模式,但是如果知道名稱,我可以在LineFeeds上分割緩衝區,並檢查數組中最後一個元素的名稱。 –

相關問題