Извините, что вмешиваюсь в ваш спор по алгоритмам сжатия...
Но по поводу передачи сигналов DTMF в речевом режиме по каналам GSM могу посоветовать применить GSM-терминал, понимающий АТ-команды создания и передачи сигналов DTMF (AT+VDT, AT+VTS). Поскольку GSM-терминалом, по всей видимости, управляет некое устройство, то на него и вожложить работу по распознанию DTMF сигналов от охранной аппаратуры и выдачу соответствующих команд в GSM-терминал.
Команды на мобильные устройства удовлетворяют стандартам. Взять описание можно от любого, и определить: поддерживает ли Ваш мобильник эту команду. Вот описание команд на русском webfile.ru/1110569
Если в функции printf указан формат "%#X", то функция ожидает аргумент типа int. Для вывода char необходимо указать "%#bX". Если нужно, чтобы при значении, например, 1,выводилось бы не "0X1", а "0X01", то формат - "%#04bX".
Ошибка имхо в том, что Вы не заполняете ВСЕ поля структуры dcb. Если Вы не желаете изменять их(эти поля), то вызовите функцию GetCommState - она их заполнит, а затем измените те, что Вам нужны на необходимые значения.
Если у Вас возникли проблемы по использованию функций WinAPI при работе с СОМ-портом - почитайте статью Олега Титова "Работа c СОМ-портами в Win32". Любым поисковиком находится нараз.
Когда-то сам брал эту статью с www.rs232.ru