【问题标题】:Data gets corrupted during transmission over the serial port数据在通过串行端口传输期间损坏
【发布时间】:2011-10-28 21:47:58
【问题描述】:

我正在开发一个程序来与旧系统进行通信。我为此使用 System.IO.Ports.SerialPort。问题是当我发送更长的消息时,消息会损坏。我使用线路监听器并得到以下结果

我发送的内容

aa 01 00 00 12 03 06 18 02 c1 94 02 c1 94 00 00 00 00 00 00 00 00 00 00 00 00 1e fd 

我得到了什么

c2 aa 01 00 00 12 03 06 18 02 c3 81 c2 94 02 c3 81 c2 94 00 00 00 00 00 00 00 00 00 00 00 00 1e c3 bd

我使用的代码是

_comPort.Encoding = new UTF8Encoding();
_comPort.PortName = PortName;  //Com1
_comPort.BaudRate = BaudRate;  //9600
_comPort.StopBits = StopBits;  //1
_comPort.DataBits = DataBits;  //8
_comPort.Parity   = Parity;    //None
_comPort.Open();

_comPort.Write(messageStr);

为什么数据会损坏,我该如何解决?

【问题讨论】:

  • 不要将二进制数据存储在字符串中。 SerialPort.Write() 当你传递一个 byte[] 时,not 用 ascii 编码,字节不需要编码。

标签: c# serial-port communication


【解决方案1】:

我的猜测是 messageStr 是一个字符串,您会看到编码问题。您已经明确指定了 UTF-8 编码,所以这就是您得到的 - 但我怀疑这不是您真正想要的。

您已经显示了 二进制 数据,所以我假设您实际上想要发送该二进制数据 - 在这种情况下,您应该使用 Write(byte[], int, int) 重载。

如果您真的想要编写文本数据,您可能只需要选择正确的编码 - 但您需要向我们提供更多信息,以便我们帮助您做出正确的选择。

【讨论】:

  • 是的,我要发送的是二进制数据。问题是 Write(byte[], int, int) 和 Write(string) 默认使用 ASCIIEncoding 来编码字符,然后它不能处理大于 127 (0x7F) 的字符。我有几个比这更大的位。这就是我改变编码的原因。我应该改用什么编码?
  • @magol 如果是这样,您可能需要使用 base-64 (Convert.ToBase64String);但是,我希望 Write(byte[], ...) 写二进制
  • 如手册中所示为Write(byte [], int, int),是否需要Encoding。不过我会试试的。
  • @magol:这些是字节,而不是字符。我意识到Write 的备注部分谈到了编码,但我认为它真的不应该。您是否尝试过使用Write(byte[]...)?如果它应用了任何编码,那就太奇怪了。 (我认为这是一个错误,甚至在页面上都提到过。)从概念上讲,这里没有字符,只有字节,所以编码不应该是相关的。
  • 你是对的。 Write(byte[], int, int) 不关心编码。非常感谢您的帮助:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多