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

C# 以编程方式将串行端口数据更正为可读格式,c#,.net,serial-port,C#,.net,Serial Port,情况是,在我工作的地方,我们有一个呼叫数据记录器(CDR),通过串行端口将数据传送到服务器。据我所知,这方面的良好数据是所有电话的记录,这当然与资金支出有关 据我所知,服务器上的串行端口设置为接受9600波特的数据,8位,无奇偶校验,1个停止位;其目的是设置为接受9600波特、7位、无奇偶校验和1个停止位的数据 尽管该设置现在已被更正,但CDR中有大量数据目前无法理解,尽管这些文件通常可以用记事本这样简单的东西读取 我的问题是A.是否有可能恢复可读数据,以及B.如何实现这一点(就C#而言,这是理

情况是,在我工作的地方,我们有一个呼叫数据记录器(CDR),通过串行端口将数据传送到服务器。据我所知,这方面的良好数据是所有电话的记录,这当然与资金支出有关

据我所知,服务器上的串行端口设置为接受9600波特的数据,8位,无奇偶校验,1个停止位;其目的是设置为接受9600波特、7位、无奇偶校验和1个停止位的数据

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

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


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

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

但是,您可能需要查看串行线上的帧格式(例如)。这并不复杂,但w.r.t.你的问题我看到的挑战是:

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

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

  • UART检测到起始位,与帧长度无关,然后
  • UART读取的数据位与配置的数据位相同,在您的情况下为8位,而发送方仅发送7位
  • 发送方用停止位终止其帧,接收方错误地将其解释为8位帧的最后一个数据位
  • 现在,接收方希望看到一个停止位,而发送方可能只是继续发送下一个开始位,以此类推
  • 由于起始位为逻辑0,而停止位为逻辑1,UART将在大多数帧中检测到帧错误,可能会也可能不会向应用程序提供“中断”帧的数据

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


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

    Ascii为7位,128个字符。扩展Ascii为8位256个字符。可以发布一些数据吗?如果您查看位并查看它们的接收方式是否存在模式,您可能会成功解码。我同意@dbasnett的观点,查看数据流的示例会很有帮助。这是其中一个文件中的一小段内容,使用不正确的串行端口设置:130506 102615ÿÎĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀĀµ±´±³¹¶´¹Š ¦ °°°° °°°° ŠÎ °±¸ °° ¶´¸° Ô°°°€°¹± °µ¯°¶ ±°º²³ °°º°³º²° Á µ±´²¸¹²µµŠ ¦ °°°° °°°° ŠÎ °±¹ °° ¶´²µ Ô°°°€°¹² °µ¯°¶ ±°º²¶ °º°º´´´Áµ±´´¨²´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´´?将其粘贴为文本可能会导致问题。顺便说一句,你可以用你的问题来添加新的信息,这比把它放在评论里要好。另外,您能提供的任何其他信息都会有用吗?你认为它会是什么样子?这个文件有多少字节?你能根据端口打开的时间来估计它的大小吗?如果每个字符之间至少有一位空闲时间,就不会有帧错误。这可能不太可能,但至少有可能考虑。这是正确的。额外的“空闲”时间正是额外停止位的含义,即当端口配置为8n2时。然而,另一个含义是,传输的最后一帧不会导致帧错误,因此可以恢复。我同意最后一帧本身可能不会导致错误,但最常见的恢复策略(丢弃数据并重置端口)可能不允许干净地接收。如果传输是7n1,帧间几乎没有空闲时间,我认为恢复任何有意义的数据量的机会不大。