我正在尝试对旧的DOS CNC程序进行逆向工程,但我的成功有限。我从DOS程序中嗅到了Rx / Tx流,看到了......
来自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 :(得分:1)
我个人会修改循环来执行以下操作:
如果您可以执行阻止读取,则根本不需要睡眠。你将继续循环,直到你得到一个有效的框架。显然,可能需要进行其他错误处理。
答案 1 :(得分:-1)
执行阻止读取,但您需要按字符处理,而不是行。
“0D 0A PIN>”似乎是一个提示(Process INput?)。直到行结束才读,直到看到该提示(用正则表达式识别它)并处理提示前的字节为止。它似乎与您发送的命令字符相呼应,因此在检查后丢弃这些字符时,会留下干净的响应。
要对测试盒进行反向工程,将测试盒连接到终端程序,并使用命令手动进行实验。命令可能以0D,0A或两者终止。例如。空白命令“HELP”,“?”或者无效的命令可能会提供有用的信息。