Ви не увійшли.
О чем вы спорите?
{
Serial.begin(9600);
// input buffer cleaning
while (Serial.available()) Serial.read();
// ...
}
О чем вы спорите?
{ Serial.begin(9600); // input buffer cleaning while (Serial.available()) Serial.read(); // ... }
Поясню. Это очистка до паузы ввода, если вы используете терминал Ардуино. Для автоматческой синхронизации нужен какой либо протокол.
Никто тут не спорит. Разговаривают люди. И оправданий не нужно. Да хоть час назад в руки взял.
Я про другое. Все, что Вы написали, я изложу так:
- while( !Serial.available() ); - крутимся здесь пока "0" и пойдем дальше, когда Serial примет хотя бы один байт.
- in_buf = Serial.parseInt(); - осуществляет поиск очередного целого числа во входном потоке и найдя его помещает в in_buff;
- Serial.println(in_buf); - Далее как здесь https://doc.arduino.ua/ru/prog/Serial/Println. Может символов начала строки, перевод каретки у нас в буфере нет, но println их выдаст в порт. А Вы в мониторе порта, внизу-справа, рядом с установкой скорости (слева от 9600) выберите "Нет конца строки". Тогда "0" и исчезнет.
НО! Я про другое. Никто, никогда буферы не чистит. Все, что там было набросано, остается навсегда. Serial подсчитывает сколько новых байт принято, помещая их в начало своего буфера, а потом их так и выдает. Можно и весь буфер прочитать. Тогда сразу видно сколько там всего-разного.
Неактивний
Никто тут не спорит. Разговаривают люди. И оправданий не нужно. Да хоть час назад в руки взял.
Я про другое. Все, что Вы написали, я изложу так:
- while( !Serial.available() ); - крутимся здесь пока "0" и пойдем дальше, когда Serial примет хотя бы один байт.
- in_buf = Serial.parseInt(); - осуществляет поиск очередного целого числа во входном потоке и найдя его помещает в in_buff;
- Serial.println(in_buf); - Далее как здесь https://doc.arduino.ua/ru/prog/Serial/Println. Может символов начала строки, перевод каретки у нас в буфере нет, но println их выдаст в порт. А Вы в мониторе порта, внизу-справа, рядом с установкой скорости (слева от 9600) выберите "Нет конца строки". Тогда "0" и исчезнет.
НО! Я про другое. Никто, никогда буферы не чистит. Все, что там было набросано, остается навсегда. Serial подсчитывает сколько новых байт принято, помещая их в начало своего буфера, а потом их так и выдает. Можно и весь буфер прочитать. Тогда сразу видно сколько там всего-разного.
Спорьте с остальными. В Ардуино есть библиотека Firmata, для этих целей. Правду говорят: "Благими намерениями дрога в ад вымощена". Успехов.
Никто тут не спорит. Разговаривают люди. И оправданий не нужно. Да хоть час назад в руки взял.
Я про другое. Все, что Вы написали, я изложу так:
- while( !Serial.available() ); - крутимся здесь пока "0" и пойдем дальше, когда Serial примет хотя бы один байт.
- in_buf = Serial.parseInt(); - осуществляет поиск очередного целого числа во входном потоке и найдя его помещает в in_buff;
- Serial.println(in_buf); - Далее как здесь https://doc.arduino.ua/ru/prog/Serial/Println. Может символов начала строки, перевод каретки у нас в буфере нет, но println их выдаст в порт. А Вы в мониторе порта, внизу-справа, рядом с установкой скорости (слева от 9600) выберите "Нет конца строки". Тогда "0" и исчезнет.
НО! Я про другое. Никто, никогда буферы не чистит. Все, что там было набросано, остается навсегда. Serial подсчитывает сколько новых байт принято, помещая их в начало своего буфера, а потом их так и выдает. Можно и весь буфер прочитать. Тогда сразу видно сколько там всего-разного.
Да, не чистят но бывают ситуации когда это необходимо сделать...
Например внешнее устройство (в работу которого я не могу вмешиваться) отправляет в "сериал" информацию один раз в секунду.
Контроллеру нужны эти значения один раз в минуту. (читать значения каждую секунду, а использовать только шестидесятое - не вариант)
Вот и получается, что за это время в буфере скапливается очередь устаревших значений ....
int in_buf=0;
void setup() { Serial.begin(57600); }
void serialEvent() { in_buf = Serial.read() - '0';}
void loop() {
if (in_buf>0) {
Serial.print( "читаю данные ");
Serial.println(in_buf);
in_buf=0; }
Serial.println( "старые данные"); delay(5000);
Serial.println( "данные"); delay(2000);
}
Вот, что получается когда при появлении в терминале надписи "старые данные" я отправил в порт "1 2 3 4 5", а при появлении "данные" дважды отправил "9" ...
старые данные
данные
читаю данные 1
старые данные
данные
читаю данные 2
старые данные
данные
читаю данные 3
старые данные
данные
читаю данные 4
старые данные
данные
читаю данные 5
старые данные
данные
читаю данные 9
старые данные
данные
старые данные
данные
старые данные
данные
старые данные
данные
старые данные
Задача в том чтобы избавиться от данных которые приходят в период "старые данные"...
Остання редакція renoshnik (2019-12-01 19:45:12)
Неактивний
...Может символов начала строки, перевод каретки у нас в буфере нет, но println их выдаст в порт. А Вы в мониторе порта, внизу-справа, рядом с установкой скорости (слева от 9600) выберите "Нет конца строки". Тогда "0" и исчезнет....
Два дня, пару страниц переписок, тонны ненужной прочитанной информации и такое элегантное решение=) Про буфер, если честно, не интуитивно понятно, зачем бы их хранить, если они уже приняты, обработаны и переданы дальше.
Спасибо Вам за помощь.
Остання редакція Nemoj (2019-12-01 19:43:02)
Неактивний
Miller_VA пише:...Может символов начала строки, перевод каретки у нас в буфере нет, но println их выдаст в порт. А Вы в мониторе порта, внизу-справа, рядом с установкой скорости (слева от 9600) выберите "Нет конца строки". Тогда "0" и исчезнет....
Два дня, пару страниц переписок, тонны ненужной прочитанной информации и такое элегантное решение=) Про буфер, если честно, не интуитивно понятно, зачем бы их хранить, если они уже приняты, обработаны и переданы дальше.
Спасибо Вам за помощь.
1 - если бы не начали переписку с хамства, то про "конец строки" узнали бы раньше ...
2 - ваш код будет корректно работать только при целых значениях, для дробных нужно чистить буфер ....
3 - про интуитивное восприятие буфера - приведу цитату с аналогичного форума и темы ...
Собственно вот процедура приема символа
void HardwareSerial::_rx_complete_irq(void)
{
if (bit_is_clear(*_ucsra, UPE0)) {
// No Parity error, read byte and store it in the buffer if there is
// room
unsigned char c = *_udr;
rx_buffer_index_t i = (unsigned int)(_rx_buffer_head + 1) % SERIAL_RX_BUFFER_SIZE;
// if we should be storing the received character into the location
// just before the tail (meaning that the head would advance to the
// current location of the tail), we're about to overflow the buffer
// and so we don't write the character or advance the head.
if (i != _rx_buffer_tail) {
_rx_buffer[_rx_buffer_head] = c;
_rx_buffer_head = i;
}
} else {
// Parity error, read byte but discard it
*_udr;
};
}
Насколько хватает моего английского написано что если достигли конца буфера просто отбрасываем символ чтобы не переполнить буфер. Никакого кольцевого. Переполнили - всё. Больше приёма нет, пока не почистим. И соответственно, чтобы однозначно почистить буфер перед приёмом нужной информации достаточно
// clear any received data
_rx_buffer_head = _rx_buffer_tail;
http://arduino.ru/forum/programmirovanie/kak-ochistit-serial-vkhodyashchii-bufer
Неактивний
Насилие порождает насилие, задав хамский тон общения, который был абсолютно не уместен, на что Вы рассчитывали? Решения , которое предложил Miller_VA в рамках моей задачи вполне достаточно.
Про дробные числа, можно подробнее? Вот то, в каком виде это сейчас, работает, как требуется (в примере был int, и там, действительно, было бы проблематично получить дробное число ).
Здесь вот хорошая информация для понимания вскрывается
https://forum.arduino.cc/index.php?topic=468340.0
PS: и давайте закончим дискуссию по нетехническим темам, про оскорбления все уже было сказано и к теме это не имеет отношения. Дальнейшее общение только по теме особенностей работы платформы и языка программирования.
Остання редакція Nemoj (2019-12-01 20:43:48)
Неактивний
Насилие порождает насилие, задав хамский тон общения, который был абсолютно не уместен, на что Вы рассчитывали? Решения , которое предложил Miller_VA в рамках моей задачи вполне достаточно.
Про дробные числа, можно подробнее? Вот то, в каком виде это сейчас, работает, как требуется (в примере был int, и там, действительно, было бы проблематично получить дробное число ).
https://b.radikal.ru/b18/1912/ad/273260511ea0t.jpgЗдесь вот хорошая информация для понимания вскрывается
https://forum.arduino.cc/index.php?topic=468340.0
PS: и давайте закончим дискуссию по нетехническим темам, про оскорбления все уже было сказано и к теме это не имеет отношения. Дальнейшее общение только по теме особенностей работы платформы и языка программирования.
Неактивний
Отвлекся на футбол
Так на форуме по другому и не получается. Стоит поздороваться, чего-нибудь спросить, и начинается...
Я то свое спасибо заработал. Понятное дело у каждого свои задачи и свои трудности. Вот Nemoj занялся делом , ну не знает еще даже мелочей, и что? Закопать, похоронить начинающего программиста. Я ему завидую. Он еще всему научиться. Мне уже не лезет.
Nemoj пиши, если что, не ты первый, ну и не последний. Поможем.
Неактивний
Насилие порождает насилие, задав хамский тон общения, который был абсолютно не уместен, на что Вы рассчитывали? Решения , которое предложил Miller_VA в рамках моей задачи вполне достаточно.
Про дробные числа, можно подробнее? Вот то, в каком виде это сейчас, работает, как требуется (в примере был int, и там, действительно, было бы проблематично получить дробное число ).
https://b.radikal.ru/b18/1912/ad/273260511ea0t.jpgЗдесь вот хорошая информация для понимания вскрывается
https://forum.arduino.cc/index.php?topic=468340.0
PS: и давайте закончим дискуссию по нетехническим темам, про оскорбления все уже было сказано и к теме это не имеет отношения. Дальнейшее общение только по теме особенностей работы платформы и языка программирования.
Ок. Продолжай копать в том же направлении ...
Неактивний