Неблокирующий SoftwareSerial.Write
Как использовать SoftwareSerial.Писать
без блокировки, если буфер заполнен? Serial.запись
блоков, если буфер заполнен. Поэтому мне нужно проверить Serial.availableforwrite
перед вызовом write, чтобы предотвратить блокировку. Но нет никакого SoftwareSerial.available forwrite
. Как я могу использовать SoftwareSerial.Писать
без блокировки?
1 ответ
Лучший ответ:
Короче говоря, вы этого не делаете.
Реализация SoftwareSerial для AVR вообще не имеет исходящего буфера.
Он просто отключает прерывания во время каждого исходящего символа и немедленно отправляет их все.
Это означает, что вызов функции записи SoftwareSerial просто блокируется до тех пор, пока все данные, которые вы пытались отправить, не будут отправлены. Если вы не можете позволить себе ждать, пока ваши данные выйдут на линию TX сейчас, то вы должны отправить их позже, когда сможете позволить себе подождать.
SoftwareSerial не имеет управления потоком. Когда вы пишете (), данные отправляются на вывод TX независимо от того, присутствует ли что-либо на другой стороне соединения. И когда они присутствуют, данные все равно передаются независимо от того, считает ли другая сторона себя "готовой" к приему. Просто нет обратной связи от получателя, чтобы сказать отправителю остановиться. Таким образом, SoftwareSerial сам по себе никогда не будет блокироваться из-за этих вещей.
Это означает, что я могу вызывать Write всякий раз, когда захочу, без риска блокировки моей основной программы?, @firendlyQuestion
Я обновил ответ, пытаясь решить эту проблему., @timemage
Моя проблема в том, что я не могу убедиться, слушает меня кто-то или нет. Для программы не важно, слушает ли кто-то, но попадание в тупик недопустимо., @firendlyQuestion
Обновлено снова в попытке решить эту проблему., @timemage
Спасибо. Это очень помогло., @firendlyQuestion
Является ли последняя часть (без flowcontrol) идентичной обычной Serial.write? Так что мне не нужно проверять Serial.availableforwrite для Serial.write тоже?, @firendlyQuestion
Для Serial (HardwareSerial) на UNO (вы отметили) также нет управления потоком между чипом ATmega328P и последовательным приемопередатчиком (ATmega # U2 или FTDI, CH340 и т. Д.). Таким образом, он не будет блокироваться из-за управления потоком. Вы можете заполнить кольцевой буфер передачи и ждать, пока прерывание передачи USART истощит этот кольцевой буфер. Но это не будет тупиком., @timemage
Еще раз спасибо 3moreWords, @firendlyQuestion
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Чтение SMS с помощью Arduino Uno и SIM800L и печать на LCD (16x2 буквенно-цифровых) с использованием последовательного соединения
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- myserial.available() возвращает нулевой байт
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- SoftwareSerial данные недоступны
AltSoftSerial имеет availableForWrite(), @Juraj
Каков ваш вариант использования программного обеспечения Serial?, @Gabriel Staples