【问题标题】:Receiving Invalid Data from Serial Port using SerialPort.ReadExisting()使用 SerialPort.ReadExisting() 从串行端口接收无效数据
【发布时间】:2010-12-05 18:39:05
【问题描述】:

我在 .NET 中编写了一个程序,它侦听特定的串行端口并处理正在接收的数据。我使用 com0com(Null-modem 模拟器)编写了一个测试程序,我的程序运行良好。我什至用 HyperTerminal 对其进行了测试,它似乎也可以正常工作。
但是,当我将软件与原始设备(从控制系统接收的输出)连接时,接收到的数据是乱码。它包含特殊字符。与超级终端连接时,同一设备会产生所需的输出。我更改了波特率、奇偶校验等,但收到的数据是同一组垃圾字符。
我使用了 SerialPort 组件的 DataReceived 事件,并使用以下代码行来捕获数据:

 字符串数据 = portRecieve.ReadExisting();

有人能告诉我我错过了什么吗?在当前环境中,设备的输出直接与点阵打印机连接,该打印机打印端口上接收到的任何内容。打印机似乎可以捕捉到正在发送的内容,但我的代码无法捕捉到。
如果您遇到过类似的情况,请分享您的发现。
谢谢

【问题讨论】:

    标签: c# .net serial-port hardware-interface


    【解决方案1】:

    你是怎么设置的

    SerialPort.DiscardNull
    SerialPort.Encoding
    

    也许向我们展示您收到的特殊字符的示例。

    【讨论】:

    • DiscardNull 设置为 False
      编码设置为 Default
      接收到的字符是混合的,一些 nul-chr(0),一些 chr(128)。
    • 我建议关闭放弃并先尝试编码。设备可以发送 UTF-8 吗?
    【解决方案2】:

    我可以想到数据可能出现乱码的原因如下:

    • 如果物理连接不良,您有时会得到垃圾(而不是什么都没有)。尝试拔下并重新插入引线 - 并检查您是否有正确的引线(例如,您需要一个 nullmodem 吗?)。通过签入超级终端,您似乎已经了解了这一点。

    • 如果波特率、停止位、奇偶校验不正确 - 听起来你已经涵盖了这一点

    • 您正在尝试以字符串形式接收数据。如果它不是以纯文本形式发送的,或者如果您的编码错误,那么它很容易看起来像垃圾一样。尝试使用二进制接收并检查您接收的原始数据。这将告诉您数据是错误还是 .net 转换搞砸了 - 消除中间人!

    【讨论】:

    • 是的,我现在将体验二进制接收。
    【解决方案3】:

    在我看来,设备正在将打印机置于某种特殊的图形模式。如果是这样,则发送到打印机的数据中可能存在转义序列,即。以转义 (27, 0x1B) 字符为特征的字符序列。 在这种情况下,您必须查看打印机手册以了解命令的作用。或者,您可以告诉设备使用简单的仅 ASCII 打印机,而不是智能打印机。

    【讨论】:

    • 打印机是普通的爱普生点阵打印机,打印似乎不是图形模式。 (我可以在超级终端上看到相同的输出)
    • 超级终端可能正在解释发送给它的代码,因此您在屏幕上看不到它们。我们真正需要的是接收到的数据的中等大小的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多