2010-01-11 43 views
1

我有一个奇怪的行为,我的应用程序。在独立模式下的SerialPort超时

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

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

    该设备工作正常,立即回答,一切都很好,而我通过Visual Studio在调试模式下运行我的应用程序。

但是,当我尝试直接运行(不Visual Studio和adebugger attatched - 但仍与“调试”选项编译)我会在第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类导出类的代码。

+0

顺便说一句 - 串行端口的ReadTimeout属性是2秒所以很长eanough(以毫秒为单位的设备应答)。 – 2010-01-11 13:20:16

+1

仍然,显示在6)中读取的代码。节省很多猜测。 – 2010-01-11 13:26:42

回答

0

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

2

当您正在调试时,您正在给端口驱动程序大量的时间来接收一个字节。超时定时器不会开始运行,直到您执行ReadByte()调用,驱动程序可能已经收到该字节,因此ReadByte()会立即返回。全速运行时不会发生这种情况。

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

+0

+1强烈建议使用DataReceived事件 – SwDevMan81 2010-01-11 13:29:08