【问题标题】:Incomplete Serial Port Read C#不完整的串口读取 C#
【发布时间】:2013-07-10 16:11:18
【问题描述】:

我正在尝试将连接到 COM 端口的扫描仪中的字节读取到字节数组中。 C# 中的串行端口库已经有一个读取函数,这是我用来尝试读取的函数。我进行了设置,以便将读入的字节输出到控制台。我正在使用一个非常可预测的协议,所以当我在代码中传递该行时,我知道我期待什么样的字节数组。但是,如果我运行程序,我只会读入一个字节。如果我重新运行程序的同一个实例(通过发送相同的读取命令),我会得到其余的预期字节。只有在我第三次运行它之后,我才能得到我期望的所有字节。如果我只是在读取行上插入断点并跨过该行,则可以完全避免此问题。如果我这样做,我每次都会得到完整的阅读。我的问题是,如何在不插入断点的情况下每次都完整读取?我尝试使用系统暂停方法来停止执行并让 COM 端口扫描足够快,但没有奏效。我也尝试过使用线程(参见下面的代码)。这也没有奏效。有什么建议吗?

    t = new Thread(() => device.Read(buffer));
    t.Start();
    t.Join();

再次,我的预期输出仅在重新发送读取命令几次或通过断点跳过上述命令后才以完整数据包的形式出现。否则,我会以小的“字节大小的样本”获得预期的输出。任何帮助表示赞赏!

【问题讨论】:

  • 你的代码不是有效代码,没有SerialPort的函数只接受一个字节数组。仅有的两个Read函数有bothhave三个参数
  • 为什么不使用串口datareceived事件来获取数据呢?无需使用额外的线程,因为 datareceived 处理程序位于其自己的线程中。
  • 读取过载以接受字节数组

标签: c# multithreading serial-port bytearray


【解决方案1】:

这是字节流的预期行为。循环读取并将接收到的许多字节一个接一个地泵入您的 ProtocolUnit 类实例(或其他),直到它完成并经过验证。

【讨论】:

  • Stream.Read 有一个很好的例子来说明如何正确调用Read
【解决方案2】:

我最近在这里发布了一个类似的问题: SerialPort.DataReceived Returning Strange Results

问题是,如您所知,程序试图从缓冲区读取数据,但不能保证设备已完成发出它正在运行的任何命令。我的建议是在这篇文章中实施第一个答案: Reading from the serial port in C#

我在DataReceived事件中的实现如下:

void serialPort_DataReceived(object s, SerialDataReceivedEventArgs e)
    {
        byte[] data = new byte[serialPort.BytesToRead];
        serialPort.Read(data, 0, data.Length);
        Console.Write(System.Text.Encoding.UTF8.GetString(data));
    }

只是将其连接到代码中:

serialPort.DataReceived += serialPort_DataReceived;

【讨论】:

    【解决方案3】:

    最好的方法是放入 while 循环并在字节读取之间提供 10 毫秒的睡眠时间。这将使扫描仪有 10 毫秒的时间在 COM 端口上写入数据。实际上,当您将扫描仪连接到网络端口时会出现问题。

    您还可以编写委托或事件,当数据从扫描仪完全读取时发出通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-11
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      相关资源
      最近更新 更多