从串行端口读取所有数据,但传入流没有一致的流结束

时间:2012-12-12 04:19:09

标签: vb.net serial-port cnc

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

摘要

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

2 个答案:

答案 0 :(得分:1)

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

  1. 将可用字节读入缓冲区
  2. 尝试验证缓冲区是否具有有效响应
  3. 如果是#2,则使用缓冲区并退出循环。此外,还要等待更多数据。
  4. 如果您可以执行阻止读取,则根本不需要睡眠。你将继续循环,直到你得到一个有效的框架。显然,可能需要进行其他错误处理。

答案 1 :(得分:-1)

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

“0D 0A PIN>”似乎是一个提示(Process INput?)。直到行结束才读,直到看到该提示(用正则表达式识别它)并处理提示前的字节为止。它似乎与您发送的命令字符相呼应,因此在检查后丢弃这些字符时,会留下干净的响应。

要对测试盒进行反向工程,将测试盒连接到终端程序,并使用命令手动进行实验。命令可能以0D,0A或两者终止。例如。空白命令“HELP”,“?”或者无效的命令可能会提供有用的信息。