Ви не увійшли.
Здравствуйте! Начинаю изучать среду. Пробую пообщаться с монитором порта
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
Введите данные
в буфере
При этом, если ввести с клавиатуры что-нибудь это тоже вычитается корректно. Откуда в буфере появляются данные до ввода?
Подскажите как с этим бороться? Возможности чистить буфер, я так понимаю без костылей нет.
Остання редакція Nemoj (2019-11-30 13:25:11)
Неактивний
идете сюда https://doc.arduino.ua/ru/prog/
переходите сюда https://doc.arduino.ua/ru/prog/Serial
затем сюда https://doc.arduino.ua/ru/prog/Serial/Available
и сюда https://doc.arduino.ua/ru/prog/Serial/Read
желательно не просто переходить по ссылкам а читать на каждой странице информацию...
по последней ссылке есть пример с комментариями !!!!
внимательно читаем комментарии !!!
*** подсказка
// считываем принятый байт:
incomingByte = Serial.read();
Неактивний
вот набросал примерчик для наглядности ...
int incomingByte = 0;
void setup() { Serial.begin(57600); }
void loop() {
Serial.println(" pause ");
delay (5000);
Serial.println("run read ");
Serial.print("in port ");
Serial.print(Serial.available());
Serial.println(" butes ");
if (Serial.available() > 0) {
// считываем входящий байт:
incomingByte = Serial.read();
// показываем, что именно мы получили:
Serial.print("I received: ");
Serial.write(incomingByte); Serial.println(" ");
}
}
Неактивний
Если Вы хотели показаться умным, то это не получилось.
Теперь внимательно читаем, то, что написано у меня в коде.
Я использую Serial.parseInt, а не Serial.read, которая возвращает найденное целое число, в отличии от Serial.read, которая вернет -1, если данных нет, но если буфер пустой (if (Serial.available()>0)) , то входа в if не произойдет, не так ли!?
И да, описание всего, что я там использую, я читал.
Остання редакція Nemoj (2019-11-30 13:28:47)
Неактивний
Nemoj, а если есть ситуация что буфер и не пустой и не полный. Ну не накапало все.Надо время что бы все налилось. Сначала выпили первую половину, а потом вторую. А целиком не получилось. И теперь жалуетесь что вам по полной не налили.
Остання редакція qwone (2019-11-30 14:08:25)
Неактивний
Обычно, обнуление буфферов В/В производится ОС при открытии буфферизированных потоков, извешая об этом по RS232 сигналами квитирования соединения. В Ардуино нет квитрования соединений и автоматической очистки буферов, поэтому вам придется "глотать пыль", а "респиратор" изготовить самому. Т.е. работать с бесконечным потоком.
Если Вы хотели показаться умным, то это не получилось.
Теперь внимательно читаем, то, что написано у меня в коде.
Я использую Serial.parseInt, а не Serial.read, которая возвращает найденное целое число, в отличии от Serial.read, которая вернет -1, если данных нет, но если буфер пустой (if (Serial.available()>0)) , то входа в if не произойдет, не так ли!?
И да, описание всего, что я там использую, я читал.
Пускай как вы выразились, что я дебил...
тогда встречный вопрос от дебила - " но если буфер пустой " - вы уверены, что после того как пройдет поиск очередного целого числа во входном потоке, он действительно будет пустой ?
Неактивний
И снова я со своими дебильными комментами...
Вот запустил ваш код и ввел в мониторе значение 12,345 получаю такое
ниже число
7
вывод на экран информации из
тесктовой переменной
вывод на экран числа из перемнной с плавающей точкой и фиксированным числом знаков после запятой
например выведем число 2.71726546464646464 с 1 знаком
2.7
теперь с пятью
2.71727
Введите данные
0
Введите данные
12
Введите данные
345
Введите данные
0
Введите данные
0
Введите данные
Своим скудным умишком понимаю, что порт НЕ очищается.... Дописываю в код две строчки, такое себе дебильное решение...
снова задаю число 12,345 и получаю в мониторе
ниже число
7
вывод на экран информации из
тесктовой переменной
вывод на экран числа из перемнной с плавающей точкой и фиксированным числом знаков после запятой
например выведем число 2.71726546464646464 с 1 знаком
2.7
теперь с пятью
2.71727
Введите данные
0
Введите данные
12
Введите данные
0
Введите данные
Извините, больше тут умничать не буду .... это у меня не получается....
Остання редакція renoshnik (2019-11-30 15:23:35)
Неактивний
Nemoj пише:Если Вы хотели показаться умным, то это не получилось.
Теперь внимательно читаем, то, что написано у меня в коде.
Я использую Serial.parseInt, а не Serial.read, которая возвращает найденное целое число, в отличии от Serial.read, которая вернет -1, если данных нет, но если буфер пустой (if (Serial.available()>0)) , то входа в if не произойдет, не так ли!?
И да, описание всего, что я там использую, я читал.Пускай как вы выразились, что я дебил...
тогда встречный вопрос от дебила - " но если буфер пустой " - вы уверены, что после того как пройдет поиск очередного целого числа во входном потоке, он действительно будет пустой ?
С Вашим диагнозом жить можно, да и осознание проблемы - это шаг к её решению. Если бы ЧСВ и пена у рта не мешала, возможно бы у Вас и получилось заметить, что вопрос с этого и начинался, а именно: "как избавить буфер от мусора?".
Почему он должен оказаться не пуст после процедуры поиска числа, которая, повторюсь, должна быть инициирована только лишь после того, как количество байт, доступных для считывания будет больше 0? Что за логика?
Если это особенность работы, то проще было об этом так и написать, чем строчить портянку, которая не несет никакой полезной нагрузки, за исключением быть может слов "...порт НЕ очищается".
Если вы еще не поняли, то мне надо что бы после ввода числа 12 я получил эхом число
12, а
не
12
0
Чего, собственно, Вы вводом своих 2 копеек 2 строчек не добились.
Вот нашел пример видео, где у человека такой же структурно код дает нормальный результат, пробовал в том числе и его код, но результат тот же.
https://youtu.be/gmgw6nLgzbY
Остання редакція Nemoj (2019-11-30 17:41:44)
Неактивний
Обычно, обнуление буфферов В/В производится ОС при открытии буфферизированных потоков, извешая об этом по RS232 сигналами квитирования соединения. В Ардуино нет квитрования соединений и автоматической очистки буферов, поэтому вам придется "глотать пыль", а "респиратор" изготовить самому. Т.е. работать с бесконечным потоком.
Очень интересно, что нет автоочистки. Буду знать, благодарю=)
Неактивний
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
Я реально тупой...
Ты не хочешь в мониторе видеть 0 (НОЛЬ) когда ничего не вводишь ???
Неактивний
Нет не хочу. Мне надо что бы возвращалось число только в том случае, когда были получены данные с порта ввода вывода (для этого и введена строчка ).
if (Serial.available()>0); // отправляем данные ТОЛЬКО ПОСЛЕ их получения:
Если я не правильно понимаю логику этого условия, можешь спокойно описать, как на твой взгляд оно должно отработать.
Если не получено должно просто висеть сообщение с просьбой о вводе.
Логика должна быть такой:
"Введите число"
// ожидается ввод числа и нихера не происходит
// с клавиатуры введено число 7 и отправлено, программа возвращает
"Введено 7"
// дальше т.к это loop все повторяется появляется опять строка
"Введите число"
Просто посмотри структурно такой же код работает здесь. Специально нашел.
https://youtu.be/gmgw6nLgzbY
Остання редакція Nemoj (2019-11-30 18:01:39)
Неактивний
у меня, то есть у дебила получается как-то так....
ниже число
7
вывод на экран информации из
тесктовой переменной
вывод на экран числа из перемнной с плавающей точкой и фиксированным числом знаков после запятой
например выведем число 2.71726546464646464 с 1 знаком
2.7
теперь с пятью
2.71727
Введите данные
Введите данные
Введите данные
Введите данные
Введите данные
123
Введите данные
456
Введите данные
Введите данные
Введите данные
Введите данные
Введите данные
Введите данные
Введите данные
987
Введите данные
Введите данные
Введите данные
абсолютно БЕЗ танцев с бубном .... может дебильные мозги ка-то пряморукостью компенсировались...
только выше я пытался объяснить немножко другое .... из области очистки буфера (просто в силу своего дебилизма не мог подумать, что проблема в такой ерунде)...
писал про очистку буфера...
вот в приведенном примере я первый раз ввел число 123,456 и оно считалось двумя частями ... и целая и десятичная часть...
следующее число было целое 987 тут проблем с чтением не возникло...
вот как раз для 123,456 и нужно было чистить буфер, о чем я умничал ранее...
Неактивний
у меня, то есть у дебила получается как-то так....
ниже число
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
Неактивний
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
Наверное этот код только у дебилов работает правильно ...
Неактивний
Просто дебил убрал точку с запятой в строке
if (Serial.available()>0); {
И если вас не оскорбит еще одна ремарка от дебила, то скажу, что Serial.flush(); буфер НЕ очищает ...
Ну во же, прогресс, спасибо за исправление. Оно действительно, отчасти исправляет ситуацию
Конструктивная критика, даже если она, как Вы предпочитаете себя называть от "дебила", мною воспринимается нормально, но конструктивная . И прогресс на лицо теперь это похоже на правду, кроме одного но
Введите данные
Введите данные
// ввожу с клавиатуры число 5, происходит опрос и выводится
5 // что и ожидалось
Введите данные
0 // но следующей итерацией почему все таки здесь появляется 0, если с клавиатуры ничего не вводится. ведь, если не было ввода в if не должны мы были попасть, а следовательно и не должно было быть исполнено Serial.println(in_buf);.
Введите данные
Введите данные
Введите данные
// ввожу с клавиатуры число 6 , происходит опрос и выводится
6
Введите данные
0
Введите данные
Введите данные
Введите данные
О Serial.flush() учту.
Остання редакція Nemoj (2019-11-30 19:44:35)
Неактивний
renoshnik пише:Просто дебил убрал точку с запятой в строке
if (Serial.available()>0); {
И если вас не оскорбит еще одна ремарка от дебила, то скажу, что Serial.flush(); буфер НЕ очищает ...
Ну во же, прогресс, спасибо за исправление. Оно действительно, отчасти исправляет ситуацию
Конструктивная критика, даже если она, как Вы предпочитаете себя называть от "дебила", мною воспринимается нормально, но конструктивная . И прогресс на лицо теперь это похоже на правду, кроме одного ноВведите данные Введите данные // ввожу с клавиатуры число 5, происходит опрос и выводится 5 // что и ожидалось Введите данные 0 // но следующей итерацией почему все таки здесь появляется 0, если с клавиатуры ничего не вводится. ведь, если не было ввода в if не должны мы были попасть. Введите данные Введите данные Введите данные // ввожу с клавиатуры число 6 , происходит опрос и выводится 6 Введите данные 0 Введите данные Введите данные Введите данные
О Serial.flush() учту.
Я не предпочитаю, это вы так отозвались обо мне после моего первого коммента, да в принципе и после второго тоже ....
Неактивний
ниже число
7
вывод на экран информации из
тесктовой переменной
вывод на экран числа из перемнной с плавающей точкой и фиксированным числом знаков после запятой
например выведем число 2.71726546464646464 с 1 знаком
2.7
теперь с пятью
2.71727
Введите данные
Введите данные
6
Введите данные
Введите данные
Введите данные
Введите данные
6
Введите данные
0
Введите данные
Введите данные
Вот первый раз "6" я ввел по своему, по дебильному...
Второй раз я ввел "6" по вашему ...
Остання редакція renoshnik (2019-11-30 19:58:54)
Неактивний
Теперь добавил пару строк в код и снова повторил ввод и по дебильному и по умному ...
ниже число
7
вывод на экран информации из
тесктовой переменной
вывод на экран числа из перемнной с плавающей точкой и фиксированным числом знаков после запятой
например выведем число 2.71726546464646464 с 1 знаком
2.7
теперь с пятью
2.71727
Введите данные
Введите данные
Введите данные
Введите данные
6
Введите данные
Введите данные
Введите данные
6
Введите данные
Введите данные
Введите данные
Введите данные
Введите данные
Неактивний
Шел 3 год бесполезного флуда.
Можно уже озвучить, где все-таки ошибка или дополнение.
Начало не читал, просто немного переписал Ваш Loop():
void loop() {
Serial.println( "Введите данные");
while( !Serial.available() );
in_buf = Serial.parseInt();
Serial.println(in_buf);
}
Убрал лишнее, чтоб не рябило в глазах. Будем копать?
Неактивний
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 и выводя запрос на ввод данных - так это я себе представлял, но происходит следующее (см изображение).
Т.е во второй итерации буфер в все еще не пуст, хотя ввода не было и входной буфер должен быть пуст.
Есть предположение, что это происходит вследствие того, что parseInt() не найдя ничего в буфере вернет 0, но тогда мне не понятно, как произойдет выз
Возможно мои суждения ложны 12 часов изучаю язык, многое еще чего не до конца осознаю
Остання редакція Nemoj (2019-12-01 09:38:55)
Неактивний