Потеря символов в бегущей строке

Тема в разделе "Проводная и беспроводная связь", создана пользователем Рокки1945, 14 июл 2020.

  1. Рокки1945

    Рокки1945 Гуру

    • 5.10. Запрещено публиковать исходный код без BB-кода — CODE.
    Здравствуйте!
    Пытаюсь довести до ума бегущую строку с передачей строки по блютуз.
    Проблема осталась одна - не могу победить иногда потерю символов при передаче.
    Библиотеки использую Adafruit_NeoMatrix.h и стандартный Serial.
    Уарт прослушивал - в терминале всё проходит все слова чётко, но при этом строка иногда теряет символы и чем выше скорость ставишь бегущей строки тем больше потеря. Когда ставишь задержку ~ 300 мс потерь меньше. Принимаю вот так -
    Код (C++):
    for (i = 0; i < 128; i++){incoming = Serial.read();
    В основном цикле строка едет вот так -
    Код (C++):
    {if (millis() - timing > Speed){timing = millis();{if (freez == true)//если не было заморозки
    {matrix.fillScreen(0);matrix.setCursor(x,0);matrix.print(utf8rus(incoming));length_buffer = strlen(incoming)-1;if(--x < -(length_buffer*rus)) {x = matrix.width();}matrix.show();}}}}
    Скажите куда купать кто сталкивался. Спасибо.
     
    Последнее редактирование модератором: 14 июл 2020
  2. SergeiL

    SergeiL Оракул Модератор

    Ардуино принимает с хард или софт порта?
    Плата какая?
    Пока строка выводится, символы и теряются.
    Ведь первые символы не теряются?
    Теряются после 16-го или 64-го?
     
    Рокки1945 нравится это.
  3. Рокки1945

    Рокки1945 Гуру

    М
    Мега 2560 принимает на 0 порт - по-умолчанию который. Никогда не теряется только первый - остальные теряются. Всего буфер принимает 127 символов.
     
  4. Рокки1945

    Рокки1945 Гуру

    Например вместо good morning - gog
     
  5. SergeiL

    SergeiL Оракул Модератор

    Значит в Adafruit_NeoMatrix запрещаются прерывания в момент вывода, не хорошо это.
     
    Рокки1945 нравится это.
  6. Рокки1945

    Рокки1945 Гуру

    как победить?
     
  7. Рокки1945

    Рокки1945 Гуру

    cli(); - нету
     
  8. SergeiL

    SergeiL Оракул Модератор

    Там нет, а в Adafruit_NeoPixel есть.
     
    Рокки1945 нравится это.
  9. Рокки1945

    Рокки1945 Гуру

    Сергей не нашёл - где?
    через поиск искал нету
     
  10. SergeiL

    SergeiL Оракул Модератор

    Ищите noInterrupts()
     
    Рокки1945 нравится это.
  11. Рокки1945

    Рокки1945 Гуру

    закомментировал вот это
    Код (C++):
     /* // NRF52 may use PWM + DMA (if available), may not need to disable interrupt
    #if !( defined(NRF52) || defined(NRF52_SERIES) )
      noInterrupts(); // Need 100% focus on instruction timing
    #endif*/
    Работает, но на матрице мелькают разными цветами некоторые светодиоды.
    Как будто дождь на матрице, но и посланные мною строки тоже идут.
     
  12. SergeiL

    SergeiL Оракул Модератор

    Так а прием стал нормальный?
     
    Рокки1945 нравится это.
  13. Рокки1945

    Рокки1945 Гуру

    приём да!, но задержку пришлось оставить, дождь из светодиодных вспышек как убрать?
    Символы не теряются, - но как вспышки убрать, вот дилема.
     
  14. SergeiL

    SergeiL Оракул Модератор

    Варианты есть, но что и как Вам посоветовать - не знаю :(.
    Детали Вашего проекта мне не известны.
    Нужно смотреть, сколько по времени осуществляется вывод у вас.
     
    Рокки1945 нравится это.
  15. Рокки1945

    Рокки1945 Гуру

    Сергей а почему пиксели появляются? По времени вывод 1 пикселя минимум 1 мс, длина матрицы 60 пикселей. Тоже заметил что чем ниже скорость строки тем меньше и реже ошибки и потери символов
     
  16. SergeiL

    SergeiL Оракул Модератор

    Потому, что нужно соблюдать правильные тайминги при выводе.
    Запрет прерываний запрещает работу функций обработки прерываний прерывающих вывод.
    Вывод требует соблюдения таймингов.
    По хорошему нужно смотреть, что можно прерывать, и как и когда это лучше и правильно сделать.
    У Вас библиотеки. А тут я даже и не знаю, что посоветовать. DMA у Меги нет...
     
    Рокки1945 нравится это.
  17. SergeiL

    SergeiL Оракул Модератор

    Не пробовал, но может попробовать библиотеку FastLED?
    Может кто то уже сталкивался с этой проблемой?
    Посоветуйте правильную библиотеку.
     
  18. b707

    b707 Гуру

    простое решение "в лоб" - останавливать бегущую строку на время приема текста. Все равно же, я так понимаю, после приема из Сериал текст бегущей строки поменяется? - значит пользователь даже не заметит задержку
     
    Рокки1945 нравится это.
  19. Рокки1945

    Рокки1945 Гуру

    В библиотеке нет функции остановки, где мануальчик на библию поискать - гугл молчит
     
  20. Yuriy.pv

    Yuriy.pv Нерд

    Увеличте на сколько это возможно скорость передачи. Можно сделать строку мастером, и самой забирать данные в нужное время . Еще вариант двойной буферизацией, как RDS ловить.