Вы все-таки приняли мое сообщение в свой адрес. Извините, конечно, но я действительно ни кого не имел в виду конкретно. Надо было бы все-таки разделить то сообщение на два, ну да ладно, извините еще раз. Не люблю ссориться, поэтому буду завязывать. Тем более, что мне сложно удерживать тему по курсу интересующего вопроса - "ответы" постоянно уходят с колеи, вроде бы и касаются темы, но не то, да и понять меня вы почему-то не можете, а твердо меня убеждаете, что это я не понимаю элементарного, типа того, что входящие данные в данном случае - это поток. На основании чего вы это решили? По-моему я только об этом и долблю, что нельзя сразу все одним махом принять и обработать, пока этот поток "не иссякнет". Ладно. Ограничусь тем, что есть. У меня код хоть и не по феншую и с таким ненавистным delay, но работает именно так, как мне и требовалось. С Новым годом!
Открываем файл HardwareSerial.h
после public: на следующей строке пишем
virtual void clear(void);
Сохраняем.
Далее в коде можно будет использовать функцию Serial.clear(); которая очистит входной буфер
сделал так. ругается на это Serial.clear();
скопировал HardwareSerial.h/cpp в папку с ino
стал ругаться на это
void HardwareSerial::clear() no 'void HardwareSerial::clear()' member function declared in class 'HardwareSerial'
Открываем файл HardwareSerial.h
после public: на следующей строке пишем
virtual void clear(void);
Сохраняем.
Далее в коде можно будет использовать функцию Serial.clear(); которая очистит входной буфер
сделал так. ругается на это Serial.clear();
скопировал HardwareSerial.h/cpp в папку с ino
стал ругаться на это
void HardwareSerial::clear() no 'void HardwareSerial::clear()' member function declared in class 'HardwareSerial'
Уважаемые знаюшие, что произойдет при переполненнии буфера Serial - перестанут приниматься последние данные или наоборот, в нем сохранятся последние, а начальные будут вытесняться?
Ардуино под рукой нет (ответы "А ты проверь" не считаются).D
Уважаемые знаюшие, что произойдет при переполненнии буфера Serial - перестанут приниматься последние данные или наоборот, в нем сохранятся последние, а начальные будут вытесняться?
Ардуино под рукой нет (ответы "А ты проверь" не считаются).D
Зачем эти крайности с зачисткой? Моя не понимать....
не "зачем", а - "почему".
я, по причине лености, присущей всем сущностям, обладающим безграничными возможностями, не запрещаю людям заниматься крайностями.
люди вправе заниматься крайностями - в том числе зачистками и ковровыми бомбардировками буфера обмена юарт.
Для того, чтобы читать актуальные данные, а не устаревшие желательно очистить буфер ....
что бы читать актуальные данные надо, 1- научится читать , 2 научится определять актуальные данные 3 - наконец использовать актуальные данные. По факту что бы лечить больного надо лечить больного, а не придумывать болячки у постороннего здорового человека.
Некое устройство постоянно шлет данные в "сериал" ...
Нужно читать данные присланные только в период "данные" .... Если запустить этот скетч и в терминале вручную отправлять по одной цифре (как пример), то будут читаться все отправленные цифры и в "мусор" и в "данные" .
Задача в том, чтобы перед периодом "данные" очистить буфер .
мусор
данные
читаю данные 1
мусор
данные
читаю данные 1
мусор
данные
читаю данные 1
мусор
данные
читаю данные 2
мусор
данные
читаю данные 2
мусор
данные
мусор
данные
мусор
Вот это получается когда при появлении в терминале надписи "мусор" я три раза отправил в порт "1", а при появлении "данные" дважды отправил "2" ...
Задача в том чтобы избавиться от данных которые приходят в период "мусор"...
Задача в том чтобы избавиться от данных которые приходят в период "мусор"...
есть такое понятие хидер и тег , голова и хвост сообщения. Разумеется между ними находится сообщение.Ну а остальное мусор. #сообщение1\nмусор#сообщение2\nмусор и да периодически надо извлекать данные и потом отправлять уже по этому принципу. Это вроде стандартное решение, только почему-то прошло мимо вас.
Все время не должно в буфер чего-то идти. Обычно это после сообщения какие-то отголоски непонятные. По крайней мере на китайских ардуинах с таким постоянно сталкивался. Если идёт все время, значит надо делать помехозащищенный канал.
Задача в том чтобы избавиться от данных которые приходят в период "мусор"...
есть такое понятие хидер и тег , голова и хвост сообщения. Разумеется между ними находится сообщение.Ну а остальное мусор. #сообщение1\nмусор#сообщение2\nмусор и да периодически надо извлекать данные и потом отправлять уже по этому принципу. Это вроде стандартное решение, только почему-то прошло мимо вас.
Про голову и хвост я знаю. Но вопрос совсем в другом.
Видимо я не совсем корректно выбрал названия, правильнее вместо "мусор" было бы написать "устаревшие данные".
По стандартным решениям вопросов нет, но иногда приходят НЕ стандартные.
Например внешнее устройство (в работу которого я не могу вмешиваться) отправляет в "сериал" информацию один раз в секунду.
Контроллеру нужны эти значения один раз в минуту.
Вот и получается, что за это время в буфере скапливается очередь устаревших значений ....
Например внешнее устройство (в работу которого я не могу вмешиваться) отправляет в "сериал" информацию один раз в секунду.
Контроллеру нужны эти значения один раз в минуту.
Вот и получается, что за это время в буфере скапливается очередь устаревших значений ....
Что мешает контроллеру считывать данные раз в секунду, а использовать только последнее значение раз в минуту?
Что-то мешает...
Тут вопрос об очистке буфера, а не о изменении работы программы. Интервалы времени я привел для примера, что бы обрисовать задачу.
В ардуинках буфер кольцевой его не надо очищать. Он не переполняется. Когда заполнился, старые данные очищаются, на их место приходят новые. А вам в нужный момент времени остаётся только их забрать.
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;
Фифошнлсть это же организация на уровне регистров МК.
Фифошность - это организация данных на уровне идеи (карандаша и бумаги). Она не имеет никакого отношения ни к регистрам, ни к МК, и делается абсолютно одинаково хоть МК-61, хоть на Summit'е
Densl пишет:
Я туда лазить не пробовал ещё.
Ну, так либо полезьте, либо не делайте заявлений о том, что там что-то "всё равно очищается".
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;
Не думал что такой тут буфер приема символов. Нужно писать свой - кольцевой, а то этот неудобный.
С чего бы? Ну вот он заполнился. Что делать? Есть варианты: тереть старое или выбрасывать вновь пришедшее. И чем тут "кольцевость" мешает? Хоть так, хоть так можно делать.
Вы все-таки приняли мое сообщение в свой адрес. Извините, конечно, но я действительно ни кого не имел в виду конкретно. Надо было бы все-таки разделить то сообщение на два, ну да ладно, извините еще раз. Не люблю ссориться, поэтому буду завязывать. Тем более, что мне сложно удерживать тему по курсу интересующего вопроса - "ответы" постоянно уходят с колеи, вроде бы и касаются темы, но не то, да и понять меня вы почему-то не можете, а твердо меня убеждаете, что это я не понимаю элементарного, типа того, что входящие данные в данном случае - это поток. На основании чего вы это решили? По-моему я только об этом и долблю, что нельзя сразу все одним махом принять и обработать, пока этот поток "не иссякнет". Ладно. Ограничусь тем, что есть. У меня код хоть и не по феншую и с таким ненавистным delay, но работает именно так, как мне и требовалось. С Новым годом!
с таким ненавистным delay
Що Ви все маєте проти delay? Що за секта делэефобов?
Если хочется по-сложному, то так:
Переходим сюда:
%местокудапоставилиArduino%\Arduino\hardware\arduino\avr\cores\arduino
Открываем файл HardwareSerial.cpp
На предпоследней строке файла дописываем:
Сохраняем файл.
Открываем файл HardwareSerial.h
после public: на следующей строке пишем
Сохраняем.
Далее в коде можно будет использовать функцию Serial.clear(); которая очистит входной буфер
сделал так. ругается на это Serial.clear();
скопировал HardwareSerial.h/cpp в папку с ino
стал ругаться на это
void HardwareSerial::clear()
no 'void HardwareSerial::clear()' member function declared in class 'HardwareSerial'
Если хочется по-сложному, то так:
Переходим сюда:
%местокудапоставилиArduino%\Arduino\hardware\arduino\avr\cores\arduino
Открываем файл HardwareSerial.cpp
На предпоследней строке файла дописываем:
Сохраняем файл.
Открываем файл HardwareSerial.h
после public: на следующей строке пишем
Сохраняем.
Далее в коде можно будет использовать функцию Serial.clear(); которая очистит входной буфер
сделал так. ругается на это Serial.clear();
скопировал HardwareSerial.h/cpp в папку с ino
стал ругаться на это
void HardwareSerial::clear()
no 'void HardwareSerial::clear()' member function declared in class 'HardwareSerial'
Всем привет. Огромное спасибо. Все работает.
А теперь как очистить Serial от ... спама??
Что-бы не плодить темы напишу сюда.
Уважаемые знаюшие, что произойдет при переполненнии буфера Serial - перестанут приниматься последние данные или наоборот, в нем сохранятся последние, а начальные будут вытесняться?
Ардуино под рукой нет (ответы "А ты проверь" не считаются).D
Что-бы не плодить темы напишу сюда.
Уважаемые знаюшие, что произойдет при переполненнии буфера Serial - перестанут приниматься последние данные или наоборот, в нем сохранятся последние, а начальные будут вытесняться?
Ардуино под рукой нет (ответы "А ты проверь" не считаются).D
Смотрите: https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/HardwareSerial_private.h
Комментарии в строках 109-112 - есть ответ на ваш вопрос.
Смотрите: https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/HardwareSerial_private.h
Комментарии в строках 109-112 - есть ответ на ваш вопрос.
Правильно ли мы с гугельпереводчиком поняли - буфер будет заполнен первыми пришедшими, а остальные будут вычитаны и проигнорированы?
Смотрите: https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/HardwareSerial_private.h
Комментарии в строках 109-112 - есть ответ на ваш вопрос.
Правильно ли мы с гугельпереводчиком поняли - буфер будет заполнен первыми пришедшими, а остальные будут вычитаны и проигнорированы?
Гугель не обманет ;)
Уважаемые знаюшие, что произойдет при переполненнии буфера Serial
можно подсадить туда, в конец, exploit.
можно подсадить туда, в конец, exploit.
Калапуций, ты, что-ли? А че не под своим ником?;)
по малочисленным прозьбам трудящихся, мня назначили его заместителем
Если хочется по-сложному, то так:
Переходим сюда:
%местокудапоставилиArduino%\Arduino\hardware\arduino\avr\cores\arduino
Открываем файл HardwareSerial.cpp
На предпоследней строке файла дописываем:
Сохраняем файл.
Открываем файл HardwareSerial.h
после public: на следующей строке пишем
Сохраняем.
Далее в коде можно будет использовать функцию Serial.clear(); которая очистит входной буфер
и у меня не компилируется скетч, ругается .... :-((
Боже, кто все эти люди, которые так неистово пытаются очистить буфер UART (Serial). Зачем это им?
Почему нельзя считать с него все данные, а потом уже решить, что с ними делать? Зачем эти крайности с зачисткой? Моя не понимать....
не "зачем", а - "почему".
я, по причине лености, присущей всем сущностям, обладающим безграничными возможностями, не запрещаю людям заниматься крайностями.
люди вправе заниматься крайностями - в том числе зачистками и ковровыми бомбардировками буфера обмена юарт.
Ржу. А можно мне тоже иметь безграничные возможности и не запрещать? Хм... Попробовал и получилось! Не запретил Клапуцию удалить этот комент!
Работает!
Спасибо, Клапуций!)
Ржу. А можно мне тоже иметь безграничные возможности и не запрещать? Хм... Попробовал и получилось! Не запретил Клапуцию удалить этот комент!
Работает!
Спасибо, Клапуций!)
Не, ну я понимаю, ты не Трурль что бы имя великого писать без ошибок....
Боже, кто все эти люди, которые так неистово пытаются очистить буфер UART (Serial). Зачем это им?
Почему нельзя считать с него все данные, а потом уже решить, что с ними делать? Зачем эти крайности с зачисткой? Моя не понимать....
Как вариант - внешнее устройство постоянно шлет данные "сериал", а ардуина обращается для чтения в "сериал" периодически.
Для того, чтобы читать актуальные данные, а не устаревшие желательно очистить буфер ....
Для того, чтобы читать актуальные данные, а не устаревшие желательно очистить буфер ....
???? озадачен...
Для того, чтобы читать актуальные данные, а не устаревшие желательно очистить буфер ....
???? озадачен...
Вот несколько грубый пример...
Некое устройство постоянно шлет данные в "сериал" ...
Нужно читать данные присланные только в период "данные" .... Если запустить этот скетч и в терминале вручную отправлять по одной цифре (как пример), то будут читаться все отправленные цифры и в "мусор" и в "данные" .
Задача в том, чтобы перед периодом "данные" очистить буфер .
Вот это получается когда при появлении в терминале надписи "мусор" я три раза отправил в порт "1", а при появлении "данные" дважды отправил "2" ...
Задача в том чтобы избавиться от данных которые приходят в период "мусор"...
есть такое понятие хидер и тег , голова и хвост сообщения. Разумеется между ними находится сообщение.Ну а остальное мусор. #сообщение1\nмусор#сообщение2\nмусор и да периодически надо извлекать данные и потом отправлять уже по этому принципу. Это вроде стандартное решение, только почему-то прошло мимо вас.
А буфер от мусора очищается холостым чтением. Но это уже после того как вы прочли свое сообщение.
While(Serial.available()){ Serial.read()}
И, если в буфер постоянно что-то валит, то так всю жись и будем "отчищать Serial".
Все время не должно в буфер чего-то идти. Обычно это после сообщения какие-то отголоски непонятные. По крайней мере на китайских ардуинах с таким постоянно сталкивался. Если идёт все время, значит надо делать помехозащищенный канал.
Почему и кому не должно? Наличие канала обмена всегда подразумевает вероятность, что туда приходят данные, не спрашивая можно уже или ещё нет.
есть такое понятие хидер и тег , голова и хвост сообщения. Разумеется между ними находится сообщение.Ну а остальное мусор. #сообщение1\nмусор#сообщение2\nмусор и да периодически надо извлекать данные и потом отправлять уже по этому принципу. Это вроде стандартное решение, только почему-то прошло мимо вас.
Про голову и хвост я знаю. Но вопрос совсем в другом.
Видимо я не совсем корректно выбрал названия, правильнее вместо "мусор" было бы написать "устаревшие данные".
По стандартным решениям вопросов нет, но иногда приходят НЕ стандартные.
Например внешнее устройство (в работу которого я не могу вмешиваться) отправляет в "сериал" информацию один раз в секунду.
Контроллеру нужны эти значения один раз в минуту.
Вот и получается, что за это время в буфере скапливается очередь устаревших значений ....
Ну все может быть. Также есть вероятность принять мусор за сообщение.
Например внешнее устройство (в работу которого я не могу вмешиваться) отправляет в "сериал" информацию один раз в секунду.
Контроллеру нужны эти значения один раз в минуту.
Вот и получается, что за это время в буфере скапливается очередь устаревших значений ....
Что мешает контроллеру считывать данные раз в секунду, а использовать только последнее значение раз в минуту?
Например внешнее устройство (в работу которого я не могу вмешиваться) отправляет в "сериал" информацию один раз в секунду.
Контроллеру нужны эти значения один раз в минуту.
Вот и получается, что за это время в буфере скапливается очередь устаревших значений ....
Что-то мешает...
Тут вопрос об очистке буфера, а не о изменении работы программы. Интервалы времени я привел для примера, что бы обрисовать задачу.
то милис переполнится, то буфер вовремя не очистится и в конце концов скетч не зальется. Но думаю вера она опиум для народа.
Например внешнее устройство (в работу которого я не могу вмешиваться) отправляет в "сериал" информацию один раз в секунду.
Контроллеру нужны эти значения один раз в минуту.
Вот и получается, что за это время в буфере скапливается очередь устаревших значений ....
Что-то мешает...
Тут вопрос об очистке буфера, а не о изменении работы программы. Интервалы времени я привел для примера, что бы обрисовать задачу.
В ардуинках буфер кольцевой его не надо очищать. Он не переполняется. Когда заполнился, старые данные очищаются, на их место приходят новые. А вам в нужный момент времени остаётся только их забрать.
Точно кольцевой? Не нашёл в справочнике такой информации, только длину 64 байта.
Точно кольцевой? Не нашёл в справочнике такой информации, только длину 64 байта.
Мне кажется там FIFO должен быть. Это не кольцевой тогда? Но все равно он очищается для новых данных.
то милис переполнится, то буфер вовремя не очистится и в конце концов скетч не зальется. Но думаю вера она опиум для народа.
спасибо.
Нет. FIFO буфер может быть или не быть кольцевым. С фифошностью это не связано.
Можете привести пример скетча, где это было бы явно видно?
Собственно вот процедура приема символа
Насколько хватает моего английского написано что если достигли конца буфера просто отбрасываем символ чтобы не переполнить буфер. Никакого кольцевого. Переполнили - всё. Больше приёма нет, пока не почистим. И соответственно, чтобы однозначно почистить буфер перед приёмом нужной информации достаточно
Нет. FIFO буфер может быть или не быть кольцевым. С фифошностью это не связано.
Можете привести пример скетча, где это было бы явно видно?
Фифошнлсть это же организация на уровне регистров МК. Я туда лазить не пробовал ещё.
Фифошность - это организация данных на уровне идеи (карандаша и бумаги). Она не имеет никакого отношения ни к регистрам, ни к МК, и делается абсолютно одинаково хоть МК-61, хоть на Summit'е
Ну, так либо полезьте, либо не делайте заявлений о том, что там что-то "всё равно очищается".
Собственно вот процедура приема символа
Насколько хватает моего английского написано что если достигли конца буфера просто отбрасываем символ чтобы не переполнить буфер. Никакого кольцевого. Переполнили - всё. Больше приёма нет, пока не почистим. И соответственно, чтобы однозначно почистить буфер перед приёмом нужной информации достаточно
Не думал что такой тут буфер приема символов. Нужно писать свой - кольцевой, а то этот неудобный.
Так он и здесь кольцевой. А какой же он тут? Кольцевой, но с контролем переполнения.
Если Вы и впрямь решили написать "затирающий", то должен предупредить - это не так просто, как может показаться.
Надеюсь, Вы знаете, что делаете.
Так он и здесь кольцевой. А какой же он тут? Кольцевой, но с контролем переполнения.
Если Вы и впрямь решили написать "затирающий", то должен предупредить - это не так просто, как может показаться.
Надеюсь, Вы знаете, что делаете.
Я подумал у кольцевого переполнение никогда не наступает.
С чего бы? Ну вот он заполнился. Что делать? Есть варианты: тереть старое или выбрасывать вновь пришедшее. И чем тут "кольцевость" мешает? Хоть так, хоть так можно делать.
А ты всегда в форум пишешь то что думаешь? Не пробовал сначала посмотреть, разобраться, а потом писать?
Лично у меня получилось чистить буфер порта двойным вводом "Serial.read()".
Пример программы:
Лично у меня получилось чистить буфер порта двойным вводом Serial.read().
Лень картинку заливать, поэтому просто считайте, что я запостил картинку фейспалм.жипег.