Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как отправить запросы модему


Pavel ©   (2010-02-03 22:12:00) 

Добрый вечер!
У меня возник вопрос с запросами к модему с помощью компонента CPort пишу на Delphi.
как отправить иниц. модему ? отправляю так

ComPort.WriteStr('AT'+#13#10); //

как отправить след команду? после ожидания ответа от первой?
создаю массив команд например

init_Array[0]:='AT';
init_Array[1]:='AT&V';


Германн   (2010-02-05 01:54:00) [1]


> Student :) ©   (04.02.10 15:17) [10]

Я не знаю компонент CPort, но по своему опыту знания подобных компонент предполагаю, что в его событии OnRxChar не следует вызывать "синхронный метод" ReadStr. Ибо такого рода метод читает порт и не возвращает результат пока не получит символы конца строки. У этого компонента должен быть какой-то (или какие-то) метод Read без упоминания STR. Он/они просто считывают уже полученные драйвером компорта данные в буфер твоей программы.


Германн   (2010-02-05 01:41:00) [2]


> Loginov Dmitry ©   (04.02.10 22:48) [13]
>
>

Я бы назвал описанные тобой действия как "парсинг входного буфера программы с учетом минимального и максимального времени ожидания ответа внешнего устройства".


Loginov Dmitry   (2010-02-04 22:48:00) [3]


> а как дождаться события OnRxChar?
> через процедуру?
>
> procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
>
> var
>  Str: String;
> begin
>  ComPort.ReadStr(Str, Count);
> showmessage(Str);
>
> end;


Добавляется некая глобальная строковая переменная (лучше если это будет одно из полей класса TForm1, в методе ComPortRxChar к ней прибавляются полученные символы. В конце функции ComPortRxChar выполняется поиск подстроки OK#13#10 или ERROR#13#10, и в случае обнаружения выставляется в True некий флаг (тоже глобальная переменная, Boolean).
Перед WriteStr() логической переменной присваивается False, а строка чистится.
После WriteStr() организуется цикл ожидания, в нем проверяется значение логической переменной, и если оно True, значит модем ответил.

Следует учитывать, что для некоторых команд модем сперва возвращает OK, а лишь затем - данные (при этом окончание данных можно определить только выждав определенный таймаут).
Кроме того, в модеме может быть включенным, а может быть и выключенным эхо-повтор.


И. Павел   (2010-02-04 15:28:00) [4]


> а как дождаться события OnRxChar?

Добавьте какую-нибудь переменную и ждите ее изменения.


И. Павел   (2010-02-04 15:22:00) [5]

ИМХО удобнее работать через API - запросы/ответы можно будет писать в цепочке. А тут еще для связи между функциями чтения/записи ключи вводить придется... Вам же не нужно рассинхронизировать чтение и запись из порта.


Student :)   (2010-02-04 15:17:00) [6]

а как дождаться события OnRxChar?
через процедуру?

procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
 Str: String;
begin
 ComPort.ReadStr(Str, Count);
showmessage(Str);

end;


Сергей М.   (2010-02-04 15:14:00) [7]


> Student :) ©   (04.02.10 15:06) [7]


Прежде чем отправлять очередную команду из очередного эл-та массива, нужно дождаться ответа на предыдущую, т.е. дождаться события OnRxChar, а м.б. придется ждать не одно события, а несколько, чтобы собрать ожидаемуюстроку ответа, дабы лишь после этого принимать решение о готовности модема к принятию очередной команды.


Virgo_Style   (2010-02-04 15:13:00) [8]


> а мне надо чтоб отправился первый запрос получили ответ


Значит, надо добавить получение ответа после отправки запроса. Логично?


Student :)   (2010-02-04 15:06:00) [9]


procedure TForm1.initClick(Sender: TObject);
VAR
n:integer;
begin
init_Array[0]:='AT';
init_Array[1]:='AT&V';
init_Array[2]:='AT1';
init_Array[3]:='AT2';
For n:=0 to length(init_Array)-1 do
Begin
//    showmessage(init_Array[n]);
ComPort.WriteStr(init_Array[n]+#13#10); // send test command

end;

если так делаю то отправляеться 1 запрос со всем массивом :(
а мне надо чтоб отправился первый запрос получили ответ , потом второй и так далее


Германн   (2010-02-04 01:46:00) [10]


> Student :) ©   (03.02.10 22:48) [4]
>
> могли бы вы написать примерчик цикла по отправке 2 команд?
>
>

Могу. Завтра буду писать. Только не примерчик, а реальную программу. И не 2 команд, а NN команд. Но CPort я не знаю и знать не хочу.


Virgo_Style   (2010-02-03 23:02:00) [11]

Образование, как обычно, высшее


Student :)   (2010-02-03 22:48:00) [12]

могли бы вы написать примерчик цикла по отправке 2 команд?


0x00FF00   (2010-02-03 22:41:00) [13]

Эм... Капитан Очевидность кагбе подсказываэ — в цикле?


Student :)   (2010-02-03 22:28:00) [14]

ответ приходит

procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
 Str: String;
begin
 ComPort.ReadStr(Str, Count);
 showmessage(Str);

end;

а как запросить след команду с массива?


DVM   (2010-02-03 22:24:00) [15]


> как отправить след команду? после ожидания ответа от первой?

ответ модема по первой команде нужен? тогда жди ответа. Вообще всегда логично сначала ответ ждать.


Наверх

Титульная страница Поиск, карта сайта Написать письмо