осваиваю модуль воспроизведения MP3 и не только по командам с USART MP3-TF-16P, вот такой:

задумка была такая: заставил модуль что-то воспроизводить, и занимаюсь своими делами, проверяя время от времени, не закончил ли он бухтеть. как закончил - снова его пинаю, если надо. казалось бы - что сложного?
только оказалось, что модуль на команды реагирует своеобразно.
во-первых, если требуешь от него ACK-подтверждение, то он выставляет его мгновенно после приема команды. а вот результат исполнения самой команды может прийти спустя несколько сотен миллисекунд, видимо, пока он по SD-карте пошушршит...
во-вторых, на пине BUSY уровень выставляется тоже спустя некоторое время после приема команды, до конца не выяснил, какое именно, но тоже в сотнях миллисекунд измеряется.
в-третьих, о том, что он закончил играть заданный трек, модуль сообщает ДВУМЯ командами, хотя в документации об этом ни слова. т.е. приходит два одинаковых пакета.
плюс ко всему я еще запузырил кольцевые буферы на прием...
в итоге начинаются проблемы синхронизации сообщений. то есть я послал команду в модуль "играй трек", он тут же в буфер кинул подтверждение приема команды. т.к. я буфер проверяю не сразу, то в нем может к этому моменту находиться предыдущий ответ от предыдущей команды. плюс модуль имеет обыкновение посылать ответы на события, например, вставки карты, т.е. ответы вообще не связанные с моими командами. в итоге не так просто разобраться, какой ответ чему из моих действий соответствует.
ну и самое смешное: послал команду "играй трек" и, как выше говорил, начинаю периодически спрашивать модуль "ты там что делаешь?". а он мне в течение нескольких сотен миллисекунд отвечает "ничего не делаю". само собой, если у меня в очереди следующий трек на воспроизведение, я его стартую - и снова та же песня. приходится ТУПО ЖДАТЬ, пока модуль ответит "я начал играть", и уж потом можно начинать периодически интересоваться, не закончил ли. если ждать ответа об окончании, то, т.к. прием буфферизирован, а модуль выдает ДВА ответа, я попадаю в ситуацию, когда начав воспроизводить ВТОРОЙ трек я тут же вижу в буфере второй ответ об окончании ПЕРВОГО, и попадаю в непонятки - то ли ВТОРОЙ уже кончился, то ли нет.
короче, с этой асинхронностью как-то не ладится. постоянно ждать и опустошать буфер - получается, никакого выигрыша с тупым поллингом USART нет, и зачем тогда кольцевой буфер?
как разумно наладить асинхронность? может, я чего-то не понимаю в работе этого модуля? может, я, наоборот, замудрил с асинхронностью?
меня еще подобный геморрой ждет с модулем GSM: там модем тоже может неожиданно выдать ответ не тот, что я жду, а, например, сигнал о входящем звонке или СМС... и разбираться с этим тоже придется. так что надо бы определиться с общим принципиальным алгоритмом. если есть понимающие в этом люди, посоветуйте что-нибудь разумно-оптимальное.



