Аппаратная последовательная библиотека Arduino с поддержкой управления потоком rts/cts
Существует ли (разработанная пользователем и т. д.) версия аппаратной последовательной библиотеки UART, которая поддерживает управление потоком на основе RTS/CTS? Больше интересует сторона Tx (Arduino отправляет данные, а периферийное устройство может оказывать противодавление). Библиотека должна позволять Arduino прекращать передачу в течение 1 символа после появления индикации «не готов» от периферийного устройства.
Спасибо.
@O.K., 👍6
Обсуждение3 ответа
Я считаю, что CTS будет довольно легко реализовать:
void loop() {
uint8_t clear_to_send = digitalRead(CTS);
volatile char data;
if (clear_to_send) {
Serial.write(data);
}
}
Я не уверен насчет RTS.
Это не поможет остановить передачу в течение одного (или даже нескольких) символов, потому что, хотя вы и остановили Serial.write, в последовательном буфере (по-моему, 64 байта по умолчанию в библиотеке Arduino) уже могут быть данные, которые могут продолжать передаваться (и потенциально теряться). В любом случае, я перешел на Teensy, в котором реализовано аппаратное управление потоком RTS/CTS, поэтому он может остановиться, как только (я полагаю, 1 символ) CTS будет деактивирован., @O.K.
Аппаратный USART, конечно, лучше. Хотя, можно сбрасывать буфер [Serial.flush()](https://www.arduino.cc/en/Serial/Flush) после каждой записи и сохранять последний отправленный байт для отправки позже., @woo2
Я бы удивился, если бы не было реализации Arduino. Обычно (аппаратный) буфер отправки на UNO, как я полагаю, составляет 1 байт. Последовательная оболочка Arduino имеет свой собственный программный буфер. Вы можете изменить его там. Но вам, возможно, придется перезапустить отправку вручную (так как я думаю, что они используют "прерывание завершения передачи" для ожидания следующей возможной отправки, которая не произойдет, если вы остановите отправку), @Paul
Я обнаружил, что RTS/CTS может быть реализован в подлинных Arduinos, но не поддерживается Arduinos, использующими чип CH340 USB для последовательного интерфейса. Я обнаружил это, когда моя JAVA-программа могла нормально общаться с настоящим Uno, но не отправляла никаких данных на несколько совместимых с Arduino, которые используют чип CH340 (но получала от них). У меня был установлен RTS/CTS в программе JAVA. Когда я изменил его на FLOWCONTROL_NONE, он начал работать нормально.
Мне не известна такая библиотека. Вы можете попробовать реализовать один себя и, возможно, поделитесь этим с сообществом. :-)
Если вы выберете этот путь, вам придется скопировать файл HardwareSerial.cpp из ядра Arduino, создайте свой изменения там, и ваша версия заменит версию из ядра. Здесь Вот несколько идей, которые могут помочь вам начать работу:
- Подключите сигнал готовности от устройства к контакту с возможностью прерывания Ардуино.
- Внутри обработчика прерываний:
- когда сигнал «готовность» отменен, отключите прерывание UDRE, выдав команду
cbi(*_ucsrb, UDRIE0)
- когда будет подтверждена готовность, включите ее снова, но только если вывод
буфер не пуст:
if (_tx_buffer_head != _tx_buffer_tail) sbi(*_ucsrb, UDRIE0);
- когда сигнал «готовность» отменен, отключите прерывание UDRE, выдав команду
- Исправьте
HardwareSerial::write()
, чтобы включить прерывание только в том случае, если Утверждается «готов». - Обратите внимание, что UDRE IRQ может быть вызван явно
от
HardwareSerial::flush()
и поHardwareSerial::write()
если прерывания глобальные неполноценный. Вам придется обусловить это сигналом готовности. - Обратите также внимание, что
HardwareSerial::write( )
может писать непосредственно в UART, если буфер пуст. Это тоже должно быть обусловлено сигналом готовности.
- Я хочу, чтобы мой arduino mega одновременно читал со всех 4 последовательных портов, последовательно проходя через каждый из них.
- Связь Arduino с ROS через UART
- Arduino, python, pyfirmata, стандарт компании
- Arduino Mega считывает ту же информацию, что и через последовательный порт
- Arduino Mega Loopback Test с несколькими портами TX/RX
- Отправка данных нескольких датчиков в один пакет в Arduino
- Arduino Mega чтение с внешнего датчика. Проблема
- Связь с подключенным устройством UART работает только в одном направлении
Эта библиотека может помочь для Arduino на базе AVR: https://github.com/i-am-bigmike/HardwareSerial_flow_control., @MV.