![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с COM портом. [D7, XP]
Lamer6666 © (2009-10-24 18:10:00)Доброго времени суток уважаемые.
В очередной раз сталкиваюсь с областью мало мне знакомой, отправкой и получением AT команд GSM модему.
Прочитал статьи по работе с COM портами, решил работать с портом не по средствам компонентов а по средствам API функций.
Разобрался с тем как открывать и закрывать порт, устанавливать его параметры. Стоит вопрос об:
1. отправке команд в порт
2. получения ответов с порта.
Знаю что прием и передача осуществляются функциями ReadFile() и WriteFile().
Проблема №1:
WriteFile(CommHandle, WriteBytes, SizeOf(WriteBytes), dwWrite, @OverWrite)
здесь WriteBytes массив а команды отправляемые имеют тип String, как осуществить перевод типа String в массив Byte?
Проблема №2:
НЕ могу понять, как после отправки команды получить ответ с порта (например отправил команду AT+... получил Error или Ok)
Почитав статьи выяснил что чтение с порта реализовывают в отдельном потоке но логику понять пока не могу, может поможете понять?
Спасибо огромное, спасибо.С уважением Lamer6666
Lamer6666 (2009-10-25 01:15:00) [1]
> Германн
Благодарю...
Германн (2009-10-25 01:11:00) [2]
> В описании APRO_DevGuide.pdf про коды ошибок ничего нет
> ((
>
Файл AdExcept.inc
{ TApdGSMPhone error codes }
secSMSBusy {8100} = 'Busy with another command';
Lamer6666 (2009-10-25 00:59:00) [3]Установил, очень удобная, соединение с портом происходит, а вот отправка СМС не идет, ошибка 8100. (В настройках выбираю ApdGSMPhone1 выбираю gmPDU)
В описании APRO_DevGuide.pdf про коды ошибок ничего нет ((
Германн (2009-10-25 00:20:00) [4]
> как установить данную компоненту?
Не компоненту, а библиотеку компонент.
Loginov Dmitry (2009-10-25 00:08:00) [5]Обычная установка компонентов. Прочитайте readme. Все необходимое там должно быть.
В крайнем случае можете спросить у поисковых машин.
Lamer6666 (2009-10-24 23:59:00) [6]Простите за возможно глупый вопрос Loginov Dmitry, как установить данную компоненту?
Loginov Dmitry (2009-10-24 23:59:00) [7]Кстати практически у всех компонентов работы с com-портом
чтение реализовано в дополнительном потоке. Компонентов
таких довольно-таки много:
- TBComPort
- Comm32
- http://comport.sf.net/
вспомнилось еще, у TApdComPort все принятые байты зачем-то
перегоняются через основной поток. Для работы с модемом -
без разницы, но при интенсивной работе с различными
устройствами могут ощущаться тормоза. Так что выходит, что
компонент отличный не во всех отношениях :)
Loginov Dmitry (2009-10-24 22:58:00) [8]Сорри, перекрывать следует метод TriggerAvail
Loginov Dmitry (2009-10-24 22:41:00) [9]> Почитав статьи выяснил что чтение с порта реализовывают
> в отдельном потоке но логику понять пока не могу, может
> поможете понять?
В случае асинхронного обмена чтение и запись могут выполняться
одновременно, в этом случаем чтение следует организовывать в
отдельном потоке.
Ну а если обмен не асинхронный, т.е. реализуется протокол
запрос/ответ, то не принципиально (чтение можно организовать
в том же потоке, разницы как правило нет).
Особенностью TApdComPort является чтение в отдельном потоке.
Кстати удобно использовать для работы со сканерами штрих-кодов.
Там только чтение, нет никакой записи в порт. Достаточно
перекрыть метод ReceiveData(), в нем реализовать проверку
принятых байтов, и просто вызывать некоторую callback-функцию,
если пришли все байты штрих-кода.
Lamer6666 (2009-10-24 20:27:00) [10]
> Рекомендую компоненты AsyncPro
> http://sourceforge.net/projects/tpapro
>
> во-первых в них реализована работа с модемом (компонент
> TApdModem), предусмотрены
> обработчики для большинства возможных событих и ошибок,
> приходящих
> от модема.
>
> во-вторых, в них есть компонент TApdComPort. Отличный компонент,
> надо
> сказать. И чтение из порта в нем реализовано в дополнительном
> потоке,
> и возможностей предостаточно.
>
> Таким образом можно работать с модемом либо через компонент
> TApdModem, либо использовать
> только лишь TApdComPort.
Качаю пробую..... ))
Спасибо, все же блок схему реализации на основе API
Loginov Dmitry (2009-10-24 19:48:00) [11]> НЕ могу понять, как после отправки команды получить ответ
> с порта (например отправил команду AT+... получил Error
> или Ok)
> Почитав статьи выяснил что чтение с порта реализовывают
> в отдельном потоке но логику понять пока не могу, может
> поможете понять?
Рекомендую компоненты AsyncPro
http://sourceforge.net/projects/tpapro
во-первых в них реализована работа с модемом (компонент TApdModem), предусмотрены
обработчики для большинства возможных событих и ошибок, приходящих
от модема.
во-вторых, в них есть компонент TApdComPort. Отличный компонент, надо
сказать. И чтение из порта в нем реализовано в дополнительном потоке,
и возможностей предостаточно.
Таким образом можно работать с модемом либо через компонент TApdModem, либо использовать
только лишь TApdComPort.
Lamer6666 (2009-10-24 19:11:00) [12]Спасибо Германнкнига что надо....
> начала скажи, чем не угодили готовые компоненты для работы
> с СОМ-портом ..
Может глупо, но хочу разобраться...поэтому мнение опытных людей очень интересно.
Сергей М. (2009-10-24 18:50:00) [13]Сначала скажи, чем не угодили готовые компоненты для работы с СОМ-портом ..
Lamer6666 (2009-10-24 18:47:00) [14]Видимо мне стоит обрисовать задачу:
Отсылать СМС и параллельно проверять входящие смс сообщения.
Не сочтите за наглость, не могли бы вы в вкратце блок схему изложить, так сказать "правильный вектор задать" если не трудно )
Сергей М. (2009-10-24 18:41:00) [15]
> лучше ли использовать отдельный поток для чтения?
Доп.поток в процессе нужен для организации параллельных вычислений.
Лучше или хуже - решать тебе.
Германн (2009-10-24 18:41:00) [16]
> И все же скажите лучше ли использовать отдельный поток для
> чтения?
Не для чтения, а для работы с портом. Но для твоей задачи отдельный поток не лучше. Но проще для новичка.
Lamer6666 (2009-10-24 18:31:00) [17]
> Можно.
Спасибо.
> Германн ©
Получил, разбираюсь.
И все же скажите лучше ли использовать отдельный поток для чтения?
Германн (2009-10-24 18:27:00) [18]
> Lamer6666 (24.10.09 18:17) [3]
>
> lamer6666@kdmaster.ru
>
Кажись отправил. Но почта сегодня что-то глючит.
Сергей М. (2009-10-24 18:24:00) [19]
> Можно PChar?
Можно.
WriteFile(CommHandle, PChar(AnsiStringVar)^, Length(AnsiStringVar), dwWrite, @OverWrite)
Lamer6666 (2009-10-24 18:22:00) [20]Прошу прощения Сергей М., машинальные ошибки.
> Зачем массив-то ?
Можно PChar?