Если применить вышеприведеный подход, автомат switch разрастается настолько -- для этого используются параллельные автоматы. В сумме они разрастаются (как у тебя, ибо число состояний перемножается), но по отдельности небольшие. Нужно http://caxapa.ru/397636.html
обеспечить последовательный доступ к модему для подачи команд. Кто-то один владеет модемом, пока свою команду не обработает (одну-пару команд, а не весь цикл работы), остальные ждут. Unsolicited сообщения доставляются всем заинтересованным слушателям, которые уже решают, обработать или передать дальше. Нужен полноценный парсер ответов модема, способный понять, что команда закончена (и сменить своё состояние, отдать ответ на верхний уровень). Многопоточное программирование ничем не поможет, только усложнит из-за синхронизации. Достаточно автоматов по switch-технологии Шалыто, или "прототредов". Помимо парсера ответов (автомат тоже) у меня были автомат для отправки SMS, автомат для приёма SMS, автомат для исходящих звонков, автомат для входящих звонков, автомат управляющий звонком вообще (на более нижнем уровне), автомат для интернета, автомат для слежения за GSM-сетью и исправностью SIM-карты (чтоб насильно перерегистрировать в сети ежели что), автомат для USSD-запросов... уж не помню чего ещё.
Ещё топик:
http://caxapa.ru/397626.html?todo=full