AT-команды модема
Код программы:
Цитата:
//команды инициализации
StringData = "AT<cr>";
StringData = StringData + '\r' + '\0';
WriteFile(hCom, StringData, StringData.GetLength(), &iSize, 0);
StringData = "AT &F E0 &C1 &D2 V1 S0=0\V1<cr>";
StringData = StringData + '\r' + '\0';
WriteFile(hCom, StringData, StringData.GetLength(), &iSize, 0);
//собственно команды
StringData = "ATDT ,8,,0296186691<cr>";
StringData = StringData + '\r' + '\0';
WriteFile(hCom, StringData, StringData.GetLength(), &iSize, 0);
Sleep(1);
StringData = "AT H0<cr>";
StringData = StringData + '\r' + '\0';
WriteFile(hCom, StringData, StringData.GetLength(), &iSize, 0);
Второе, зачем ты передаешь <cr>? убери это. <cr> - это и есть '\r' '\n'.
команда at h0 это положить трубку.
После набора номера модем переходит в режим приёма/передачи данных. Для перевода в командный режим надо послать Esc-последовательность "+++" (без кавычек). Для перевода обратно в режим обмена данными надо послать какую-то команду (см. Manual к модему).
Тут ещё проблема вот в чем похоже. в этой программе сразу после того, када я посылаю первую команду в порт, идет вторая, то есть первая (в данном случае набор номера) не успевает полностью исполниться. Как сделать, чтобы прога сначала ждала, пока не установиться подключение, а уже потом шла следующая команда(sleep() по идее тут не пойдет-там ведь только фиксированное значение)
Для возврата обратно в режим передачи данных исп. команда On, где n=0 - бер реконнекта, n=1 - с реконнектом (например, если в режиме команд изменили какие-то параметры работы). А вообще в программе это лучше не использовать и устанавливать все параметры модема заблаговременно до сеанса связи.
Прекратить сеанс связи можно подав команду повесить трубку, либо сбросив бит порта DTR.
Извините за мою тупость. То есть, после посылки AT-команды набора номера, нужно сделать шо то типа таймера, и ждать пока ком-порт не возвратит OK, и тока после этого выполнять следующую команду
Цитата: Karrde
Извините за мою тупость. То есть, после посылки AT-команды набора номера, нужно сделать шо то типа таймера, и ждать пока ком-порт не возвратит OK, и тока после этого выполнять следующую команду
лучше создать объект ожидания или использовать callback-функцию.
Цитата: Karrde
Извините за мою тупость. То есть, после посылки AT-команды набора номера, нужно сделать шо то типа таймера, и ждать пока ком-порт не возвратит OK, и тока после этого выполнять следующую команду
Есть AT-команда, переводящая модем в режим ответа кодами, а не ASCII-символами. На мой взгляд, так будет удобнее. Тем не менее, ответ от модема обязательно надо получать, хотя бы для того, чтобы убедиться в его наличии.
Я посылаю команду в модем и хочу получить ответ с помощью ReadFile. Но в переменную StringBuf так ничего и не записывается. Да и вообще почему а ReadFile этот атрибут-указатель, а не какой нибудь определенный тип(допустим string)
Цитата:
StringData = "AT<cr>";
WriteFile(hCom, StringData, StringData.GetLength(), &iSize, 0);
StringData = "ATI3<cr>";
WriteFile(hCom, StringData, StringData.GetLength(), &iSize, 0);
ReadFile(hCom, &StringBuf, 100, &iSize, 0);
Про типы данных лучше обратиться к справке, как они там это реализовали. Это ведь не выньАПИ, а функции сишнека.
а нельзя ли считывать ответы модема не посимвольно, а целиком всю строку(а то везде где читаю, считывают посимвольно)
http://www.codeproject.com/system/SerialPortComm.asp?df=100
Мне хватило разобраться и написать небольшую прогу для модема.