#26 2019-12-01 10:23:05

Watchdog
Гість

Re: Мусор в буфере

О чем вы спорите?

{
     Serial.begin(9600);

// input buffer cleaning
     while (Serial.available()) Serial.read();

// ...
}

#27 2019-12-01 10:30:26

Watchdog
Гість

Re: Мусор в буфере

Watchdog пише:

О чем вы спорите?

{
     Serial.begin(9600);

// input buffer cleaning
     while (Serial.available()) Serial.read();

// ...
}

Поясню. Это очистка до паузы ввода, если вы используете терминал Ардуино. Для автоматческой синхронизации нужен какой либо протокол.

#28 2019-12-01 12:24:46

Miller_VA
Учасник
Зареєстрований: 2019-11-30
Повідомлень: 8

Re: Мусор в буфере

Никто тут не спорит. Разговаривают люди. И оправданий не нужно. Да хоть час назад в руки взял.
Я про другое. Все, что Вы написали, я изложу так:
-  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 подсчитывает сколько новых байт принято, помещая их в начало своего буфера, а  потом их так и выдает. Можно и весь буфер прочитать. Тогда сразу видно сколько там всего-разного.

Неактивний

#29 2019-12-01 12:30:48

Watchdog
Гість

Re: Мусор в буфере

Miller_VA пише:

Никто тут не спорит. Разговаривают люди. И оправданий не нужно. Да хоть час назад в руки взял.
Я про другое. Все, что Вы написали, я изложу так:
-  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, для этих целей. Правду говорят: "Благими намерениями дрога в ад вымощена". Успехов.

#30 2019-12-01 19:37:15

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Мусор в буфере

Miller_VA пише:

Никто тут не спорит. Разговаривают люди. И оправданий не нужно. Да хоть час назад в руки взял.
Я про другое. Все, что Вы написали, я изложу так:
-  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)

Неактивний

#31 2019-12-01 19:39:03

Nemoj
Учасник
Зареєстрований: 2019-11-30
Повідомлень: 11

Re: Мусор в буфере

Miller_VA пише:

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

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

Остання редакція Nemoj (2019-12-01 19:43:02)

Неактивний

#32 2019-12-01 19:53:18

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Мусор в буфере

Nemoj пише:
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

Неактивний

#33 2019-12-01 20:40:48

Nemoj
Учасник
Зареєстрований: 2019-11-30
Повідомлень: 11

Re: Мусор в буфере

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

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

Остання редакція Nemoj (2019-12-01 20:43:48)

Неактивний

#34 2019-12-01 20:55:17

Miller_VA
Учасник
Зареєстрований: 2019-11-30
Повідомлень: 8

Re: Мусор в буфере

Nemoj пише:

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

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

Неактивний

#35 2019-12-01 21:05:52

Miller_VA
Учасник
Зареєстрований: 2019-11-30
Повідомлень: 8

Re: Мусор в буфере

Отвлекся на футбол smile
Так на форуме по другому и не получается. Стоит поздороваться, чего-нибудь спросить, и начинается...
Я то свое спасибо заработал. Понятное дело у каждого свои задачи и свои трудности. Вот Nemoj занялся делом smile, ну не знает еще даже мелочей, и что? Закопать, похоронить начинающего программиста. Я ему завидую. Он еще всему научиться. Мне уже не лезет.
Nemoj пиши, если что, не ты первый, ну и не последний. Поможем.

Неактивний

#36 2019-12-01 21:09:53

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 1,025

Re: Мусор в буфере

Nemoj пише:

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

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

Ок. Продолжай копать в том же направлении ...

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

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