2010-01-11 57 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