#1 Re: Програмування Arduino » Мусор в буфере » 2019-12-01 20:40:48

Насилие  порождает насилие, задав хамский тон общения, который был абсолютно не уместен, на что Вы рассчитывали? Решения , которое предложил Miller_VA в рамках моей задачи вполне достаточно.
Про дробные числа, можно подробнее? Вот то, в каком виде это сейчас, работает, как требуется (в примере был int, и там, действительно, было бы проблематично получить дробное число ).
273260511ea0t.jpg

Здесь вот хорошая информация для понимания вскрывается
https://forum.arduino.cc/index.php?topic=468340.0
PS: и давайте закончим дискуссию по нетехническим темам, про оскорбления все уже было сказано и к теме это не имеет отношения. Дальнейшее общение только по теме особенностей работы платформы и языка программирования.

#2 Re: Програмування Arduino » Мусор в буфере » 2019-12-01 19:39:03

Miller_VA пише:

...Может символов начала строки, перевод каретки у нас в буфере нет, но println их выдаст в порт. А Вы в  мониторе порта, внизу-справа, рядом с установкой скорости (слева от 9600) выберите "Нет конца строки". Тогда "0" и исчезнет....

Два дня, пару страниц переписок, тонны ненужной прочитанной информации и такое элегантное решение=) Про буфер, если честно, не интуитивно понятно, зачем бы их хранить, если они уже приняты, обработаны и переданы дальше.
Спасибо Вам за помощь.

#3 Re: Програмування Arduino » Мусор в буфере » 2019-12-01 09:35:59

Miller_VA пише:
Nemoj пише:

Шел 3 год бесполезного флуда.
Можно уже озвучить, где все-таки ошибка или дополнение.

Начало не читал, просто немного переписал Ваш Loop():

void loop() {
 
  Serial.println( "Введите данные");
    while( !Serial.available() );
    in_buf = Serial.parseInt();
    Serial.println(in_buf);
}
Убрал лишнее, чтоб не рябило в глазах. Будем копать?

Здравствуйте! Да, действительно, так лаконичнее. Давайте попробуем.
Если я правильно понимаю написанное, то в loop происходит следующее:
первая итерация
- попадая в loop, выводим запрос на ввод данных
- далее входим в цикл и, в котором программа проверяет, поступили-ли данные со входного порта, если Serial.available примет значение не 0, т.е входные данные есть, то произойдет выполнение цикла
- в in_buf попадет целое число, которое во входном потоке найдет parseInt()
- произойдет вывод на экран значение переменной in_buf
// Класс HardwareSerial копирует каждый полученный символ из регистра UART в массив байт входного буфера. Serial.available возвращает количество байт в массиве, parseInt() удаляет один байт из этого массива и уменьшает количество.
Допустим, я ввел число 2, оно попало во входной буфер, теперь он стает не нулевой, Serial.available принимает значение 1, дальше parseInt() этот байт из массива вычитывает и удаляет, массив должен вновь стать нулевым, Serial.available принять значение 0 и происходит выход из цикла, соответственно опять попадая в начало  loop и выводя запрос на ввод данных  - так это я себе представлял, но происходит следующее (см изображение).
403406989690t.jpg
Т.е во второй итерации буфер в все еще не пуст, хотя ввода не было и входной буфер должен быть пуст.
Есть предположение, что это происходит вследствие того, что parseInt() не найдя ничего в буфере вернет 0, но тогда мне не понятно, как произойдет выз
Возможно мои суждения ложны 12 часов изучаю язык, многое еще чего не до конца осознаю smile

#4 Re: Програмування Arduino » Мусор в буфере » 2019-11-30 20:21:31

Шел 3 год бесполезного флуда.
Можно уже озвучить, где все-таки ошибка или дополнение.

#5 Re: Програмування Arduino » Мусор в буфере » 2019-11-30 19:37:26

renoshnik пише:

Просто дебил убрал точку с запятой в строке

if (Serial.available()>0);  {

И если вас не оскорбит еще одна ремарка от дебила, то скажу, что Serial.flush(); буфер НЕ очищает ...

Ну во же, прогресс, спасибо за исправление. Оно действительно, отчасти исправляет ситуацию
Конструктивная критика, даже если она, как Вы предпочитаете себя называть от "дебила", мною воспринимается нормально, но конструктивная . И прогресс на лицо теперь это похоже на правду, кроме одного но

Введите данные
Введите данные
// ввожу с клавиатуры число 5, происходит опрос и выводится
5  // что и ожидалось
Введите данные
0 // но следующей итерацией почему все таки здесь появляется 0, если с клавиатуры ничего не вводится. ведь, если не было ввода в if не должны мы были попасть, а следовательно и не должно было быть исполнено  Serial.println(in_buf);. 
Введите данные
Введите данные
Введите данные
// ввожу с клавиатуры число 6 , происходит опрос и выводится 
6
Введите данные
0
Введите данные
Введите данные
Введите данные 

О Serial.flush() учту.

#6 Re: Програмування Arduino » Мусор в буфере » 2019-11-30 18:37:03

renoshnik пише:

у меня, то есть у дебила получается как-то так....

ниже число
7
вывод на экран информации из
тесктовой переменной
вывод на экран числа из перемнной с плавающей точкой и фиксированным числом знаков после запятой
например выведем число 2.71726546464646464 с 1 знаком
2.7
теперь с пятью
2.71727
Введите данные
Введите данные
Введите данные
Введите данные
Введите данные
123
Введите данные
456
Введите данные
Введите данные
Введите данные
Введите данные
Введите данные
Введите данные
Введите данные
987
Введите данные
Введите данные
Введите данные

абсолютно БЕЗ танцев с бубном .... может дебильные мозги ка-то пряморукостью компенсировались...


только выше я пытался объяснить немножко другое ....  из области очистки буфера (просто в силу своего дебилизма не мог подумать, что проблема в такой ерунде)...

писал про очистку буфера...
вот в приведенном примере я первый раз ввел число 123,456  и оно считалось двумя частями ...  и целая и десятичная часть...
следующее число было целое 987 тут проблем с чтением не возникло...
вот как раз для 123,456 и нужно было чистить буфер, о чем я умничал ранее...

И то, что Вы привели в своем примере - это правильная логика работы. И говорит о том, что код рабочий.
Только тот же код у меня дает

7
вывод на экран информации из
тесктовой переменной
вывод на экран числа из перемнной с плавающей точкой и фиксированным числом знаков после запятой
например выведем число 2.71726546464646464 с 1 знаком
2.7
теперь с пятью
2.71727
Введите данные
0
Введите данные
0
Введите данные
0
Введите данные
0
Введите данные
123
0
Введите данные
456
0
Введите данные
0
Введите данные
0
Введите данные
0
Введите данные
0
Введите данные
0
Введите данные
0
Введите данные
987
0
Введите данные
0

#7 Re: Програмування Arduino » Мусор в буфере » 2019-11-30 17:54:59

Нет не хочу. Мне надо что бы возвращалось число только в том случае, когда были получены данные с порта ввода вывода (для этого и введена строчка ).

if (Serial.available()>0); // отправляем данные ТОЛЬКО ПОСЛЕ их получения: 

Если я не правильно понимаю логику этого условия, можешь спокойно описать, как на твой взгляд оно должно отработать.

Если не получено должно просто висеть сообщение с просьбой о вводе.
Логика должна быть такой:
"Введите число"
// ожидается ввод числа и нихера не происходит
// с клавиатуры введено число 7 и отправлено, программа возвращает
"Введено 7"
// дальше  т.к это loop все повторяется появляется опять строка
"Введите число"

Просто посмотри структурно такой же код работает здесь. Специально нашел.
https://youtu.be/gmgw6nLgzbY

#8 Re: Програмування Arduino » Мусор в буфере » 2019-11-30 16:51:07

Watchdog пише:

Обычно, обнуление буфферов В/В производится ОС при открытии буфферизированных потоков, извешая об этом по RS232 сигналами квитирования соединения. В Ардуино нет квитрования соединений и автоматической очистки буферов, поэтому вам придется "глотать пыль", а "респиратор" изготовить самому. smile Т.е. работать с бесконечным потоком.

Очень интересно, что нет автоочистки. Буду знать, благодарю=) hmm

#9 Re: Програмування Arduino » Мусор в буфере » 2019-11-30 16:46:22

renoshnik пише:
Nemoj пише:

Если Вы хотели показаться умным, то это не получилось.
Теперь внимательно читаем, то, что написано у меня в коде.
Я использую Serial.parseInt, а не Serial.read, которая возвращает найденное целое число, в отличии от Serial.read, которая вернет -1, если данных нет, но если буфер пустой (if (Serial.available()>0)) , то входа в if не произойдет, не так ли!?
И да, описание всего, что я там использую, я читал.

Пускай как вы выразились, что я дебил...
тогда встречный вопрос от дебила - " но если буфер пустой " - вы уверены, что после того как пройдет поиск очередного целого числа во входном потоке, он действительно будет пустой ?

С Вашим диагнозом жить можно, да и осознание проблемы - это шаг к её решению. Если бы ЧСВ и пена у рта не мешала, возможно бы у Вас и получилось заметить, что вопрос с этого и начинался, а именно: "как избавить буфер от мусора?".
Почему он должен оказаться не пуст после процедуры поиска числа, которая, повторюсь, должна быть инициирована только лишь после того, как количество байт, доступных для считывания будет больше 0? Что за логика?
Если это особенность работы, то проще было об этом так и написать, чем строчить портянку, которая не несет никакой полезной нагрузки, за исключением быть может слов "...порт НЕ очищается".
Если вы еще не поняли, то мне надо что бы после ввода числа 12 я получил эхом число
12, а
не
12
0
Чего, собственно, Вы вводом своих 2 копеек 2 строчек не добились.
Вот нашел пример видео, где у человека такой же структурно код дает нормальный результат, пробовал в том числе и его код, но результат тот же.
https://youtu.be/gmgw6nLgzbY

#10 Re: Програмування Arduino » Мусор в буфере » 2019-11-30 13:28:28

Если Вы хотели показаться умным, то это не получилось.
Теперь внимательно читаем, то, что написано у меня в коде.
Я использую Serial.parseInt, а не Serial.read, которая возвращает найденное целое число, в отличии от Serial.read, которая вернет -1, если данных нет, но если буфер пустой (if (Serial.available()>0)) , то входа в if не произойдет, не так ли!?
И да, описание всего, что я там использую, я читал.

#11 Програмування Arduino » Мусор в буфере » 2019-11-30 11:20:00

Nemoj
відповідей: 35

Здравствуйте! Начинаю изучать среду. Пробую пообщаться с монитором порта

int in_buf=0;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);  
  Serial.println("ниже число");
  Serial.println(7);
  String text = "тесктовой переменной";
  Serial.println("вывод на экран информации из");
  Serial.println(text);
  Serial.println("вывод на экран числа из перемнной с плавающей точкой и фиксированным числом знаков после запятой");
  float digit = 2.71726546464646464;
  Serial.println( "например выведем число 2.71726546464646464 с 1 знаком");
  Serial.println( digit, 1);
  Serial.println( "теперь с пятью");
  Serial.println( digit, 5);  
}
void loop() {
  // put your main code here, to run repeatedly:
  // Serial.println( "Данные с компьютера, которые отправлены через монитор порта попадают в буфер, там их можно прочитать");
  Serial.println( "Введите данные");
    if (Serial.available()>0);  {
    in_buf = Serial.parseInt();
 // Serial.println( "в буфере");
  Serial.println(in_buf);
  //Serial.flush();
  }
}

в окне монитора порта получаю бесконечный цикц, даже если с клавиатуры ничего не введено:
ниже число
7
вывод на экран информации из
тесктовой переменной
вывод на экран числа из перемнной с плавающей точкой и фиксированным числом знаков после запятой
например выведем число 2.71726546464646464 с 1 знаком
2.7
теперь с пятью
2.71727
Введите данные
в буфере
0
Введите данные
в буфере
0
Введите данные
в буфере

При этом, если ввести с клавиатуры что-нибудь это тоже вычитается корректно. Откуда в буфере появляются данные до ввода?
Подскажите как с этим бороться? Возможности чистить буфер, я так понимаю без костылей нет.

Підвал форуму