以编程方式将串行端口数据更正为可读格式

时间:2013-06-13 13:38:38

标签: c# .net serial-port

情况是,在我的工作地点,我们有一个呼叫数据记录器(CDR)通过串口将数据输入服务器。据我了解,这里的好数据是所有电话的记录,这当然与钱的支出有关。

据我了解,服务器上的串口设置为接受9600波特,8位,无奇偶校验,1个停止位的数据;它旨在被设置为接受9600波特,7位,无奇偶校验,1个停止位的数据。

虽然现在已经纠正了这个设置,但CDR中存在大量数据,这些数据目前无法理解,尽管这些文件通常可以像记事本一样简单。

我的问题是A.是否有可能恢复可读数据,以及B.如何实现这一目标(就C#而言,这将是理想的,但不是必需的)。我曾经想过将数据直接解码到比特并重新编码成可读格式,但我已经意识到我不确定所涉及的实际格式(例如,我的有限研究使我相信7位,无奇偶校验,1位停止位,数据将被视为“真正的ASCII”,但我不确定其有效性。)

许多先前提出的问题都涉及代码中的串口处理。我想我想知道我是否可以将这些接收到的数据翻译成可读格式。

1 个答案:

答案 0 :(得分:1)

我认为没有办法恢复数据:服务器上的UART可能已检测到很多“帧错误”,因此至少放弃了某些硬件级别的数据已经存在。

但是,您可能需要查看串行线路上的帧格式(例如here)。它没有任何复杂,但是w.r.t.我看到的挑战是你的问题:

每帧包含一个起始位,然后是n个数据位,可选择一个奇偶校验位,然后是一个或多个停止位。

因此,当UART需要8位帧时,每帧之后只发送一个停止位,它将不同步:

  1. 无论帧长度如何,UART都会检测到起始位,然后
  2. UART读取配置为的数据位数为8,在您的情况下为8,而发送方仅发送7位。
  3. 发送方使用停止位终止其帧,接收方将其误解为8位帧的最后一个数据位。
  4. 现在接收器希望看到一个停止位,而发送器可能只是通过发送下一个起始位继续发送,依此类推。
  5. 由于起始位是逻辑0,而停止位是逻辑1,UART将在大多数帧中检测到帧错误,并且可能会或可能不会向应用程序提供“损坏”帧的数据。

    但是,在任何情况下,接收器都会将一些实际数据位解释为控制位,即开始位或停止位,这些位肯定会在之后丢失。

    如果发送方已配置为每帧发送至少两个停止位,则只需修剪第8个“数据”位即可轻松恢复接收到的数据,这实际上是第一站-bit发送,因此总是为1。