Здравствуйте! Как вы знаете, AVR и DFPlayer общаются по UART. Команды обратной связи отсылаются и принимаются тут вопросов нет. Не могу реализовать следующий алгоритм:
1. Нажали кнопку - послали модулю команду воспроизведения
2. От модуля пришел ответ - провели анализ
3. Если ответ положительный - отправили команду зациклить трек, если отрицательный - зажгли светодиод
4. От модуля пришел ответ о зацикливании - провели анализ
5. и т.д.
6 Нажали на ту же кнопку - отправили команду прекратить воспроизведение
7. От модуля пришел ответ - провели анализ
8. и т.д.
Все работает, кроме анализа. Вроде несложно, но не могу понять как МК заставить ждать ответа, точнее накопления буфера.
Есть код, но явно неверный (могу выложить, чтобы носом меня ткнуть в ошибки).
Подскажите алгоритм. Спасибо.
делал подобное - гемор еще тот, ибо модуль плейера имеет обыкновение то не отвечать на часть команд, то отвечать не одним ответом, а двумя разными, то задержка ответа непредсказуемая может быть - гадай потом, на какую команду он ответил... после долгих мучений отказался от анализа ответов, оставив тодлько анализ "уведомлений" о том, что карта вставлена-вынута, прошел сброс и инициализация. начало/конец воспроизведения отслеживаю по уровню на пине.
возможно, у меня руки кривые, но без анализа все получилось гораздо проще.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
2ARV
На самом деле не получается сделать анализ даже если карта воткнута/вынута. Например, я послал команду "плей".пришел ответ, что карта вынута, я поcлал еще раз "плей", чтобы убедится, что она действительно вынута (т.е. должно прийти еще одно подтверждение). Т.е. надо проанализировать ответ и в зависимости от него послать ту или другую команду по UART. Ошибка в коде явно в ожидании ответа. Прикладываю код, все лишнее удалил. Посмотрите где косяк, пжлст. Спасибо.
P.S. Пользуясь случаем спрошу. В этой программе есть анализ данных по АЦП. Когда опрос АЦП закомментирован - вывод данных на дисплей от UART мгновенный. Когда раскомментирован - секунд 5. Как можно оптимизировать? Спойлер
// прием данных от модуля и их разбор по прерываниям
ISR(RX_VECTOR){
static uint8_t cur;
static mp3_buf_t buf;
static uint8_t old = 0xFF;
uint8_t d = _UDR;
// ждем стартовый байт - синхронизация
if(cur == 0){
if(d != MP3_START_BYTE) return;
}
// накапливаем пакет
buf.bytes[cur++] = d;
if(d == MP3_STOP_BYTE){
// готов пакет
cur = 0;
switch(buf.command){
case MP3_ERROR: // ошибка
if(status == P_PLAY) status = P_READY;
break;
case MP3_STAY_USB:// конец воспроизведения
case MP3_STAY_SD:
// STAY приходит дважды, один раз надо игнорировать
if(old != buf.param_lo)
status = P_READY;
old = buf.param_lo;
break;
case MP3_DEV_STATUS: // инициализация закончена
if((status == P_NOT_READY) && (buf.param_lo == DEV_SD))
status = P_READY;
break;
case MP3_PLUG_IN: // подключение источника
status = P_READY;
break;
case MP3_PULL_OUT: // отключение источника
status = P_NOT_READY;
break;
default: // все прочие пакеты
break;
}
}
}
в основном цикле смотрю уже на status и принимаю решения.
Добавлено after 2 minutes 6 seconds:
вот заголовочник с константами и типами:
Спойлер
2Dimon456
7E FF 06 41 00 00 00 xx xx EF - команда принята удачно
7E FF 06 40 00 00 01 xx xx EF - модуль не инициализирован/занят
7E FF 06 40 00 00 03 xx xx EF - ошибка приема
7E FF 06 40 00 00 08 xx xx EF - SD карта повреждена
7E FF 06 3A 00 00 02 xx xx EF - SD карта установлена
7E FF 06 3B 00 00 02 xx xx EF - SD карта извлечена
7E FF 06 3F 00 00 02 xx xx EF - модуль инициализирован
где xx - CRC пакета
Как можно видеть, нам фактически интересны только 3 и 6 байт 2ARV
Спасибо. Буду смотреть