Медленно работает экранный вывод программы обмена данными с Mega

Technolog
Offline
Зарегистрирован: 19.11.2014

   Есть работающий регулятор температуры сделанный на Ардуино 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 - без изменений.

 

 

vov4ik
Offline
Зарегистрирован: 10.09.2013
char* myStrings[]={"мпзлжнт !*+,-.0123456789:;<=>?"};
void setup() {
}
void loop() {
if (Sb >= 1 && Sb <= 7) {S = myStrings[Sb]; print_S(S, x, y);}
if (Sb >= 32 && Sb <= 63){S = myStrings[(Sb-25)] print_S(S, x, y);}
}
Так вроде побыстрей, обрабатывать должно.
Technolog
Offline
Зарегистрирован: 19.11.2014

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 что с оф. сайта бесплатная демоверсия? или с ограничением функционала.

 

vov4ik
Offline
Зарегистрирован: 10.09.2013

Извени в процесинге не силён, думал как в ардуине прокатит, такое ошущение что где-то создается буфер со влетевшими значениями, попробывать урезать буфер в библиотеке \modes\java\libraries\serial\src\processing\serial\Serial.java это только догадки.

  // read buffer and streams
 
  public InputStream input;
  public OutputStream output;
 
  byte buffer[] = new byte[32768];
  int bufferIndex;
  int bufferLast;