2015-11-02 68 views
0

我正在編寫一個C#程序,通過串口與Arduino進行接口,並且我有一個函數updateRPMs(),它會使程序變得太慢而無法使用。它在使用時每1秒被調用一次。該程序運行幾個PWM風扇。C#程序因功能而減速

下面是函數:

private void updateRPMs() 
    { 
     TextBox[] RPMS = { Fan1RPM, Fan2RPM, Fan3RPM, Fan4RPM, Fan5RPM, Fan6RPM, Fan7RPM, Fan8RPM, Fan9RPM, Fan10RPM, Fan11RPM, Fan12RPM }; 
     List<String> sepData = new List<String>(); 
     if (CONNECTED) 
     { 
      String data = serialPort1.ReadLine(); 
      // MessageBox.Show(data); 

      sepData = (data.Split(';').ToList()); 


      if (sepData.Count == 12) 
      { 
       for (int i = 0; i < 12; i++) 
       { 
        RPMS[i].Text = sepData[i]; 
       } 
      } 
      serialPort1.DiscardOutBuffer(); 
     } 

    } 

這是後話了Arduino的將發送到程序:

a840.00;b885.00;c0;d0;e0;f0;g1635.00;h2070.00;i0;j0;k0;l0 

我知道我可以把這個給不同的線程,但我想有它會在計時器啓動後立即更新。

我想知道是否有什麼我可以改變,或者如果有什麼我愚蠢的東西。我是新來的C#和任何幫助,將不勝感激。

+0

您應該使用秒錶在C#檢查哪個部分代碼是造成問題。 – niksofteng

+0

首先是什麼調用這個函數?那麼,arduino多長時間發送一次數據?波特率?爲什麼不使用來自串行緩衝區的輸入數據?你爲什麼使用'DiscardOutBuffer'函數? – frarugi87

+0

1.我有一個定時器每1秒觸發一次調用函數。 2.每500ms。 3. 9600. 4.不確定你的意思?我認爲這是ReadLine所做的。 5.我猜如果我使用ReadLine()我不需要。 –

回答

0

對於從串口讀取,我建議你避免使用定時器從串口讀取。您可以使用DataReceived事件,每當從串行接收到一些數據時就會觸發該事件。

當然,您可以收到一個部分數據包,因此最好將數據存儲在緩衝區中然後進行分析。

String readBuffer = ""; 

private static void DataReceivedHandler(
        object sender, 
        SerialDataReceivedEventArgs e) 
{ 
    SerialPort sp = (SerialPort)sender; 
    readBuffer += sp.ReadExisting(); 

    int newLineIndex = -1; 
    while ((newLineIndex = readBuffer.IndexOf("\n")) >= 0) 
    { // Analyze buffer 
     String currentLine = readBuffer.Substring(0,newLineIndex); 
     if (currentLine.length() > 0) 
      analyzeLine(currentLine); 
     readBuffer = readBuffer.Substring(newLineIndex+1); 
    } 
} 

public void analyzeLine(String data) 
{ 
    static TextBox[] RPMS = { Fan1RPM, Fan2RPM, Fan3RPM, Fan4RPM, Fan5RPM, Fan6RPM, Fan7RPM, Fan8RPM, Fan9RPM, Fan10RPM, Fan11RPM, Fan12RPM }; 
    List<String> sepData = (data.Split(';').ToList()); 
    if (sepData.Count == 12) 
    { 
     for (int i = 0; i < 12; i++) 
     { 
      RPMS[i].Text = sepData[i]; 
     } 
    } 
} 

我假設你知道如何連接到一個事件,因爲你已經使用的定時器一個INI代碼;)

+1

謝謝,這個和對arduino代碼的調整修復了這個問題。 Arduino代碼有一個查詢風扇旋轉的函數,默認的超時時間爲1秒,從12個風扇獲取RPM需要一段時間。而C#代碼試圖在沒有任何事情導致放緩的情況下運行代碼。 –