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

C# 使用SerialPort.ReadExisting()从串行端口接收无效数据,c#,.net,serial-port,hardware-interface,C#,.net,Serial Port,Hardware Interface,我在.NET中编写了一个程序,用于侦听特定的串行端口并处理接收到的数据。我使用com0com(空调制解调器模拟器)编写了一个测试程序,我的程序运行良好。我甚至用HyperTerminal测试了它,它似乎也工作得很好。 然而,当我将软件与原始设备(从控制系统接收的输出)连接时,接收到的数据被篡改了。它包含特殊字符。当与超级终端连接时,相同的设备产生所需的输出。我更改了波特率、奇偶校验等,但收到的数据是同一组垃圾字符。 我使用了SerialPort组件的DataReceived事件,并使用以下代码行

我在.NET中编写了一个程序,用于侦听特定的串行端口并处理接收到的数据。我使用com0com(空调制解调器模拟器)编写了一个测试程序,我的程序运行良好。我甚至用HyperTerminal测试了它,它似乎也工作得很好。
然而,当我将软件与原始设备(从控制系统接收的输出)连接时,接收到的数据被篡改了。它包含特殊字符。当与超级终端连接时,相同的设备产生所需的输出。我更改了波特率、奇偶校验等,但收到的数据是同一组垃圾字符。
我使用了SerialPort组件的DataReceived事件,并使用以下代码行捕获数据:
string data = portRecieve.ReadExisting(); string data=portRecieve.ReadExisting()
谁能告诉我我错过了什么?在当前环境中,设备的输出直接与点阵打印机连接,点阵打印机打印端口上接收到的任何内容。打印机似乎能捕获正在发送的内容,但我的代码无法捕获。
如果您遇到过类似的情况,请分享您的发现
谢谢

你是怎么设置的

SerialPort.DiscardNull
SerialPort.Encoding
也许可以给我们看一个你正在接受的特殊角色的例子。

你是如何设置的

SerialPort.DiscardNull
SerialPort.Encoding

也许可以给我们看一个你正在接受的特殊字符的例子。

我觉得这个设备好像在把打印机置于某种特殊的图形模式。如果是这样,发送到打印机的数据中可能存在转义序列,即以转义(27,0x1B)字符开始的字符序列。
在这种情况下,您必须查看打印机手册以了解这些命令的作用。或者,您可以告诉设备使用简单的ASCII专用打印机,而不是intellifent打印机。

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

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

  • 如果有一个坏的物理连接,你有时可能只是得到垃圾(而不是什么都没有)。尝试拔下并重新插上导线-并检查您的导线是否正确(例如,您是否需要一个空调制解调器?)。您似乎已通过签入超级终端解决了这一问题

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

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


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

  • 如果有一个坏的物理连接,你有时可能只是得到垃圾(而不是什么都没有)。尝试拔下并重新插上导线-并检查您的导线是否正确(例如,您是否需要一个空调制解调器?)。您似乎已通过签入超级终端解决了这一问题

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

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


DiscardNull设置为False
Encoding设置为Default
接收的字符是混合的,有几个nul chr(0),一些chr(128)。我建议先取消Discard并尝试编码。设备是否可以发送UTF-8?DiscardNull设置为False
Encoding设置为Default
接收到的字符是混合的,有几个nul chr(0),一些chr(128)。我建议取消Discard,先尝试编码。设备是否可以发送UTF-8?是的,我现在将体验二进制接收。是的,我现在体验二进制接收。打印机是普通的Epson点阵打印机,打印似乎不在图形模式下。(正如我在超级终端上看到的一样)可能超级终端正在解释发送给它的代码,因此你在屏幕上看不到它们。我们真正需要的是一个接收到的数据的中等大小的示例。打印机是一个普通的Epson点阵式打印机,并且打印似乎不处于图形模式。(正如我在超级终端上看到的一样)可能超级终端正在解释发送给它的代码,因此你在屏幕上看不到它们。我们真正需要的是接收数据的中等大小的示例。