【问题标题】:SerialPort timeouts in standalone mode独立模式下的 SerialPort 超时
【发布时间】:2010-01-11 13:06:40
【问题描述】:

我的应用程序有一个奇怪的行为。

我打开一个 COM 端口以通过蓝牙与设备通信。我执行以下步骤:

  1. 打开虚拟COM口;
  2. 将远程蓝牙切换到命令模式;
  3. 执行少量命令(例如,读取远程设备的序列号);
  4. 将远程蓝牙切换到数据模式;
  5. 向设备发送数据;
  6. 读取一个字节的应答(ReadByte() 从 SerialPort 类);

    当我通过 Visual Studio 在调试模式下运行我的应用程序时,设备工作正常并立即响应,一切正常。

但是当我尝试直接运行它(没有附加 Visual Studio 和调试器 - 但仍然使用“调试”选项编译)时,我在第 6 步遇到超时异常。

该错误是完全可重现的(在 Visual Studio 中没有超时,并且每次都没有超时)。

有没有人知道可能导致这种行为的任何想法?

这是第 6 步的代码

    private byte[] ReadResponse() {

        try {
            int bytes2Read = 6;
            do {
                this.buffer.Append((byte)ReadByte()); // <- there the timeout occurs

                if (this.buffer.Length == 6) { // header receiver
                    // bytes 2 and 3 contain message length
                    bytes2Read = this.buffer[2] + (this.buffer[3] << 8);
                }
            } while (this.buffer.Length < bytes2Read);

            return this.buffer.ToArray();
        } finally {
            this.buffer.Clear();
        }
    }

该方法位于派生自 SerialPort 类的类中。

【问题讨论】:

  • 顺便说一句-串口的ReadTimeout属性是2秒,所以足够长(设备以毫秒为单位回答)。
  • 仍然,显示在 6) 中进行读取的代码。省去很多猜测。

标签: c# serial-port


【解决方案1】:

在调试时,您给端口驱动程序大量时间来接收字节。在您跳过 ReadByte() 调用之前,超时计时器不会开始运行,驱动程序可能已经收到了字节,因此 ReadByte() 立即返回。当您全速奔跑时不会发生这种情况。

增加 ReadTimeout 属性的值。也可以考虑改用 DataReceived 事件。

【讨论】:

    【解决方案2】:

    在某些虚拟 COM 端口中似乎存在错误,写入后立即超时。您可以通过在写入后插入延迟(尝试 10-20 毫秒)来部分解决它,但我还没有找到好的解决方案。

    Here is discussion on the bug in an ethernet-> RS232 virtual com port

    【讨论】:

      【解决方案3】:

      超时是SerialPort 的正常行为。它可以防止您的应用程序停止。

      您应该能够修改ReadTimeout 属性以增加超时时间。

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

      【讨论】:

        【解决方案4】:

        听起来像是时间问题。在调试模式下,程序的运行速度比没有附加调试器的情况下要慢。一定是时间问题

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-28
          • 2014-04-18
          • 1970-01-01
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 2018-09-29
          • 1970-01-01
          相关资源
          最近更新 更多