SerialPort在独立模式下超时

时间:2010-01-11 13:06:41

标签: c# serial-port

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

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

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

    设备工作正常并立即回答,当我通过visual studio以调试模式运行我的应用程序时一切正常。

  7. 但是当我尝试直接运行它时(没有使用visual studio和adebugger - 但仍然使用“Debug”选项编译)我在第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类的类中。

4 个答案:

答案 0 :(得分:2)

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

增加ReadTimeout属性的值。另请考虑使用DataReceived事件。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

听起来像是时间问题。在调试模式下,程序的运行速度比没有连接调试器的程序慢。必须有一个时间问题