Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Модератор

769

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

343

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

278

Россия, Санкт-Петербург


ID: 325460

CradleA

Мастер-Эксперт

209

Беларусь, Минск


ID: 137394

Megaloman

Мастер-Эксперт

158

Беларусь, Гомель


ID: 400815

alexleonsm

6-й класс

130


ID: 400669

epimkin

Профессионал

120


8.8.15

09.05.2021

JS: 2.8.21
CSS: 4.5.5
jQuery: 3.6.0
DataForLocalStorage: 2021-05-15 03:46:17-standard


Создание программ на языках Pascal, Delphi и Lazarus.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 159765

Раздел: Pascal / Delphi / Lazarus
Автор вопроса: Ленар М.
Дата: 06.02.2009, 14:07 Консультация закрыта
Поступило ответов: 1

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

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

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

Armad

Посетитель
06.02.2009, 15:50
Мини-форум консультации # 159765
неизвестный

1

= общий =    06.02.2009, 16:14

Спасибо за ответ, Armad

В этом случае не поленитесь изучить код открытых компонентов для работы с COM портом. Тема весьма обширна, а Вы , насколько я понял хотите готового решения, причем себе же и противореча.


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

Именно в эту сторону нужно смотреть - ...режиме с отдельным потоком... (добавлю - режимах)


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

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

puporev

Профессор

Рейтинг: 111

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 74

Степанов Иван /REDDS

4-й класс

Рейтинг: 1

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 0

Асмик Гаряка

Советник

Рейтинг: 0

Орловский Дмитрий

Мастер-Эксперт

Рейтинг: 0