Аппаратная последовательная библиотека Arduino с поддержкой управления потоком rts/cts

Существует ли (разработанная пользователем и т. д.) версия аппаратной последовательной библиотеки UART, которая поддерживает управление потоком на основе RTS/CTS? Больше интересует сторона Tx (Arduino отправляет данные, а периферийное устройство может оказывать противодавление). Библиотека должна позволять Arduino прекращать передачу в течение 1 символа после появления индикации «не готов» от периферийного устройства.

Спасибо.

, 👍6

Обсуждение

Эта библиотека может помочь для Arduino на базе AVR: https://github.com/i-am-bigmike/HardwareSerial_flow_control., @MV.


3 ответа


0

Я считаю, что 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


0

Я обнаружил, что RTS/CTS может быть реализован в подлинных Arduinos, но не поддерживается Arduinos, использующими чип CH340 USB для последовательного интерфейса. Я обнаружил это, когда моя JAVA-программа могла нормально общаться с настоящим Uno, но не отправляла никаких данных на несколько совместимых с Arduino, которые используют чип CH340 (но получала от них). У меня был установлен RTS/CTS в программе JAVA. Когда я изменил его на FLOWCONTROL_NONE, он начал работать нормально.

,

2

Мне не известна такая библиотека. Вы можете попробовать реализовать один себя и, возможно, поделитесь этим с сообществом. :-)

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

  • Подключите сигнал готовности от устройства к контакту с возможностью прерывания Ардуино.
  • Внутри обработчика прерываний:
    • когда сигнал «готовность» отменен, отключите прерывание UDRE, выдав команду cbi(*_ucsrb, UDRIE0)
    • когда будет подтверждена готовность, включите ее снова, но только если вывод буфер не пуст: if (_tx_buffer_head != _tx_buffer_tail) sbi(*_ucsrb, UDRIE0);
  • Исправьте HardwareSerial::write(), чтобы включить прерывание только в том случае, если Утверждается «готов».
  • Обратите внимание, что UDRE IRQ может быть вызван явно от HardwareSerial::flush() и по HardwareSerial::write() если прерывания глобальные неполноценный. Вам придется обусловить это сигналом готовности.
  • Обратите также внимание, что HardwareSerial::write( ) может писать непосредственно в UART, если буфер пуст. Это тоже должно быть обусловлено сигналом готовности.
,