Как работать в многозадачном режиме при записи в Serial

Я пытаюсь отправить данные в реальном времени, полученные от АЦП Arduino Uno (SPI), в Arduino IDE через USB-кабель. Я обнаружил, что один байт занимает около 70 микросекунд, когда Serial.write() используется со скоростью 115200 бод. Мой вопрос заключается в том, что если я отправлю 14400 байт (что будет максимальным пределом при этой скорости передачи), могу ли я выполнить любое другие задачи? Позволяет ли Arduino выполнять многозадачность, пока последовательный буфер занят записью данных?

, 👍0

Обсуждение

почему вы говорите, что 14400 байт — это предел?, @jsotola


1 ответ


3

Пока вы не заполните буфер передачи (64 байта по умолчанию, но при необходимости его можно перекомпилировать для увеличения), Serial.print() или Serial.write() вернут результат немедленно. Символы в буфере будут передаваться с помощью процедуры обслуживания прерываний, поэтому, по сути, для этой цели Arduino выполняет двойную задачу. Если буфер заполнен, когда вы вызываете Serial.print() или Serial.write() или Serial.print() заполняет его до отправки всех символов, эти вызовы блокируются (не возвращаются), пока не останется буферное пространство. для остальных символов.

Так что да, вы можете делать и другие вещи, пока происходит запись, если только вы не заполнили буфер. Вы можете вызвать Serial.availableForWrite(), чтобы узнать, сколько символов вы можете отправить без блокировки.

Кстати, при скорости 115200 бод или 11520 байт/сек каждый символ должен занимать 1/11520 секунды или 86,8 микросекунды, а не 70 миллисекунд.

,

Спасибо @JRobert. Я воспользуюсь Serial.available и узнаю периоды времени, затраченные Serial.write, а затем вернусь., @NavTuriya

Я думаю, что скорость передачи данных определяет количество бит в секунду. Итак, чтобы записать байт, потребуется 1/115200*8 секунды, что составляет около 70 микросекунд, и именно это я и нашел. Извините за опечатку, ошибочно написал миллисекунды., @NavTuriya

Но на самом деле для отправки 8-битного байта при последовательной передаче требуется 10 или 11 бит (1 стартовый бит, 8 бит данных и 1 или 2 стоповых бита; чаще всего 1). Значит, нужно разделить на десять, а не на 8., @JRobert

Да, ты прав. Я перепроверю значения времени., @NavTuriya

Дж.Роберт сказал, что [Serial.availableForWrite](https://www.arduino.cc/reference/en/language/functions/communication/serial/availableforwrite/), а не [Serial.available](https://www.arduino.cc/ ссылка/en/язык/функции/связь/серийный/доступный/). Это совершенно разные вещи., @Nick Gammon