| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Работа с COM-портом. |
| Автор: AndreySol 7.8.2011, 17:42 |
| Что я хочу знать для начала: открыть выбранный порт, настроить его, послать АТ-команду в него, получить ответ, отобразить ответ. Нашел поиском много всякого, начал разбираться, понял что для открытия порта и чтения\записи в\из него используются ф-ции CreateFile, WriteFile, ReadFile. Для настройки открытого порта используются ф-ции описанные в разделе MSDN - Communications Functions. А вот чего не нашел пока - это как получить список доступных в системе COM-портов, дабы иметь возможность выбрать требуемый. Вариант "просто список из номеров по порядку" не подходит, у меня к примеру в системе 1 физический порт COM1 и 12 виртуальных, появившихся после установки Bluetooth-контроллера, которым программа установки присвоила номера от COM30 до СОМ42. Подскажите. |
| Автор: ama_kid 7.8.2011, 17:56 |
| HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM |
| Автор: gromo 7.8.2011, 23:15 |
| Я так понимаю, СОМ-порт нужен для работы с модемом или телефоном?! Опиши конкретно задачу, какие функции нужны? |
| Автор: Dem_max 8.8.2011, 06:23 |
| http://forum.sources.ru/index.php?showtopic=337903 |
| Автор: AndreySol 9.8.2011, 21:49 | ||||
| Использовал вариант с QueryDosDevice, спасибо Всем. Новый вопрос есть. На виртуальном COM-порту - моб.телефон. Пробую, для начала, открыть порт и послать в него AT-команду. Пример кода взял из статьи "Serial Communications in Win32" с MSDN. Приводить здесь код ф-ции открытия и настройки порта не буду, там ошибок не должно быть. Ф-ция записи в порт:
вызов ф-ции:
В результате получается так - вижу что порт открывается (МТ пишет на экране "SPP профиль подключен"), но команда не выполняется. Закрытие порта то-же нормально отрабатывается (МТ пишет на экране "SPP профиль отключен"). Где-то у меня ошибка, помогите. |
| Автор: AndreySol 9.8.2011, 23:27 |
| Нашел ошибку. Оказывается к AT-команде надо добавлять "\r". |
| Автор: AndreySol 27.8.2011, 14:00 | ||||
| На виртуальном COM-порту - моб.телефон. Посылаю команду, к примеру "at+egmr=0,0", ответ получаю в таком виде:
А HyperTerminal возвращает как положено, только
Уже и PurgeComm везде понаставил и пробовал порт открывать в синхронном и в асинхронном режиме - результат тот-же. В чем проблема может быть ? |
| Автор: AndreySol 27.8.2011, 15:32 |
| Разобрался, был включен режим "Эхо", помогло ATE0 - и все стало приходить как надо. |
| Автор: AndreySol 28.8.2011, 17:06 |
| Посылаю команду AT+CPBR=2. В своей программе ответ сохраняю в переменную типа CString, затем вывожу на RichEdit. Получается так +CPBR: 2, "09xxxx6453", 129, "" в последних кавычках должно быть имя абонента русскими буквами, с английским текстом все ОК. Проверял стандартным виндовым HyperTerminal'ом - в нем то-же "". Подскажите, что можно сделать ? P.S. смотрел команду +CSCS, но не очень понял что там за кодировки, кроме "PCCP437". |
| Автор: bass 1.9.2011, 14:38 |
| так создай мемо и туда побайтно выводи что приходит от телефона..... Либо телефон не чего не выдает либо софтина некорректно воспринимает (твоя).... |
| Автор: AndreySol 3.9.2011, 13:32 | ||
дак я не спорю. Вы подскажите, как корректно принять ? |
| Автор: Dem_max 4.9.2011, 05:53 |
| не вижу функции приема данных |
| Автор: AndreySol 4.9.2011, 12:46 | ||||
Вы это имели ввиду ?
|
| Автор: Dem_max 4.9.2011, 18:42 |
| Ну наверное тебе лучше знать как ты данные пытаешься принять. |
| Автор: AndreySol 11.9.2011, 16:09 | ||
так оно и есть, вот только как локализовать ? У моего китайца список кодировок: "IRA", "GSM", "HEX", "PCCP437", "8859-1", "UCS2", "UCS2_0X81". Насчет "PCCP437" понятно сразу, об остальных ничего не понял - пытался читать описания в стандартах, но увы... Может подскажете чего ? |
| Автор: xvr 11.9.2011, 19:46 | ||
IMHO UCS2 - это Unicode (16ти битовый). Попробуй его включить. |
| Автор: GremlinProg 12.9.2011, 06:13 | ||||||
можно для начала так:
или
или
т.е. выполнить эту команду вначале программы, либо где-нить перед 7-й строкой, не получится - подбирать еще и правильную кодировку в железе, например, как советует xvr |