使用 SerialPort.ReadExisting() 从串行端口接收无效数据

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案1】:

你是怎么设置的

SerialPort.DiscardNull
SerialPort.Encoding

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

【讨论】:

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

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

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

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

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

【讨论】:

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

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

【讨论】:

打印机是普通的爱普生点阵打印机,打印似乎不是图形模式。 (我可以在超级终端上看到相同的输出) 超级终端可能正在解释发送给它的代码,因此您在屏幕上看不到它们。我们真正需要的是接收到的数据的中等大小的示例。

以上是关于使用 SerialPort.ReadExisting() 从串行端口接收无效数据的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)