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

Вниз

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

 
Pavel   (2010-02-03 22:12) [0]

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

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

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

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


 
DVM ©   (2010-02-03 22:24) [1]


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

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


 
Student :) ©   (2010-02-03 22:28) [2]

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

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

end;

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


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

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


 
Student :) ©   (2010-02-03 22:48) [4]

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


 
Virgo_Style ©   (2010-02-03 23:02) [5]

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


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


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

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


 
Student :) ©   (2010-02-04 15:06) [7]


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 запрос со всем массивом :(
а мне надо чтоб отправился первый запрос получили ответ , потом второй и так далее


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


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


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


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


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


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


 
Student :) ©   (2010-02-04 15:17) [10]

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

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

end;


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

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


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


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

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


 
Loginov Dmitry ©   (2010-02-04 22:48) [13]


> а как дождаться события 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-05 01:41) [14]


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

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


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


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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.019 c
15-1263435454
brother
2010-01-14 05:17
2010.04.04
Уникальность окна


4-1232355520
Vemer
2009-01-19 11:58
2010.04.04
Определение фокуса на главном окне Windows?


2-1265108213
бегинер
2010-02-02 13:56
2010.04.04
Нет перегруженной функции с такими параметрами


2-1265019868
Unior
2010-02-01 13:24
2010.04.04
Как открыть запароленный *.mdb в Access?


2-1262824902
kyran29
2010-01-07 03:41
2010.04.04
Отправка файла на e-mail