У меня небольшая проблема с моим проектом Arduino.
По сути, я делаю аппаратный монитор, который отображает температуру, тактовую частоту, скорость вентилятора и т. Д.
Я делаю это, отправляя значения тактовой частоты, температуры и т. Д. В arduino через последовательный монитор. Arduino считывает эти значения и выводит на экран
Проблема заключается в следующем. Он без проблем читает последовательный вывод. Но отображение не работает должным образом. Arduino всегда загружает значения на дисплее, а обновление занимает 10-15 с, когда я хочу, чтобы оно равнялось 1 с.
Может ли быть так, что имена значений, которые C # отправляет в Arduino, слишком длинные, поэтому для выполнения всего этого за короткий промежуток времени требуется слишком много времени и вычислительной мощности ??
Кроме того, чем меньше значений, которые я позволяю отображать arduino на экране, тем быстрее он становится.
Я покажу вам серийный монитор Arduino и приведенный ниже код (да, я мог допустить много ошибок, я только что запустил Arduino 4 месяца назад)
Последовательный монитор:
void RefreshAllValues()
{
static bool isBuffering = false;
int CPUL;
int GPUL;
int RAMT;
int RAMA;
int CPUC;
int GPUC;
int GPUMC;
int CPUT;
int GPUT;
static String IncomingMessage = "";
if (Serial.available() > 0)
{
char IncomingChar = (char)Serial.read();
if (IncomingChar == '#')
{
isBuffering = true;
IncomingMessage = "";
}
if (IncomingChar == '*')
{
isBuffering = false;
IncomingMessage += IncomingChar;
if (IncomingMessage.startsWith("#CPU_LOAD:"))
{
int dv = IncomingMessage.indexOf(":");
CPUL = IncomingMessage.substring(dv + 1).toInt();
CPULoad = String(CPUL) + "%";
IncomingMessage = "";
}
else if (IncomingMessage.startsWith("#GPU_LOAD:"))
{
int dv = IncomingMessage.indexOf(":");
GPUL = IncomingMessage.substring(dv + 1).toInt();
GPULoad = String(GPUL) + "%";
IncomingMessage = "";
}
else if (IncomingMessage.startsWith("#TOTAL_RAM:"))
{
int dv = IncomingMessage.indexOf(":");
RAMT = IncomingMessage.substring(dv + 1).toInt();
RAMTotal = String(RAMT) + "MB";
IncomingMessage = "";
}
else if (IncomingMessage.startsWith("#AVAILABLE_RAM:"))
{
int dv = IncomingMessage.indexOf(":");
RAMA = IncomingMessage.substring(dv + 1).toInt();
RAMAvailable = String(RAMA) + "MB";
IncomingMessage = "";
}
else if (IncomingMessage.startsWith("#GPU_CLOCK:"))
{
int dv = IncomingMessage.indexOf(":");
GPUC = IncomingMessage.substring(dv + 1).toInt();
GPUClock = String(GPUC) + "Mhz";
IncomingMessage = "";
}
else if (IncomingMessage.startsWith("#GPU_MEMORY_CLOCK:"))
{
int dv = IncomingMessage.indexOf(":");
GPUMC = IncomingMessage.substring(dv + 1).toInt();
GPUMemory = String(GPUMC) + "Mhz";
IncomingMessage = "";
}
else if (IncomingMessage.startsWith("#CPU_CLOCK:"))
{
int dv = IncomingMessage.indexOf(":");
CPUC = IncomingMessage.substring(dv + 1).toInt();
CPUClock = String(CPUC) + "Mhz";
IncomingMessage = "";
}
else if (IncomingMessage.startsWith("#CPU_TEMP:"))
{
int dv = IncomingMessage.indexOf(":");
CPUT = IncomingMessage.substring(dv + 1).toInt();
CPUTemp = String(CPUT) + "C";
IncomingMessage = "";
}
else if (IncomingMessage.startsWith("#GPU_TEMP:"))
{
int dv = IncomingMessage.indexOf(":");
GPUT = IncomingMessage.substring(dv + 1).toInt();
GPUTemp = String(GPUT) + "C";
IncomingMessage = "";
}
}
if (isBuffering)
{
IncomingMessage += IncomingChar;
}
}
}
Отображение на экране:
tft.setFont(Terminal6x8);
RefreshAllValues();
delay(10); //Otherwise it skips the 1st value that comes through
tft.drawText(30, 10, "CPU");
tft.drawText(130, 10, "GPU");
tft.drawText(30, 20, CPULoad);
tft.drawText(30, 40, CPUClock);
tft.drawText(130, 20, GPUTemp);
tft.drawText(130, 40, GPUClock);
tft.drawText(130, 60, GPULoad);
tft.drawText(75, 85, RAMAvailable);
Я в принципе не знаю, как решить эту проблему, и поиск того, как установить интервал 5 с между последовательными чтениями, не дал мне никаких полезных результатов ..
Я надеюсь, что кто-то может помочь мне с этим
Спасибо