2014-10-28 68 views
0

我所著的程序與串行端口作爲這方面的工作:serialPort_DataReceived不exe文件

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     serialLabel.BackColor = Color.Red; 
     storage = serialPort1.ReadExisting(); 

     if (storage.Contains("CMGL")) 
     { 
      if (storage.Length > 65) 
      { 
       processUnreadedMessages(storage); 
      } 
      else 
      { 
       Thread.Sleep(500); 
      } 
     } 
     else if (storage.Contains("CMTI")) 
     { 
      serialPort1.Write("AT+CMGL\r"); 
      Thread.Sleep(500); 
     } 
     storage = ""; 
     serialLabel.BackColor = Color.Lime; 
    } 

在Visual Studio當我運行程序的工作好! 但是當我爲我的程序創建安裝程序或運行exe文件時,數據不會收到serialPort,並且我不會收到任何錯誤。但是當我用這個程序發送數據的時候它是可行的!

你能幫我嗎?

+0

您需要提供更多信息,我假設您已經記錄了消息,看看您的執行有多遠?記錄東西,瞭解問題所在。 – 2014-10-28 13:13:26

回答

2

有問題的線路可能是那些:

serialLabel.BackColor = Color.Red; 

serialLabel.BackColor = Color.Lime; 

有一個渺茫的機會,它仍然會在developent環境中工作,但是:

的DataReceived事件檢索是當從串口對象接收到的數據是 時,在輔助線程上產生。由於此事件在 輔助線程(而不是主線程)上引發,因此嘗試在主線程(例如UI元素)中修改某些 元素可能會引發 線程異常。如果需要修改主窗體或控件中的元素,請使用Invoke將更改請求發回,這將在適當的線程上執行 工作。

[msdn]

嘗試,而不是:

serialLabel.Invoke(new EventHandler(delegate 
{ 
    serialLabel.BackColor = Color.Red; 
})); 

另外:

  • 確保你不要碰應該從它創建的線程訪問GUI或任何沒有調用(例如,你也不應該寫入數據到EventLog而沒有調用)在你的方法processUnreadedMessages()
  • 檢查當您調試應用程序時是否沒有第一次機會例外
  • 檢查應用程序事件日誌以查找應用程序生成的消息。
  • 將您在serialPort1_DataReceived事件中收到的數據記錄到文件中,然後再執行其他任何操作(這將檢查DataReceived事件是否應該在所有時間引發)
  • 訂閱SerialPort。 ErrorReceived事件