Відповісти

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

Назад

Огляд теми (нові повідомленні вгорі)

renoshnik
2019-12-01 21:09:53
Nemoj пише:

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

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

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

Miller_VA
2019-12-01 21:05:52

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

Miller_VA
2019-12-01 20:55:17
Nemoj пише:

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

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

Nemoj
2019-12-01 20:40:48

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

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

renoshnik
2019-12-01 19:53:18
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

Nemoj
2019-12-01 19:39:03
Miller_VA пише:

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

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

renoshnik
2019-12-01 19:37:15
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
старые данные
данные
старые данные
данные
старые данные
данные
старые данные
данные
старые данные

Задача в том чтобы избавиться от данных которые приходят в период "старые данные"...

Watchdog
2019-12-01 12:30:48
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, для этих целей. Правду говорят: "Благими намерениями дрога в ад вымощена". Успехов.

Miller_VA
2019-12-01 12:24:46

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

Watchdog
2019-12-01 10:30:26
Watchdog пише:

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

{
     Serial.begin(9600);

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

// ...
}

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

Watchdog
2019-12-01 10:23:05

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

{
     Serial.begin(9600);

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

// ...
}
Nemoj
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

renoshnik
2019-11-30 21:20:39
Nemoj пише:

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

Ошибка в начале темы ...

Miller_VA
2019-11-30 20:47:38
Nemoj пише:

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

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

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

Nemoj
2019-11-30 20:21:31

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

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