0

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

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

尽管该设置现已更正,但 CDR 中仍有大量数据目前无法理解,尽管这些文件通常可以用记事本等简单的方式读取。

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

许多先前提出的问题都涉及代码中的串行端口处理。我想我想知道是否可以将收到的数据转换为可读格式。

4

1 回答 1

1

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

但是,您可能想查看串行线路上的帧格式(例如此处)。无论如何它并不复杂,但是对于您的问题,我看到的挑战是:

每帧由一个起始位、n 个数据位、可选的奇偶校验位和一个或多个停止位组成。

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

  1. 不论帧长如何,UART 都会检测到起始位,然后
  2. UART 读取的数据位与配置的一样多,在您的情况下为 8 个,而发送方仅发送 7 个位。
  3. 发送方以停止位终止其帧,接收方将其误解为 8 位帧的最后一个数据位。
  4. 现在接收者希望看到一个停止位,而发送者可能只是通过发送下一个开始位继续传输,依此类推。

由于起始位是逻辑 0 而停止位是逻辑 1,因此 UART 将在大多数帧中检测到帧错误,并且可能会或可能不会将“损坏”帧的数据提供给应用程序。

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

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

于 2013-06-13T14:03:44.387 回答