2015-04-21 45 views
-1

所以我有這個C#應用程序,它通過Arduino的串行通信獲取值。我根據某些引腳(數字引腳)的值爲某些圓圈着色。當我運行這個應用程序時,我有一點點延遲,就像我認爲太多的一秒鐘。我將波特率從9600改爲112500(仍然是一樣的)。在C#應用程序中,「讀取」是通過調用定時器中的某些函數來完成的。我將計時器間隔從100毫秒改爲20,仍然是相同的延遲。該怎麼辦 ?此外,應用程序運行速度有點慢,例如,如果將光標懸停在最小化按鈕上方,該按鈕不會立即突出顯示。如何從Arduino「幾乎」在C#中實時獲取多個值?

+0

我想看一些代碼,但我認爲這種行爲的原因可能是因爲您編寫了一種永不停頓的閱讀線程,所以即使沒有必要,CPU使用率也始終保持在100%。 – frarugi87

+0

我希望不是太多的代碼... https://www.dropbox.com/s/igk4l3gkp5mjmga/Desktop.rar – user3672802

回答

1

我想我找到了問題(或者至少有一個問題)。

在你的Tick事件你寫

私人無效

tempreader_Tick(object sender, EventArgs e) 
{ 
    red_light1 = Convert.ToInt32(comport.message(4, 8, 32)); 
    red_light2 = Convert.ToInt32(comport.message(4, 8, 33)); 

    yellow_light1 = Convert.ToInt32(comport.message(4, 8, 34)); 
    yellow_light2 = Convert.ToInt32(comport.message(4, 8, 35)); 

    green_light1 = Convert.ToInt32(comport.message(4, 8, 36)); 
    green_light2 = Convert.ToInt32(comport.message(4, 8, 37)); 

    [other actions] 

comport.message

public string message(byte paramone, byte paramtwo, byte paramthree) 
{ 
    try 
    { 
     byte[] buffer = new byte[3]; 
     buffer[0] = Convert.ToByte(paramone); 
     buffer[1] = Convert.ToByte(paramtwo); 
     buffer[2] = Convert.ToByte(paramthree); 
     currentPort.Open(); 
     currentPort.Write(buffer, 0, 3); 
     int intReturnASCII = 0; 
     char charReturnValue = (Char)intReturnASCII; 
     Thread.Sleep(200); 
     int count = currentPort.BytesToRead; 
     string returnMessage = ""; 
     while (count > 0) 
     { 
      intReturnASCII = currentPort.ReadByte(); 
      returnMessage = returnMessage + Convert.ToChar(intReturnASCII); 
      count--; 
     } 
     currentPort.Close(); 
     return returnMessage; 
    } 
    catch (Exception e) 
    { 
     return "Error"; 
    } 

} 

其中包含Thread.Sleep(200)。所以不管你多快打勾,主線程都會停留在這個功能上至少1.2秒。

必須減少此值,否則請使用類似於backgroundworker的內容來執行該作業並更新其runcompleted事件中的GUI。

+1

那麼所有'轉換'方法都有絕對的瘋狂,其中一半是*絕對的一點都沒有*。 –