【问题标题】:C# richtextbox data clipped while reading from serial port从串口读取时剪切的 C#richtextbox 数据
【发布时间】:2013-08-10 15:35:11
【问题描述】:

我正在编写一个 C# 程序,它可以连续地从串口获取数据并立即显示在 WPF 的富文本框中。问题是,当我使用下面的代码时,每个 HEX 值的第一位都被剪掉了,我得到了一个输出 (说)

B 3C 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 

而不是得到

0B 3C FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF.

为什么会发生这种情况,我犯了什么错误? 我已经检查了终端软件,我收到的数据是正确的。只有在我的程序中显示时,它才会剪辑第一位。

另外,我如何将前 2 个字节和后 2 个字节分开并阻止它显示在 Richtextbox 上。 代码如下:

 string received_data = serialPort1.ReadExisting();
char[] store_char_array = received_data.ToCharArray();
string display_text = "" ;
foreach (var i in store_char_array)
      {
         string hex_value = String.Format("{0:X}", Convert.ToUInt32(i));
  display_text += hex_value + " ";

 }

Invoke(new Action(() => richTextBox1.AppendText(display_text)));

提前致谢

【问题讨论】:

  • 改用 {0:X2} 格式字符串。并使用 Read(),而不是 ReadExisting(),所以你得到的是字节而不是字符串。
  • 感谢您的耐心等待!但是用 read() 替换它会得到一个 0 流。
  • 您可以假设 Read() 中存在错误或您的代码中存在错误。知道首先看哪里需要时间和经验,只有花时间才能得到。
  • 好的!这违背了我的所有逻辑! sp.readexisting() 工作顺利,并在富文本框中显示正确的结果,直到最高有效位(第 8 位)为 1。当第 8 位为 1 时,低 4 位变为 1111(F),高 4 位有效位变为 0011(3)。所以如果我有例如7E,它会在richtextbox中正确显示但是如果它是8A或9E(或任何MSB为1的字节),那么richtextbox总是显示3F。当我使用 readbyte 时,数据是正确的,一切正常,richtextbox 显示正确的结果,但速度较慢。
  • 有人知道为什么 sp.readexisting 会这样吗?

标签: c# serial-port


【解决方案1】:

这是编码的问题。您必须在配置串行端口时添加它:

SerialPort.Encoding = System.Text.Encoding.GetEncoding(28591)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多