Форум: "Начинающим";
Текущий архив: 2010.04.04;
Скачать: [xml.tar.bz2];
Внизкак отправить запросы модему Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.004 c