Аппаратное обеспечение Arduino. Управление последовательным потоком данных с подтверждением связи XON/XOFF.

Я отправляю большие тексты с ПК на Arduino через последовательный порт и не могу просто скопировать и вставить их, так как Arduino недостаточно быстра для обработки их на лету.

Мне нужно какое-то управление потоком данных (вероятно, XON/XOFF), чтобы Arduino автоматически отправляла команду «Я занят, прекратите отправку», когда входной буфер близок к переполнению, а затем «Отправьте еще данные», когда буфер снова опустеет.

(Программа Arduino должна обработать полученный текст, и это может занять некоторое время, а оперативной памяти недостаточно для буферизации всех входных данных. С другой стороны, она должна быть отзывчивой, поэтому ей не нужно ждать заполнения буфера.)

(У меня было больше проектов с похожими проблемами. Текущий проект — это интерпретатор FORTH на Arduino Uno (atmega328p) / Arduino Mega (atmega2560), где я хочу сначала скопировать и вставить несколько программ (скажем, 1–5 кБ текста), а затем продолжить интерактивное общение (запустить несколько слов, посмотреть результаты, поиграть в игры...)

Какое решение лучше всего?

, 👍0

Обсуждение

осмотреть avrdude, @jsotola

@jsotola — avrdude используется для записи двоичного кода во флеш-память через загрузчик. Мне нужно взаимодействовать с запущенной программой. Как avrdude должен помочь?, @gilhad

он отправляет большой объем данных без ошибок... посмотрим, как это достигается... изучим исходный код для avrdude и для загрузчика, @jsotola

Он использует внутренний протокол с известным размером буфера (256) и диалоговым стилем сообщений синхронизации (например, https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ApplicationNotes/ApplicationNotes/doc2525.pdf). Я бы предпочёл что-то, поддерживаемое существующими терминальными программами, если это возможно., @gilhad


1 ответ


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
}
,