AVR USART дождаться ответа AVR, чтобы продолжить текстовый поток

AVR USART дождаться ответа AVR для продолжения протокола

Я занимаюсь старшим проектом, и мне нужно построчно отправить большой текстовый файл на AVR (atmega32), который будет управлять пианино с помощью ~ 36 соленоидов и сдвиговых регистров. Это нужно делать автоматически и очень быстро. Я не могу вручную ввести текст в терминале. Мне нужно отправить 3 строки, строка за строкой, на AVR и ждать между каждой строкой подтверждения для продолжения формы AVR.

  • Текстовый файл представляет собой сконвертированный миди-файл, который содержит 3 полезные сведения (время события, заметку и статус (нажать на заметку или не нажимать). Текстовый файл выглядит так:

    213, 25, ON
    321, 25, OFF
    521, 36, ON --> что означает воспроизведение ноты C в момент времени = 521 мс.

Где первая строка — время события, вторая — заметка, а третья — статус заметки

Протокол должен выглядеть так:

  • ПК отправляет 3 строки на AVR. Всего 3 передачи USART.
  • ПК ожидает, пока AVR отправит подтверждение, чтобы продолжить передачу следующей строки текста.
  • AVR воспроизводит «событие» на пианино и в конце отправляет подтверждение на ПК для отправки следующих строк текста.

Как это достижимо?

Почему я это делаю?

Проблема в том, что я не могу хранить весь текстовый файл в массиве, потому что AVR слишком мал (самый большой атмега - 512 КБ, если я хорошо помню). Мне нужно передать текстовый файл с помощью терминала (гипертерминала) построчно . НО как отправить строку с помощью терминала, дождаться пока атмега закончит процесс --> отправить подтверждение обратно на ПК для потоковой передачи следующей строки?

Вы ждете, пока не получите полную строку перед ее обработкой? И если да, то почему?
Почему вы конвертируете MIDI в текст? Почему бы не сделать так, чтобы AVR напрямую интерпретировал MIDI-данные, что, возможно, было бы намного проще? В конце концов, передача музыки через последовательный порт — это именно то, для чего был разработан MIDI!
Да, потому что 1 строка даст мне достаточно информации, чтобы передать бит в регистр сдвига. например, нота C будет представлять 000000100 в сопоставленной конфигурации соленоидов.
@DaveTweed Потому что я не отправляю MIDI на AVR. АРН управляет СОЛЕНОИДАМИ
@DaveTweed Вы говорите, что я могу делать MIDI --> USART --> AVR --> СОЛЕНОИДЫ???
В чем разница между MIDI→текст→USART→AVR→соленоиды и MIDI→USART→AVR→соленоиды, кроме дополнительного шага преобразования? И вам не нужна полная строка, прежде чем вы начнете ее обрабатывать; вместо этого делайте это байт за байтом.
Да, если вы используете программу-секвенсор для отправки музыки через MIDI-порт главного компьютера, вы можете получать эти данные с помощью USART ресивера. Вам просто нужно установить скорость передачи данных USART на 31 250 кбит/с и создать простой аппаратный интерфейс . (Я знаю, что вы не используете Arduino специально, но вы можете получить схему нужной вам детали здесь.) Кроме того, компьютер будет автоматически обрабатывать синхронизацию нот (управление потоком) для вас. Кроме того, вы также сможете использовать любое другое устройство с поддержкой MIDI для управления своим фортепиано.
Если вы хотите использовать hypterminal, вам нужно реализовать что-то, что он поддерживает, например, XON/XOFF (программное обеспечение) или, возможно, RTS/CTS (аппаратное обеспечение). Имейте в виду, что если вы используете USB-последовательный преобразователь, протокол, требующий ответа, существенно замедлит вашу работу. Однако другой вариант — использовать собственный USB (вместо USB-serial), и в этом случае вы можете отказаться подтверждать пакет USB, пока не израсходуете его и не будете готовы к следующему. Если вы реализуете известный последовательный протокол USB, вы можете использовать гипертерминал в качестве отправителя. Но рассмотрите возможность отказа от гипертерминала и написания собственной программы-отправителя.
Или вы можете реализовать USB MIDI-устройство и позволить программному секвенсору обрабатывать его.
@ IgnacioVazquez-Abrams У меня нет MIDI-устройства для управления. Соленоиды самодельные для проекта, поэтому мне нужно преобразовать MIDI в текст. Затем используйте этот текст для управления сдвиговыми регистрами.
Вот почему вы превращаете MCU в MIDI-устройство.
@ IgnacioVazquez-Abrams, но наш ввод не является MIDI-сигналом. Это миди-файл. Как мне это сделать?
Вы используете MIDI-секвенсор для преобразования MIDI-файла в MIDI-сигнал.
@IgnacioVazquez-Abrams, хорошо, тогда как мне использовать этот сигнал для управления соленоидами?
У вас есть AVR, интерпретирующий MIDI-сигнал и активизирующий их соответствующим образом.
@ IgnacioVazquez-Abrams, вот в чем проблема, я не могу найти интерпретатор MIDI. Популярно только обратное.
Затем вам нужно добавить усилия, чтобы записать его в свой бюджет.
@DaveTweed, хорошо, но как я могу интерпретировать введенный MIDI? Я не хочу выводить MIDI, я вывожу биты.
Что сказал @IgnacioVazquez-Abrams. И то, что я сказал для начала, 2 часа назад. Вы пишете интерпретатор MIDI, который намного проще, чем текстовый интерпретатор. Вам не нужно реализовывать всю спецификацию MIDI , просто сообщения «note on» и «note off».

Ответы (1)

Что вам нужно, так это «управление потоком» или «рукопожатие».

Для USART вы можете использовать аппаратное управление потоком с помощью RTS/CTS , но сегодня во многих реализациях USART они отсутствуют. Если вы закончили работу с оборудованием и не подключили эти контакты, вы можете попробовать « программное управление потоком » с «XON/XOFF», потому что эти два кода не появятся в вашем текстовом файле (это непечатаемый символ). Поэтому используйте их, поскольку управление потоком возможно. Но по сравнению с аппаратным управлением потоком последний может быть немного медленнее.

Основное ограничение для вас заключается в том, что ваш MCU недостаточно силен для обработки всего файла, поэтому разумно проанализировать файл на ПК.

Если вы не хотите погружаться в сложную программу USART на ПК, вы можете попробовать Tera Term , программируемую, удобную «убийцу гипертерминала» с открытым исходным кодом.

Предоставляет ли Tera Term функцию чтения текстового файла? Потому что, насколько я помню, терминалы требуют ручного ввода для передачи символов, верно? Кстати спасибо за информацию!
Да, вы можете программировать в Tera Term, и он поддерживает чтение файлов. Нужен ли Гипертерминалу ручной ввод?