Обрезается вывод текста на дисплей ILI9341 при приеме по Serial
- Войдите на сайт для отправки комментариев
Сб, 15/01/2022 - 15:30
//Для ARDUINO PRO or PRO mini //Vcc=5,0 V //Gnd=0.0 V #define CS 10 #define RST -1 // Или на RES или на 3.3v #define DC 9 //По умолчанию #define MOSI 11 // По умолчанию #define SCLK 13 // по умолчанию //Led=5.0 V #define MISO -1 // Не используется #define BLACK 0x0000 #include <SPI.h> #include "PDQ_GFX.h" #include "PDQ_ILI9341_config.h" #include "PDQ_ILI9341.h" PDQ_ILI9341 tft; #include "FontsRus/TimesNRCyr16.h" String str = ""; long timer; void setup() { Serial.begin(9600); Serial.setTimeout(128); tft.begin(); tft.setRotation(-1); tft.fillScreen(BLACK); tft.setTextSize(1); tft.setFont(&TimesNRCyr16pt8b); pinMode (2, INPUT); }; void loop(){ if(digitalRead(2)==0){ str =Serial.readStringUntil('\n'); if(str !=0){ tft.fillScreen(BLACK); tft.setCursor(9, 26); tft.print(str); str = ""; } } //Если вставить код, который ниже, тогда при приеме через аппаратный Serial русского текста этот текст выводиться только частично . while (millis() <= (timer + 1000)) { }; timer = millis(); };
,на экран выводиться весь текст ,
А зачем тебе пустой цикл?
Сам по себе пустой цикл в этом примере ни на что не влияет, он как пример. На самом деле, в этом скетче, вместо этого цикла работают часы на i2c (DS3231) , а этот цикл просто его заменяет. Но даже с этим пустым циклом ,на дисплей не выводится весь текст(русский).
Ты понимаешь, что код с пустым циклом полностью блокирует дальнейшую работу программы? Выкладывай весь код как есть, а не пустые циклы. Сейчас будем одно решать, а по факту другое нужно будет. Это лишняя работа.
Или код сверхсекретный?)
Как добиться полного отображения текста?
Или убрать этот цикл нахрен, или добавить в него обработку приведших символов. Можно ещё увеличить буфер, но это говнокостыль. Он там достаточный и при правильном обращении его увеличивать не нужно.
Проблема в том, что пока Ваш цикл ничего не делает, символы приходят, буфер переполняется и символы теряются.
Да код то не секретный
Вот именно что при if(digitalRead(2)==0){
.... в это время и принимаю текст
}
все равно текст выводится не полностью.
Специально слежу, в мониторе порта он читается полностью.
так все равно в коде пустой цикл в строке 140, который точно так же нарушает прием символов в сериал. Уберите его - без него будет работать?
и строчка 86 чтения из порта тоже блокирующая... Две блокирующие операции в одном цикле? -они не могут работать вместе.
Как добиться полного отображения текста?
Или убрать этот цикл нахрен, или добавить в него обработку приведших символов. Можно ещё увеличить буфер, но это говнокостыль. Он там достаточный и при правильном обращении его увеличивать не нужно.
Проблема в том, что пока Ваш цикл ничего не делает, символы приходят, буфер переполняется и символы теряются.
Добавил стороку if(digitalRead(2)==0 && Serial.available()>0){
лучше не стало.
Добавил стороку if(digitalRead(2)==0 && Serial.available()>0){
хм.... вы правда идиот или прикидываетесь? Вам куда сказали добавить обработку символов? - внутрь цикла while! - а вы куда добавили?
так все равно в коде пустой цикл в строке 140, который точно так же нарушает прием символов в сериал. Уберите его - без него будет работать?
и строчка 86 чтения из порта тоже блокирующая... Две блокирующие операции в одном цикле? -они не могут работать вместе.
Так как раз 86 строка и выводит текст , который мне и нужен.
Строку 140 закомментировал - теперь секунды мечутся, а выводимый текст теряется .
Так как раз 86 строка и выводит текст , который мне и нужен.
readStringUntil - не единственный оператор, который может читать из Сериал. И как раз в вашем случае этот оператор не подходит, потому что он блокирующий. Вам надо заменить readStringUntil на обычный read(), читать из порта посимвольно и самому проверять пришедший символ на равенство символу /n.
Строчка - это первое. А вторая ваша ошибка - тот самый цикл while. Зачем он нужен, чтобы данные на дисплей выводились точно раз в секунду, я угадал? - но делаете вы это неправильно, так миллис только чайники используют. Ваш цикл вставляет блокирующую задержку до конца след. секунды, не давая программе принимать символы. Вместо блокирования программы на время до конца секунды надо просто обновлять дисплей раз в секунду, а все остальное время прием из Сериал должен работать.
Добавил обработку в while
Текст не теряется. Оригинально.Спасибо.
Текст не теряется. Оригинально.Спасибо.
все равно может теряться. От readStringUntil избавляйтесь
Текст не теряется. Оригинально.Спасибо.
все равно может теряться. От readStringUntil избавляйтесь
Попробую уже на реальном проекте адаптировать эту возможность(принимать текст).
Надо .что бы и часы ходили , и чтоб в любой момент была возможность принять текст.
Спасибо за подсказки.
Попробую уже на реальном проекте адаптировать эту возможность(принимать текст).
Надо .что бы и часы ходили , и чтоб в любой момент была возможность принять текст.
Спасибо за подсказки.
когда вы ставите прием символов внутрь while, как в последнем коде - у вас длина цикла зависит от времени приема символов и может быть не точно 1 сек, а больше. Наверно для часов это не очень хорошо, но решать вам.
Не, тут все нормально . Времени на передачу текста хватает , сбоев не наблюдается. Испытывал много раз, пока что без сбоев. Текст приходит полностью.
Странно, что никто не предложил увеличить буфер Serial'a.
Хотя нет, предлагали.
Впрочем ТСа устраивает и его костыль , пусть радуется(до поры до времени)
наверно и 45 строку надо тоже исправить...
наверно и 45 строку надо тоже исправить...
Исправить бы не сложно, другое дело, хотябы правильно _как нужно? Просто много об этом подсказывают, но не говорят, все же как правильно. Встречаются многие примеры и это путает_все же правильнее как?
Правильнее вычитать, это «обход» переполнения millis().
Исправить бы не сложно, другое дело, хотябы правильно _как нужно?
http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis
Прислушавшись к рекомендациям, увеличил размер буфера Serial и теперь от millis() вычитается переменная timer=
Исправить бы не сложно, другое дело, хотябы правильно _как нужно?
http://arduino.ru/forum/programmirovanie/velikoe-perepolnenie-millis
По этой ссылке - конкретный уже ответ, изучаю...