【问题标题】:Serial reading, only first 128 values taken into account串行读取,仅考虑前 128 个值
【发布时间】:2013-04-20 07:42:17
【问题描述】:

我正在通过串行端口从 MCU 读取一条线。该行由 14 个以“OK”结尾的字符组成。字符被转换为 int 然后被处理。问题是当值大于 128 时。对于大于 128 的值,值(int 转换)保持在 63。这是代码:

            serialPort1.DiscardInBuffer();
            serialPort1.DiscardOutBuffer();
            serialPort1.Write("d");//request line from mcu
            Thread.Sleep(100);
            string line = serialPort1.ReadLine();

            int p1_low = line[0];
            int p1_high = line[1]*256;
            int p1 = p1_low + (p1_high);
            label1.Text = "Input Sensor: " + p1_low;

p1_low 比 p1_high 变化很多,当大于 128 时,它坚持 63 值。问题可能出在哪里?

【问题讨论】:

  • 63 是一个神奇的数字。它是 '?' 的 ASCII 码您的 MCU 正在发送一个值大于 127 的字节。听起来您确实使用了错误的方法,ReadLine() 应该只用于读取文本。使用 Read() 方法读取字节。或者修复您的 MCU 代码以发送文本而不是字节。

标签: c# visual-studio-2012 serial-port


【解决方案1】:

将编码改为

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

如您所见,默认编码会将大于 127 的字节值替换为“?”。编码 28591 保留大于 127 的字节值。

您不需要将线程作为 .ReadLine 块休眠。

【讨论】:

  • 我在想MCU需要时间来处理和发送数据。
  • 只要您将 .ReadTimeout 属性设置为默认值(无限)就没有关系。使用此设置,ReadLine 将阻塞,直到它从 SerialPort 接收到一行。
  • 这确实解决了我在处理 mpu6050 和 Unity c# 时遇到的问题。非常感谢!
【解决方案2】:

听起来您设置为使用 7 个数据位。将data bits config值改为8,这样就可以得到全部256个值了。

参考:http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.databits.aspx

【讨论】:

  • 我查看了设置,串口设置为接收8位,然后我看到值63,这是替换奇偶校验损坏字节的默认值。我正在使用另一个软件,我正在正确阅读。奇偶校验设置为无。我应该在字节之间插入时间(在单片机上)吗?
  • 问题在于编码,是的,我收到 7 位,但由于编码。现在的问题是将编码设置为 8 位。该怎么做?
  • 哦,我明白了。读取字节,而不是字符串! ReadBytes,不是ReadLine
  • 例如,我想将编码更改为 8 位。怎么做?之后,我将使用 readbyte 读取(仅读取一个字节,我还不知道如何通过终止来做到这一点)。
  • 如果你知道它是 14 个字符,每个 1 个字节,就读 14 个字节?还是不是总是 14 个字符?
【解决方案3】:

使用方法 写入(Byte[], int32, int32) 因为字节是数值 --> (0-255) 或 (0x00-0xFF) 或 (b00000000-11111111)。可以对字符或字符串进行编码,但不能对字节进行编码。 确保 不要使用 Write(Char[], int32, int32)

【讨论】:

猜你喜欢
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2014-02-18
  • 1970-01-01
  • 2016-09-20
相关资源
最近更新 更多