Неблокирующий SoftwareSerial.Write

Как использовать SoftwareSerial.Писать без блокировки, если буфер заполнен? Serial.запись блоков, если буфер заполнен. Поэтому мне нужно проверить Serial.availableforwrite перед вызовом write, чтобы предотвратить блокировку. Но нет никакого SoftwareSerial.available forwrite. Как я могу использовать SoftwareSerial.Писать без блокировки?

, 👍4

Обсуждение

AltSoftSerial имеет availableForWrite(), @Juraj

Каков ваш вариант использования программного обеспечения Serial?, @Gabriel Staples


1 ответ


Лучший ответ:

9

Короче говоря, вы этого не делаете.

Реализация 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