2010-10-15 36 views
1

我有一個C#程序的問題。 通過串口我收到一個大約110個字符的字符串。 這部分工作正常,但是當我添加代碼來分割字符串時,我收到了一些行後的錯誤。 以下是錯誤我得到:C#中的串口數據接收問題#

**類型「System.ArgumentOutOfRangeException」未處理的異常出現在mscorlib.dll

其他信息:索引和長度必須引用在字符串中的位置**

下面是代碼:

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
     if (!comport.IsOpen) return; 

     if (CurrentDataMode == DataMode.Text) 
     { 
     // Read all the data waiting in the buffer 
     string data = comport.ReadExisting(); 

     Log(LogMsgType.Incoming, data); 
     string ziua = data.Substring(0, 8); 
     string ora = data.Substring(8, 8); 
     string linie = data.Substring(18, 1); 
     string interior = data.Substring(22, 3); 
     string durata1 = data.Substring(26, 4); 
     string durata2 = data.Substring(30, 8); 
     string nrtel = data.Substring(38, 10); 
     string tipapel = data.Substring(75, 1); 
     string acct = data.Substring(76, 5); 


     } 
     else 
     { 
     int bytes = comport.BytesToRead; 

     byte[] buffer = new byte[bytes]; 

     comport.Read(buffer, 0, bytes); 

     Log(LogMsgType.Incoming, ByteArrayToHexString(buffer)); 
     } 
    } 

編輯:

我測試過每串和他們中的任何一個都可以。 字符串長度爲112.它不能縮短。

此錯誤後的112 ......約一個幾行半

回答

4

這是串行端口的典型行爲。他們非常緩慢。 DataReceived事件觸發時,通常只會獲得一個或兩個字符。值得注意的是,它在調試時效果很好,因爲單步執行代碼可以讓串口有很多時間來接收附加字符。但是,只要你沒有調試器就運行,它會去Kaboom,因爲字符串不夠長。

您需要修改代碼,方法是將收到的字符串附加到類作用域的字符串變量中。只有在收到您期望的所有字符後才解析字符串。您需要一些方法才能知道您已收到完整回覆。大多數串行設備通常會用特殊字符來終止字符串。通常是換行。

如果是這種情況,可以通過將SerialPort.NewLine屬性設置爲該終結符並調用ReadLine()而不是ReadExisting()來簡化它。

2

「數據」的長度看起來可能是太短,呼籲「串」之一。在訪問可能不存在的部分之前,請檢查您期望的字符串的長度。

+0

這個答案是正確的。我建議您通過查看堆棧跟蹤消息來學習診斷錯誤。你會注意到這個錯誤與串口沒有任何關係,但是使用字符串操作。 – usr 2010-10-15 16:26:28

0

例外情況是告訴你,在某些時候,Substring被給出超過字符串長度的參數。這可能意味着您沒有從串口獲取您期望的數據。嘗試在第一次調用Substring時插入一個斷點,然後檢查data的內容以確保您正在閱讀的設備沒有發送某種類型的錯誤代碼或其他代碼,而不是您的代碼所期望的內容。

0

在開始拆分之前,您應該驗證字符串的長度。在那裏放置一個條件來處理字符串小於你期望的情況,然後看看錯誤是否持續。

2

在處理之前,你不檢查你有足夠的數據。 SerialPort.ReadExisting Method只是

讀取所有立即可用字節,基於編碼,在流和對象的SerialPort的輸入緩衝器兩者。

您的設備可能只是沒有時間來傳遞所有數據。所以你需要重寫你的邏輯來連接傳入的數據並在收到足夠的數據後處理它。

0

嘗試使一個長度爲檢查這樣每個變量賦值:

string acct = (data.length >= 81) ? data.Substring(76, 5) : string.empy; 

的data.length可能比你的子串(76 + 5)的總長度短。