Консультация № 159765
06.02.2009, 14:07
0.00 руб.
0 2 1
Здравствуйте, уважаемые эксперты. Возможно стоило задать вопрос по теме "теория программирования" но пишу сюда, так как программу пишу именно на Дельфи.
Необходимо написать программу работы с СМС. Конкретнее - есть gsm модем, подключенный к сом порту, на который и с которого смс принимаются/отсылаются. Формат команд/ответов есть, т.е. с "верхним" уровнем проблем нет. Но, как известно, компонета "модем" нет ни в одной среде (что конечно вполне естественно). Раньше с подобными задачами не сталкивался (профиль не тот), потому покопал в инете и выяснил, что необходимо писать модуль для работы с сом портом, что я уже сделал, но есть тонкости. Сейчас модуль написан для работы в синхронном режиме с отдельным потоком для чтения и событием, обработчик которого вызывается при получении байта, но и так загрузка процессора составляет 20-25% (опрос ведь также происходит в цикле). Есть функция SetCommMask, которая как нельзя лучше подходит, но она для асинхронного режима работы. Как здесь мне быть? Использовать эту функцию и работать в асинхронном режиме? (модем то любой работает в синхронном). Просто следить чтобы операции не "перекрывались". Или же есть какие то другие механизмы? Встретилась такая фраза:
"Особенности непосредственной работы с модемами я не буду рассматривать, так как существует большой набор высокоуровневых функций и протоколов, таких как TAPI, специально предназначеных для работы с модемами. Если Вас все же интересует эта тема, то почитайте описания функции GetCommModemStatus, и структур MODEMDEVCAPS и MODEMSETTINGS. В остальном работа с модемом ничем не отличается от работы с обычным портом."
Почитал я про то, что говорит автор слов, но понял - мне это не нужно, соединений я не создаю и т.п. Просто нужно иногда посылать в порт нужную команду, читать ответ и все... В остальном программа просто ждет прихода в порт строки (строка определенного формата посылается в порт модемом при приходе смс или входящем звонке)...
Конечно я наверное заново изобретаю велосипед - есть множество готовых уже компонентов типа "Сом-порт", но не в моих принципах не знать как и что делает каждая строка кода, да и за стабильность работы программы как я в таком случае могу отвечать?
Заранее огоромное СПАСИБО!!!

Обсуждение

Неизвестный
06.02.2009, 15:50
общий
это ответ
Здравствуйте, Ленар М.!
Вопрос обширен, поэтому, следующее верно - Возможно, стоило задать вопрос по теме "теория программирования"
Cледующее так же верно - необходимо писать модуль для работы с сом портом
Именно в эту сторону нужно смотреть - ...режиме с отдельным потоком... (добавлю - режимах)
Абсолютно верное упоминание - Встретилась такая фраза:
"Особенности непосредственной работы с модемами я не буду рассматривать, так как существует большой набор высокоуровневых функций и протоколов, таких как TAPI, специально предназначеных для работы с модемами. Если Вас все же интересует эта тема, то почитайте описания функции GetCommModemStatus, и структур MODEMDEVCAPS и MODEMSETTINGS. В остальном работа с модемом ничем не отличается от работы с обычным портом."
А вот тут Вы не правы - мне это не нужно, соединений я не создаю и т.п. Просто нужно иногда посылать в порт нужную команду, читать ответ и все...
Это лишь часть реализации работы с COM портом, однако для полноценной работы (что теряется за Вашим - я всего лишь делаю то-то и то-то... ) необходима наиболее полная реализация работы протокола.
Вот это мне особенно по душе - Конечно я наверное заново изобретаю велосипед - есть множество готовых уже компонентов типа "Сом-порт", но не в моих принципах не знать как и что делает каждая строка кода, да и за стабильность работы программы как я в таком случае могу отвечать?

В этом случае не поленитесь изучить код открытых компонентов для работы с COM портом. Тема весьма обширна, а Вы , насколько я понял хотите готового решения, причем себе же и противореча.
В плане ответа на Ваш вопрос. В свое время я реализовывал похожую задачу по коммуникации рабочей станции и терминала с грузовыми весами, там тоже обмен данными шел весьма своеобразно и по COM порту.
Так вот я воспользовался советами с http://www.delphimaster.ru/ и чтением примеров из DelphiWorld - http://delphiworld.narod.ru/
Поверьте мне, там есть ответы на Ваш вопрос. Стоит лишь внимательно прочитать. Если же у Вас все таки останутся вопросы, не стесняйтесь пишите мне на почту (не совсем уверен что могу оставить адрес, но думаю поправят, если не прав - на roobeeaz@rambler.ru (по моему исходники еще лежат где-то на HDD))
Неизвестный
06.02.2009, 16:14
общий
Спасибо за ответ, Armad
В этом случае не поленитесь изучить код открытых компонентов для работы с COM портом. Тема весьма обширна, а Вы , насколько я понял хотите готового решения, причем себе же и противореча.

Не поленился поискать побольше информации на эту тему и прочитал много и теории и практических выкладов с примерами. Функций не так уж и много и меня интересуют не способы реализации - результат один и тот же. Я хочу готового решения, но в моем исполнении, и решения именно поставленной задачи, поэтому противоречия здесь нет. В задачу не входит полная реализация поротокла. Мне нужно написать рабочую программу, которая бы решала поставленные цели (описаны в вопросе), ноя должен знать как работает каждая часть этой программы и посему пишу компонент сам.
Из готовых решений видно 2 способа работы: при синхронном режиме это отдельный поток для чтения, но здесь постоянная загрузка процессора, и второе - асинхронный режим с SetCommMask. Но модемы работают в синхронном режиме и при втором методе можно просто отслеживать чтобы как я писал операции чтения/записи не происходили одновременно - не "перекрывались". И мой вопрос частично сводится к следующему - правильно ли будет так делать? И есть ли другие пути?
Именно в эту сторону нужно смотреть - ...режиме с отдельным потоком... (добавлю - режимах)

слово режим в моей фразе относится не к потокам, а к прилагательному синхронный, который можно реализовать и просто - без всяких потоков...
Форма ответа