Как работать в многозадачном режиме при записи в Serial
Я пытаюсь отправить данные в реальном времени, полученные от АЦП Arduino Uno (SPI), в Arduino IDE через USB-кабель. Я обнаружил, что один байт занимает около 70 микросекунд, когда Serial.write() используется со скоростью 115200 бод. Мой вопрос заключается в том, что если я отправлю 14400 байт (что будет максимальным пределом при этой скорости передачи), могу ли я выполнить любое другие задачи? Позволяет ли Arduino выполнять многозадачность, пока последовательный буфер занят записью данных?
@NavTuriya, 👍0
Обсуждение1 ответ
Пока вы не заполните буфер передачи (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
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
почему вы говорите, что 14400 байт — это предел?, @jsotola