Аппаратное обеспечение Arduino. Управление последовательным потоком данных с подтверждением связи XON/XOFF.
Я отправляю большие тексты с ПК на Arduino через последовательный порт и не могу просто скопировать и вставить их, так как Arduino недостаточно быстра для обработки их на лету.
Мне нужно какое-то управление потоком данных (вероятно, XON/XOFF), чтобы Arduino автоматически отправляла команду «Я занят, прекратите отправку», когда входной буфер близок к переполнению, а затем «Отправьте еще данные», когда буфер снова опустеет.
(Программа Arduino должна обработать полученный текст, и это может занять некоторое время, а оперативной памяти недостаточно для буферизации всех входных данных. С другой стороны, она должна быть отзывчивой, поэтому ей не нужно ждать заполнения буфера.)
(У меня было больше проектов с похожими проблемами. Текущий проект — это интерпретатор FORTH на Arduino Uno (atmega328p) / Arduino Mega (atmega2560), где я хочу сначала скопировать и вставить несколько программ (скажем, 1–5 кБ текста), а затем продолжить интерактивное общение (запустить несколько слов, посмотреть результаты, поиграть в игры...)
Какое решение лучше всего?
@gilhad, 👍0
Обсуждение1 ответ
Последовательный порт Arduino не поддерживает управление потоком данных, и ни один из них не поддерживает
последовательный порт на микроконтроллерах AVR. Если вы не найдёте библиотеку
который сделает это за вас, вам придется справиться с этим самостоятельно.
Типичный способ обработки последовательного ввода — это копирование входящего
байты из буфера Serial в ваш собственный буфер и, когда вы видите
терминатор сообщения (обычно это какой-то конец строки), вы обрабатываете все
Сообщение. Может быть, что-то вроде этого:
void loop() {
/* Обработка входящих команд. */
while (Serial.available()) {
static char buffer[BUFFER_LENGTH];
static int length = 0; // длина получена на данный момент
int data = Serial.read();
if (data == '\r') { // в конце строки:
buffer[length] = '\0'; // завершить строку
if (length) exec(buffer); // вызвать интерпретатор
length = 0; // сбросить буфер
} else if (length < BUFFER_LENGTH - 1) {
buffer[length++] = data; // буферизуем входящий байт
}
}
}
Если вы следуете этой схеме, вы можете изменить ее, добавив свои собственные
Поддержка XON/OFF. Если интерпретатор — медленный, вы можете
просто замените exec(buffer); на:
{
Serial.write(0x13); // отправить XOFF
exec(buffer); // вызываем интерпретатор
Serial.write(0x11); // отправить XON
}
- Последовательная связь между ESP8266 и Arduino Uno
- Как связаться с датчиком через порты RX/TX Arduino?
- Связь Arduino и ESP8266 SoftwareSerial
- Программирование Arduino Micro через RX/TX
- Serial Comm. проблема синхронизации между Arduino и Pyserial
- Двоичный в десятичный с использованием побитовых операторов
- Возможно ли двунаправленное UART-соединение по одному проводу передачи данных?
- Arduino считывает состояние подключения устройства hc-05
осмотреть avrdude, @jsotola
@jsotola — avrdude используется для записи двоичного кода во флеш-память через загрузчик. Мне нужно взаимодействовать с запущенной программой. Как avrdude должен помочь?, @gilhad
он отправляет большой объем данных без ошибок... посмотрим, как это достигается... изучим исходный код для avrdude и для загрузчика, @jsotola
Он использует внутренний протокол с известным размером буфера (256) и диалоговым стилем сообщений синхронизации (например, https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ApplicationNotes/ApplicationNotes/doc2525.pdf). Я бы предпочёл что-то, поддерживаемое существующими терминальными программами, если это возможно., @gilhad