Цитата(Alechek @ Jan 19 2016, 14:53)

Так вот, даже если допустить, что от момента выполнения команды до отправки ответа ничего влезть не сможет, то как определить фазу выполнения команды?
Пока мы что-то отправляем на модем, нам УЖЕ может валится URC типа "у меня смс новое". Естественно, после отправки команды мы ждем "OK", а получаем "+CNMI" и злимся на модем, что "незванный гость хуже татарина.."
Цитата(jcxz @ Jan 19 2016, 16:38)

Имхо - неправильный алгоритм. Я классифицирую по-другому.
Ну да, я имел в виду одно, а получилось другое, написал не подумавши
На самом деле, то что я применяю на практике, примерно соответствует описанному вами:
кольцевой приемный буфер для ответов модема, который анализируется по тайм-ауту после прихода последнего байта и периодически во время ожидания ответа. Сканируется на соответствие шаблонам ответов по принципу функции strstr();
так что положение ответа значения не имеет. После обнаружения ответа, ответ удаляется из буфера (только он).
Всякие неожиданные URC периодически сканируются в бэкграунде.
Чтобы уменьшить вероятность переполнения приемного буфера, периодически происходит полная его очистка (с защитными механизмами типа слежения за принимаемыми байтами на уровне прерываний и поднятия RTS).
А вот разбиение на строки по \r\n не использую. Применяю обмен бинарныим данными, кроме того есть присловутые приглашения модема при отправке данных и СМС из одинокой треугольной скобки (>)
А по перемешиванию ответов модема, точно читал в каком-то описании, что что-то, где-то ну точно не должно перемешиваться.
Только деталей совершенно не помню...