none
serialPort寫入若錯誤時的寫法建議 RRS feed

  • 問題

  • private string COM(string Value2)
            {
                string EndCode = "";
                char[ ] SendBuffer = new char[150];
                char[ ] ReadBuffer = new char[150];
                for (int i = 0; i < 150; i++)
                {
                    ReadBuffer[i] = '  ';
                }
                SendBuffer = Value2.ToCharArray( );    
                serialPort1.Write(SendBuffer, 0, SendBuffer.Length);    
                Thread.Sleep(10);
                           
                do
                {
                    Thread.Sleep(5);
                } while (serialPort1.BytesToRead < 11);              
               Thread.Sleep(20);
               serialPort1.Read(ReadBuffer, 0, serialPort1.BytesToRead);
               string instring = new string(ReadBuffer);   
               EndCode = instring.Substring(5, 2);         
              
                return instring;
    }
    想請教各位,因接收訊號時,若有錯誤在do while中會一直迴圈直到正確為止,
    所以我想做個判斷,讓他如果出錯,則跳出另一個方法,讓他再重送一次字串,或是跳開不做,
    所以我將do while這段變更為以下的程式碼,但這樣的改法,我想應該是(Thread.Sleep出了問題...也許)
    所以請教大家這邊的判斷應該怎樣的寫法在這段判斷上會比較好~感謝各位
    Thread.Sleep(10);
    if (serialPort1.BytesToRead < 11)
               {
                   SendData();
               }
               else
               {
                   serialPort1.Read(ReadBuffer, 0, serialPort1.BytesToRead);
               }
                
                string instring = new string(ReadBuffer);    
               EndCode = instring.Substring(5, 2);  
        return instring;
    2011年8月12日 上午 03:44

解答

  • 一般來說取COM Port的資料,您可以使用Timer,每隔一段時間再取COM Port中的資料!

    或是在serialPort1的DataReceived事件中去組出資料出來!

    您可以參考 

    茂伯的 Serial Port通訊檢測

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已標示為解答 Louis Seven 2011年8月15日 上午 12:40
    2011年8月14日 上午 04:48

所有回覆

  • 讀寫之淺請先清緩衝區。

    為啥 SendData 會在你後面的判斷敘述中?

    一班來說是在迴圈前加個時間,在迴圈判斷迴圈多久了,超過一定時間就跳出迴圈,丟出例外逾時的訊息。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月12日 下午 03:14
  • 一般來說取COM Port的資料,您可以使用Timer,每隔一段時間再取COM Port中的資料!

    或是在serialPort1的DataReceived事件中去組出資料出來!

    您可以參考 

    茂伯的 Serial Port通訊檢測

     


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    • 已標示為解答 Louis Seven 2011年8月15日 上午 12:40
    2011年8月14日 上午 04:48
  • private string COM(string Value2)
            {
                string EndCode = "";
                char[ ] SendBuffer = new char[150];
                char[ ] ReadBuffer = new char[150];
                for (int i = 0; i < 150; i++)
                {
                    ReadBuffer[i] = '  ';
                }
                 SendBuffer = Value2.ToCharArray( );    
                serialPort1.Write(SendBuffer, 0, SendBuffer.Length);    
                Thread.Sleep(10);
                           
                do
                {
                    Thread.Sleep(5);
                } while (serialPort1.BytesToRead < 11);              
               Thread.Sleep(20);
               serialPort1.Read(ReadBuffer, 0, serialPort1.BytesToRead);
               string instring = new string(ReadBuffer);   
               EndCode = instring.Substring(5, 2);         
              
                return instring;
     
    }
    想請教各位,因接收訊號時,若有錯誤在do while中會一直迴圈直到正確為止,
    所以我想做個判斷,讓他如果出錯,則跳出另一個方法,讓他再重送一次字串,或是跳開不做,
    所以我將do while這段變更為以下的程式碼,但這樣的改法,我想應該是(Thread.Sleep出了問題...也許)
    所以請教大家這邊的判斷應該怎樣的寫法在這段判斷上會比較好~感謝各位
    Thread.Sleep(10);
    if (serialPort1.BytesToRead < 11)
               {
                   SendData();
               }
               else
               {
                   serialPort1.Read(ReadBuffer, 0, serialPort1.BytesToRead);
               }
                
                string instring = new string(ReadBuffer);    
               EndCode = instring.Substring(5, 2);  
         return instring;

    當時想法是說~因為通訊接受可能會漏掉封包的情況,所以我想再加個判斷,讓他可以接收到部隊的資訊能夠跳出~我想當時應該是腦袋打結吧~

    後來經過朋友的指導,說這樣的寫法,可能會造成遞迴的情況.

    這樣的話~所以現在改成用~

    throw new Exception 來丟出 ,並在另一方法做break~  

    我想之前這部分犯了一種程式技巧的錯誤~遞迴~馬上 更正更正~

    2011年8月15日 上午 12:38