HardwareSerial и SoftwareSerial несовместимы.

HardwareSerial требует запуска прерывания для сохранения полученных байтов в буфере. Посмотрите этот файл из ядра Arduino. Если я теперь постоянно получаю и записываю в Software Serial, данные из HardwareSerial не могут быть буферизованы, поскольку внешние прерывания имеют более высокий приоритет.

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

Есть ли способ обойти это ограничение, не отключая прерывания и не приобретая чип с большим количеством портов UART?

РЕДАКТИРОВАТЬ: фактический вектор прерывания находится здесь

EDIT2: На этот вопрос нет ответа в моем предыдущем вопросе. Очевидно, что HardwareSerial необходимо прерывание приема для сохранения данных в буфере. Теперь мой вопрос заключается в том, как я могу использовать SoftwareSerial, пока он постоянно получает.

, 👍1

Обсуждение

Отвечает ли это на ваш вопрос? Потерянные данные SoftwareSerial и HardwareSerial, @VE7JRO

Это был мой вопрос, который явно был неправильно понят. Люди не понимают, что HardwareSerial использует прерывание приема для сохранения байтов в буфере. У меня вопрос, как использовать SoftwareSerial вместе с HardwareSerial, если SoftwareSerial постоянно получает., @Liess Jemai

Дубликат https://arduinoprosto.ru/q/93772/softwareserial-and-hardwareserial-lost-data, @Delta_G

Это вопрос, на который нет ответа в моем предыдущем вопросе... посмотрите еще раз... на этот вопрос нет ответов, @jsotola

@jsotola, тем не менее, это все тот же вопрос., @Rohit Gupta

Вы задали один и тот же вопрос дважды, здесь и здесь. Трудно понять, какой из них закрыть, потому что у них обоих есть ответы. Пожалуйста, **не делай этого**. Не задавайте вопрос повторно только потому, что не получили ответа на первый., @Nick Gammon


1 ответ


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

1

Если вы отправляете что-то в обработчике ISR SoftwareSerial, это означает, что ISR отключены и вы блокируете вызов других ISR (при необходимости).

Если вы используете какую-то безумно медленную скорость передачи данных, например 9600, это означает, что на каждый отправленный символ требуется более 1 миллисекунды, и в течение этого времени вы можете пропустить другие вызовы прерываний (миллисы, серийные номера HW). Если есть только один символ, это не проблема, он будет обработан после повторного включения прерываний, но если будет второй или более символов, предыдущие теряются, так как они никогда не считывались из регистра UDR (что следует установить флаг переполнения буфера или как он называется).

Если ваш серийный номер HW имеет хорошую скорость, например 115200, вы можете потерять до 12 символов при отправке односимвольного software serial со скоростью 9600

Cli() в библиотеке последовательного программного обеспечения но, как вы написали, он вызывается из обработчика ISR, и ISR все равно отключены во время всего обработчика ISR

,

«Если ваш серийный номер Hw имеет хорошую скорость, например 115200, вы можете потерять до 12 символов при отправке односимвольного серийного номера программного обеспечения со скоростью 9600» Это именно та ситуация, в которой я нахожусь, что, к сожалению, требуется. Спасибо за вашу информацию. В настоящее время я изучаю AltSoftSerial, который не так сильно блокирует., @Liess Jemai

Выберите что-то вроде Nano Every (обратите внимание, что Every), у которого есть несколько USART, и один из них, подключенный к USB, отличается от второго, подключенного к контактам 0 и 1., @KIIV

Другим решением, вероятно, была бы реализация какого-либо аппаратного управления потоком, поскольку устройство на серийном аппарате его поддерживает. Это потребует модификации приемного порта серийного номера аппаратного обеспечения И новой печатной платы. Посмотрим, @Liess Jemai

@LiessJemai Другое решение — поменять местами интерфейсы. Используйте последовательный порт программного обеспечения с более высокой скоростью (он может обрабатывать до 115 200 бит в секунду) и последовательный порт аппаратного обеспечения с более низкой скоростью. Или, если вы можете выбирать скорости, отрегулируйте их., @the busybee