Медленно работает экранный вывод программы обмена данными с Mega
- Войдите на сайт для отправки комментариев
Есть работающий регулятор температуры сделанный на Ардуино Mega, с выводом заданных и действительных температур на LCD экран и с отравкой того что отображается на экране на компьютер по USART. Для удаленного контроля температур и управления настройками регулятора написал скетч на Processing.
import processing.serial.*; // подключаем библиотеку Serial
/*--------------------------------------------------------------------------*/
Serial myPort; // создаём обьект класса Serial
int x = 1; // место ячейки печати по x
int y = 1; // место ячейки печати по y
char S; // переменная для печатаемого байта
int Sb = -1; // переменная для входящего байта
int byte_znak; // управляющий символ
/*--------------------------------------------------------------------------*/
void setup()
{
size(294, 110); // размер окна
textFont(createFont("CourierNewPS-BoldMT-96", 96)); // шрифт
background(0); // фон
textSize(20); // размер текста
String portName = Serial.list()[0]; // в автомате определяем номер порта
myPort = new Serial(this, portName, 9600); // типа инициализация порта с параметрами
}
/*--------------------------------------------------------------------------*/
void draw() // основная функция (типа loop в Ардуино)
{if (myPort.available() > 0) // если есть пришедший символ
{Sb = myPort.read();} // читаем символ
if (keyPressed && (key == CODED)) // Клавиша CODED
{if (keyCode == LEFT) {byte_znak = '4';} // Стрелка влево
else if (keyCode == RIGHT) {byte_znak = '6';} // Стрелка вправо
else if (keyCode == UP) {byte_znak = '8';} // Стрелка вверх
else if (keyCode == DOWN) {byte_znak = '5';}} // Стрелка вниз
if (Sb == 96 && byte_znak != 0) {myPort.write(byte_znak); delay (200); byte_znak = 0;}
if (Sb >= 8 && Sb <= 11) {y = Sb - 7;} // курсор по x
else if (Sb >= 12 && Sb <= 31) {x = Sb - 11;} // курсор по y
else if (Sb == 36) // очистка экрана
{background(0,0,0);}
else if (Sb >= 1 && Sb <= 7)
{ if (Sb == 1) {S = 'м';} // назначение пришедшему байту символа для печати
else if (Sb == 2) {S = 'п';}
else if (Sb == 3) {S = 'з';}
else if (Sb == 4) {S = 'л';}
else if (Sb == 5) {S = 'ж';}
else if (Sb == 6) {S = 'н';}
else if (Sb == 7) {S = 'т';}
print_S(S, x, y);}
else if (Sb >= 32 && Sb <= 63)
{ if (Sb == 32) {S = ' ';}
else if (Sb == 33) {S = '!';}
else if (Sb == 42) {S = '*';}
else if (Sb == 43) {S = '+';}
else if (Sb == 44) {S = ',';}
else if (Sb == 45) {S = '-';}
else if (Sb == 46) {S = '.';}
else if (Sb == 48) {S = '0';}
else if (Sb == 49) {S = '1';}
else if (Sb == 50) {S = '2';}
else if (Sb == 51) {S = '3';}
else if (Sb == 52) {S = '4';}
else if (Sb == 53) {S = '5';}
else if (Sb == 54) {S = '6';}
else if (Sb == 55) {S = '7';}
else if (Sb == 56) {S = '8';}
else if (Sb == 57) {S = '9';}
else if (Sb == 58) {S = ':';}
else if (Sb == 59) {S = ';';}
else if (Sb == 60) {S = '<';}
else if (Sb == 61) {S = '=';}
else if (Sb == 62) {S = '>';}
else if (Sb == 63) {S = '?';}
print_S(S, x, y);}
else if (Sb >= 65 && Sb <= 95)
{ if (Sb == 65) {S = 'A';}
else if (Sb == 66) {S = 'B';}
else if (Sb == 67) {S = 'C';}
else if (Sb == 68) {S = 'D';}
else if (Sb == 69) {S = 'E';}
else if (Sb == 70) {S = 'F';}
else if (Sb == 71) {S = 'G';}
else if (Sb == 72) {S = 'H';}
else if (Sb == 75) {S = 'K';}
else if (Sb == 76) {S = 'L';}
else if (Sb == 77) {S = 'M';}
else if (Sb == 78) {S = 'N';}
else if (Sb == 79) {S = 'O';}
else if (Sb == 80) {S = 'P';}
else if (Sb == 81) {S = 'Q';}
else if (Sb == 82) {S = 'R';}
else if (Sb == 83) {S = 'S';}
else if (Sb == 84) {S = 'T';}
else if (Sb == 85) {S = 'U';}
else if (Sb == 86) {S = 'V';}
else if (Sb == 87) {S = 'W';}
else if (Sb == 88) {S = 'X';}
else if (Sb == 89) {S = 'Y';}
else if (Sb == 90) {S = 'Z';}
else if (Sb == 94) {S = '^';}
else if (Sb == 95) {S = '_';}
print_S(S, x, y);}
else if (Sb >= 97 && Sb <= 255)
{ if (Sb == 97) {S = 'a';}
else if (Sb == 98) {S = 'b';}
else if (Sb == 99) {S = 'c';}
else if (Sb == 100) {S = 'd';}
else if (Sb == 101) {S = 'e';}
else if (Sb == 102) {S = 'f';}
else if (Sb == 103) {S = 'g';}
else if (Sb == 104) {S = 'h';}
else if (Sb == 105) {S = 'i';}
else if (Sb == 106) {S = 'j';}
else if (Sb == 107) {S = 'k';}
else if (Sb == 108) {S = 'l';}
else if (Sb == 109) {S = 'm';}
else if (Sb == 110) {S = 'n';}
else if (Sb == 111) {S = 'o';}
else if (Sb == 112) {S = 'p';}
else if (Sb == 113) {S = 'q';}
else if (Sb == 114) {S = 'r';}
else if (Sb == 115) {S = 's';}
else if (Sb == 116) {S = 't';}
else if (Sb == 117) {S = 'u';}
else if (Sb == 118) {S = 'v';}
else if (Sb == 119) {S = 'w';}
else if (Sb == 120) {S = 'x';}
else if (Sb == 121) {S = 'y';}
else if (Sb == 122) {S = 'z';}
else if (Sb == 126) {S = '~';}
else if (Sb == 127) {S = '~';}
else if (Sb == 255) {S = '!';}
print_S(S, x, y);}
Sb = -1;}
/*--------------------------------------------------------------------------*/
void print_S(char SS, int xx, int yy)
{
if (xx > 20) {xx = 0;} // защита от выхода за пределы
fill(0, 0, 0);
rect(xx * 14 - 6, yy * 22 - 18, 14, 22); // черный прямоугольник в ячейке чтоб не наложивались знаки
fill(150, 200, 255);
text(SS, xx * 14 - 6, yy * 22); // печатаем символ
x = x + 1;
if (x > 20) {x = 0;} // защита от выхода за пределы
}
/*--------------------------------------------------------------------------*/
Скетч работает в плане приёма данных с Ардуино и отправки управляющих символов при нажатии клавиш на компьютере безупречно, приходит и отправляется всё и мгновенно - это отображается на LCD экране подключенному к Ардуино. А вывод на экран компьютера тормозит как в замедленном воспроизведении кинофильма, притом в 2-3 раза по скорости относительно реальных событий. Не предполагал что такое может быть, после запуска скетча Processing и редактирования c компьютера заданной температуры (смотрел по показаниях LCD) взял и отсоединил кабель связывающий Ардуино с компьютером, замедленный вывод в окно программы "видео" моего корректирования продолжался и без кабеля!
Исправить не смог, подскажите куда копать. Может Processing так работает, ставил разные версии 1.5.1, 2.2.1, 3.0 - без изменений.
Processing ругается на строку
char* myStrings[] = {"мпзлжнт ! *+,-. 0123456789:;<=>? ABCDEFGHIJKLMNOPQRSTUVWXYZ ^_ abcdefghijklmnopqtuvwxyz ~~"};
expecting EOF, found 'char'
но дело не в этом. Байты принимаются синхронно их отправке с Меги, не теряется ни один, значит код срабатывает без задержек, а вот печать на экран идёт как бы в буфер, а потом на малой скорости выводится в окно программы. Сначала думал что не успевает печатать принятое и поставил паузы между пердаваемыми пакетами (~ 80 байт) в 10 секунд (пауза была 1 секунда), но никакой разницы. При явном бездействии программа всё равно выводит на экран в нарастающем отставании от реального вывода на LCD на Ардуине. То что на LCD вижу через 5 секунд после включения программы, на компьютере увижу только через 12 секунд, а что на LCD вижу через 20 секунд после включения программы, на компьютере увижу только через 45 секунд. Добавлю: печать символов на LCD и их отправка по USART идут последовательно один символ на экран > один символ по USART на компьютер и т.д. с минимальным отставанием по времени, это ~ 2 милисекунды. Если после 5 минут работы программы вытянуть кабель связи с USB порта компьютера, то в окне программы еще 6-7 минут будут отображаться те же действия которые LCD показал в реальном времени, покуда остановятся на поледнем кадре. Может Processing что с оф. сайта бесплатная демоверсия? или с ограничением функционала.
Извени в процесинге не силён, думал как в ардуине прокатит, такое ошущение что где-то создается буфер со влетевшими значениями, попробывать урезать буфер в библиотеке \modes\java\libraries\serial\src\processing\serial\Serial.java это только догадки.