Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

Работа с COM портом.   Найти похожие ветки 

 
Lamer6666   (2009-10-24 18:10) [0]

Доброго времени суток уважаемые.
В очередной раз сталкиваюсь с областью мало мне знакомой, отправкой и получением 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


 
Германн ©   (2009-10-24 18:13) [1]

Дашь мыло, получишь книжку.


 
Сергей М. ©   (2009-10-24 18:17) [2]


> здесь WriteBytes массив


Зачем массив-то ?


> выяснил что чтение с порта реализовывают в отдельном потоке


Кому как надо, тот так и реализовывает.
Никто не заставляет тебя это делать.


> по средствам


Глаз режет.

Посредством - слитно пишется.


 
Lamer6666   (2009-10-24 18:17) [3]

lamer6666@kdmaster.ru


 
Lamer6666   (2009-10-24 18:22) [4]

Прошу прощения Сергей М., машинальные ошибки.


> Зачем массив-то ?


Можно PChar?


 
Сергей М. ©   (2009-10-24 18:24) [5]


> Можно PChar?


Можно.

WriteFile(CommHandle, PChar(AnsiStringVar)^, Length(AnsiStringVar), dwWrite, @OverWrite)


 
Германн ©   (2009-10-24 18:27) [6]


> Lamer6666   (24.10.09 18:17) [3]
>
> lamer6666@kdmaster.ru
>

Кажись отправил. Но почта сегодня что-то глючит.


 
Lamer6666   (2009-10-24 18:31) [7]


> Можно.

Спасибо.


> Германн ©

Получил, разбираюсь.

И все же скажите лучше ли использовать отдельный поток для чтения?


 
Германн ©   (2009-10-24 18:41) [8]


> И все же скажите лучше ли использовать отдельный поток для
> чтения?

Не для чтения, а для работы с портом. Но для твоей задачи отдельный поток не лучше. Но проще для новичка.


 
Сергей М. ©   (2009-10-24 18:41) [9]


> лучше ли использовать отдельный поток для чтения?


Доп.поток в процессе нужен для организации параллельных вычислений.
Лучше или хуже - решать тебе.


 
Lamer6666   (2009-10-24 18:47) [10]

Видимо мне стоит обрисовать задачу:
Отсылать СМС и параллельно проверять входящие смс сообщения.
Не сочтите за наглость, не могли бы вы в вкратце блок схему изложить, так сказать "правильный вектор задать" если не трудно )


 
Сергей М. ©   (2009-10-24 18:50) [11]

Сначала скажи, чем не угодили готовые компоненты для работы с СОМ-портом ..


 
Lamer6666   (2009-10-24 19:11) [12]

Спасибо Германн книга что надо....


> начала скажи, чем не угодили готовые компоненты для работы
> с СОМ-портом ..


Может глупо, но хочу разобраться...поэтому мнение опытных людей очень интересно.


 
Loginov Dmitry ©   (2009-10-24 19:48) [13]

> НЕ могу понять, как после отправки команды получить ответ
> с порта (например отправил команду AT+... получил Error
> или Ok)
> Почитав статьи выяснил что чтение с порта реализовывают
> в отдельном потоке но логику понять пока не могу, может
> поможете понять?


Рекомендую компоненты AsyncPro
http://sourceforge.net/projects/tpapro

во-первых в них реализована работа с модемом (компонент TApdModem), предусмотрены
обработчики для большинства возможных событих и ошибок, приходящих
от модема.

во-вторых, в них есть компонент TApdComPort. Отличный компонент, надо
сказать. И чтение из порта в нем реализовано в дополнительном потоке,
и возможностей предостаточно.

Таким образом можно работать с модемом либо через компонент TApdModem, либо использовать
только лишь TApdComPort.


 
Lamer6666   (2009-10-24 20:27) [14]


> Рекомендую компоненты AsyncPro
> http://sourceforge.net/projects/tpapro
>
> во-первых в них реализована работа с модемом (компонент
> TApdModem), предусмотрены
> обработчики для большинства возможных событих и ошибок,
> приходящих
> от модема.
>
> во-вторых, в них есть компонент TApdComPort. Отличный компонент,
>  надо
> сказать. И чтение из порта в нем реализовано в дополнительном
> потоке,
> и возможностей предостаточно.
>
> Таким образом можно работать с модемом либо через компонент
> TApdModem, либо использовать
> только лишь TApdComPort.


Качаю пробую..... ))
Спасибо, все же блок схему реализации на основе API


 
Loginov Dmitry ©   (2009-10-24 22:41) [15]

> Почитав статьи выяснил что чтение с порта реализовывают
> в отдельном потоке но логику понять пока не могу, может
> поможете понять?

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

Ну а если обмен не асинхронный, т.е. реализуется протокол
запрос/ответ, то не принципиально (чтение можно организовать
в том же потоке, разницы как правило нет).

Особенностью TApdComPort является чтение в отдельном потоке.
Кстати удобно использовать для работы со сканерами штрих-кодов.
Там только чтение, нет никакой записи в порт. Достаточно
перекрыть метод ReceiveData(), в нем реализовать проверку
принятых байтов, и просто вызывать некоторую callback-функцию,
если пришли все байты штрих-кода.


 
Loginov Dmitry ©   (2009-10-24 22:58) [16]

Сорри, перекрывать следует метод TriggerAvail


 
Loginov Dmitry ©   (2009-10-24 23:59) [17]

Кстати практически у всех компонентов работы с com-портом
чтение реализовано в дополнительном потоке. Компонентов
таких довольно-таки много:
- TBComPort
- Comm32
- http://comport.sf.net/  

вспомнилось еще, у TApdComPort все принятые байты зачем-то
перегоняются через основной поток. Для работы с модемом -
без разницы, но при интенсивной работе с различными
устройствами могут ощущаться тормоза. Так что выходит, что
компонент отличный не во всех отношениях :)


 
Lamer6666   (2009-10-24 23:59) [18]

Простите за возможно глупый вопрос Loginov Dmitry, как установить данную компоненту?


 
Loginov Dmitry ©   (2009-10-25 00:08) [19]

Обычная установка компонентов. Прочитайте readme. Все необходимое там должно быть.
В крайнем случае можете спросить у поисковых машин.


 
Германн ©   (2009-10-25 00:20) [20]


> как установить данную компоненту?

Не компоненту, а библиотеку компонент.


 
Lamer6666   (2009-10-25 00:59) [21]

Установил,  очень удобная, соединение с портом происходит, а вот отправка СМС не идет, ошибка 8100. (В настройках выбираю ApdGSMPhone1 выбираю gmPDU)
В описании APRO_DevGuide.pdf про коды ошибок ничего нет ((


 
Германн ©   (2009-10-25 01:11) [22]


> В описании APRO_DevGuide.pdf про коды ошибок ничего нет
> ((
>

Файл AdExcept.inc
 { TApdGSMPhone error codes }
 secSMSBusy                        {8100} = "Busy with another command";


 
Lamer6666   (2009-10-25 01:15) [23]


> Германн


Благодарю...



Страницы: 1 вся ветка

Текущий архив: 2009.12.13;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
1-1228663490
dmitry_12_08_73
2008-12-07 18:24
2009.12.13
Отображение нестандартных комбинаций горячих клавиш в меню


2-1256711630
petvv
2009-10-28 09:33
2009.12.13
Не пойму с запросом


11-1169181906
AlexM
2007-01-19 07:45
2009.12.13
VCL и KOL


13-1124196631
Bronco
2005-08-16 16:50
2009.12.13
ADO.NET: можно ли преобразовать DBNull ?


2-1256728258
kirat
2009-10-28 14:10
2009.12.13
cp866