Итак, у меня есть это приложение C#, которое получает значения через последовательную связь от Arduino. Я рисую несколько кругов в зависимости от значений некоторых контактов (цифровых контактов). Когда я запускаю приложение, у меня небольшая задержка, как и почти секунда, которую я считаю слишком большой. Я меняю скорость в бодах с 9600 до 112500 (все-таки одно и то же). В приложении C# «чтение» выполняется путем вызова некоторых функций в таймере. Я изменил интервал таймера от 100 миллисекунд до 20 и все тот же задержка. Что делать ? Также приложение работает немного медленно, например, если я наводил курсор над кнопкой уменьшения, кнопка не выделяется мгновенно.Как получить несколько значений от Arduino «почти» в реальном времени на C#?
-1
A
ответ
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
Тогда есть полное безумие всех этих методов «Конвертировать», половина которых делает абсолютно ничего вообще *. –
Я бы хотел увидеть какой-то код, но я думаю, что причиной такого поведения может быть то, что вы написали поток чтения, который никогда не останавливается, поэтому использование ЦП всегда на 100%, даже если это не необходимо. – frarugi87
Я надеюсь, что не слишком много кода ... https://www.dropbox.com/s/igk4l3gkp5mjmga/Desktop.rar – user3672802