Что делает _serial_.bufferUntil (byte) и как он взаимодействует с serialEvent? - PullRequest
3 голосов
/ 24 июня 2019

У меня проблемы с пониманием этого.После поиска я нашел

Устанавливает определенный байт для буферизации до вызова serialEvent ()

Это от эта ссылка с сайта обработки

Последовательное событие - это функция, которую пользователь заявляет, вводя последовательный порт, определенный как функция, если я не ошибаюсь.

Но я видел bufferUntil(‘\n’), когда в Serial ничего не отправляется, так что это делает и что это означает перед вызовом serialEvent (), это включается в настройку, как его можно вызывать каждый раз, прежде чемфункция?И я также видел такие аргументы, как lf, так что же здесь происходит и как он взаимодействует с этой функцией serialEvent ()?

Спасибо за помощь, ура!

1 Ответ

1 голос
/ 24 июня 2019

С помощью bufferUntil(lf) вы настраиваете свой последовательный порт для прослушивания (записи данных в его буфер), пока он не получит определенный символ (lf, который в приведенном вами примере является символом перевода строки).

Как вы заметили, bufferUntil(lf) на самом деле не будет читать никаких данных. Чтобы прочитать данные полученного порта, вам нужно определить функцию прерывания, в которой вы вызываете readString:

void serialEvent(Serial port)
   { inString = port.readString(); } 

Эта функция будет вызываться (прерывая нормальный поток вашей программы и, следовательно, ее имя) автоматически, как только последовательный порт получит символ, который вы определили с помощью bufferUntil(lf); это будет до символа перевода строки для примера. После чтения данных из буфера порта ваша программа вернется туда, где она была прервана.

РЕДАКТИРОВАТЬ: Что такое буфер? Буфер является либо программным (переменная скрыта в используемой вами библиотеке), либо аппаратным (банк памяти на чипе последовательного порта), где вы храните данные, поступающие в порт (это буфер приема, но также есть буфер передачи для информации, которую вы отправляете через порт).

Думайте об этом как о корзине для битов или байтов. По аналогии с потоком воды, вытекающей из крана, вы можете открыть кран и поставить под него стакан, если хотите стакан воды. Но может случиться так, что вы захотите пить воду позже, поэтому вы можете поставить ведро (буфер воды) для хранения воды для вас. В этом случае оператор bufferUntil(lf) будет действием по размещению ведра, и вы можете думать о serialEvent как о поступлении воды из ведра (тот факт, что вы используете ведро, позволяет вам продолжать делать погоняешь по дому, но в какой-то момент ведро переполнится, если только ты не закроешь кран или не начнешь опустошать его, и для этого тебе придется прервать твой обычный поток действий).

Зачем нам нужны буферы? Ну, вы могли бы непрерывно опрашивать (прослушивать порт из основной задачи вашего программного обеспечения), но тогда ваш код был бы очень неэффективным. С буферами вы можете делать другие вещи (вычислять вещи, считывать данные с датчиков и т. Д.), И вы будете проверять порт только тогда, когда вы уверены (потому что ваша процедура была прервана), когда нужные вам данные находятся там. В этом случае необходимые данные обозначаются символом, который вы использовали в качестве аргумента в функции bufferUntil(lf).

Надеюсь, я не переусердствовал с аналогиями.

...