Ви не увійшли.
Насилие порождает насилие, задав хамский тон общения, который был абсолютно не уместен, на что Вы рассчитывали? Решения , которое предложил 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: и давайте закончим дискуссию по нетехническим темам, про оскорбления все уже было сказано и к теме это не имеет отношения. Дальнейшее общение только по теме особенностей работы платформы и языка программирования.
Насилие порождает насилие, задав хамский тон общения, который был абсолютно не уместен, на что Вы рассчитывали? Решения , которое предложил Miller_VA в рамках моей задачи вполне достаточно.
Про дробные числа, можно подробнее? Вот то, в каком виде это сейчас, работает, как требуется (в примере был int, и там, действительно, было бы проблематично получить дробное число ).
Здесь вот хорошая информация для понимания вскрывается
https://forum.arduino.cc/index.php?topic=468340.0
PS: и давайте закончим дискуссию по нетехническим темам, про оскорбления все уже было сказано и к теме это не имеет отношения. Дальнейшее общение только по теме особенностей работы платформы и языка программирования.
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
...Может символов начала строки, перевод каретки у нас в буфере нет, но println их выдаст в порт. А Вы в мониторе порта, внизу-справа, рядом с установкой скорости (слева от 9600) выберите "Нет конца строки". Тогда "0" и исчезнет....
Два дня, пару страниц переписок, тонны ненужной прочитанной информации и такое элегантное решение=) Про буфер, если честно, не интуитивно понятно, зачем бы их хранить, если они уже приняты, обработаны и переданы дальше.
Спасибо Вам за помощь.
Никто тут не спорит. Разговаривают люди. И оправданий не нужно. Да хоть час назад в руки взял.
Я про другое. Все, что Вы написали, я изложу так:
- 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
старые данные
данные
старые данные
данные
старые данные
данные
старые данные
данные
старые данные
Задача в том чтобы избавиться от данных которые приходят в период "старые данные"...
Никто тут не спорит. Разговаривают люди. И оправданий не нужно. Да хоть час назад в руки взял.
Я про другое. Все, что Вы написали, я изложу так:
- 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 подсчитывает сколько новых байт принято, помещая их в начало своего буфера, а потом их так и выдает. Можно и весь буфер прочитать. Тогда сразу видно сколько там всего-разного.
О чем вы спорите?
{ Serial.begin(9600); // input buffer cleaning while (Serial.available()) Serial.read(); // ... }
Поясню. Это очистка до паузы ввода, если вы используете терминал Ардуино. Для автоматческой синхронизации нужен какой либо протокол.
О чем вы спорите?
{
Serial.begin(9600);
// input buffer cleaning
while (Serial.available()) Serial.read();
// ...
}
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 часов изучаю язык, многое еще чего не до конца осознаю
Шел 3 год бесполезного флуда.
Можно уже озвучить, где все-таки ошибка или дополнение.
Ошибка в начале темы ...
Шел 3 год бесполезного флуда.
Можно уже озвучить, где все-таки ошибка или дополнение.
Начало не читал, просто немного переписал Ваш Loop():
void loop() {
Serial.println( "Введите данные");
while( !Serial.available() );
in_buf = Serial.parseInt();
Serial.println(in_buf);
}
Убрал лишнее, чтоб не рябило в глазах. Будем копать?
Шел 3 год бесполезного флуда.
Можно уже озвучить, где все-таки ошибка или дополнение.