2015-04-21 6 views
-1

Итак, у меня есть это приложение C#, которое получает значения через последовательную связь от Arduino. Я рисую несколько кругов в зависимости от значений некоторых контактов (цифровых контактов). Когда я запускаю приложение, у меня небольшая задержка, как и почти секунда, которую я считаю слишком большой. Я меняю скорость в бодах с 9600 до 112500 (все-таки одно и то же). В приложении C# «чтение» выполняется путем вызова некоторых функций в таймере. Я изменил интервал таймера от 100 миллисекунд до 20 и все тот же задержка. Что делать ? Также приложение работает немного медленно, например, если я наводил курсор над кнопкой уменьшения, кнопка не выделяется мгновенно.Как получить несколько значений от Arduino «почти» в реальном времени на C#?

+0

Я бы хотел увидеть какой-то код, но я думаю, что причиной такого поведения может быть то, что вы написали поток чтения, который никогда не останавливается, поэтому использование ЦП всегда на 100%, даже если это не необходимо. – frarugi87

+0

Я надеюсь, что не слишком много кода ... https://www.dropbox.com/s/igk4l3gkp5mjmga/Desktop.rar – user3672802

ответ

1

Я думаю, что нашел проблему (или хотя бы одну из проблем).

В вашем случае клещевого Вы писали

личное Void

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 событиях.

+1

Тогда есть полное безумие всех этих методов «Конвертировать», половина которых делает абсолютно ничего вообще *. –