1

我正在尝试对旧的 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

概括

如果传入流没有终止字符,我如何判断它是否已完成?

4

2 回答 2

1

我个人会修改循环以执行以下操作:

  1. 将可用字节读入缓冲区
  2. 尝试验证缓冲区是否具有有效响应
  3. 如果在 #2 上是,则消耗缓冲区并退出循环。否则继续等待更多数据。

如果您可以执行阻塞读取,则根本不需要休眠。您将继续循环,直到获得有效帧。显然,可能需要其他错误处理。

于 2012-12-12T04:24:48.233 回答
-1

进行阻塞读取,但您需要按字符处理,而不是按行处理。

“0D 0A PIN>”似乎是一个提示(进程输入?)。直到行尾才阅读,直到看到该提示(用正则表达式识别它)并处理提示之前的字节。它似乎在回显您发送的命令字符,因此在检查丢弃这些字符后,留下一个干净的响应。

要进行逆向工程,请将测试盒连接到终端程序,并手动使用该提示符的命令进行实验。命令可能以 0D、0A 或两者都结束。例如,一个空白命令,“帮助”,“?” 或者无效的命令可能会提供有用的信息。

于 2012-12-12T05:45:09.103 回答