Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1264935712
Of land
2010-01-31 14:01
2010.04.04
Как защитить таблицу паролем


2-1264604465
s_t_d
2010-01-27 18:01
2010.04.04
Delphi-MSWord, как получить "разрыв" страницы?


2-1265199301
12
2010-02-03 15:15
2010.04.04
Перестал вызываться метод DrawDataCell TDBGrida.


15-1262972486
soldier
2010-01-08 20:41
2010.04.04
Чем снять образ компьютера, чтобы потом его развернуть на VMWare


2-1264742431
Б
2010-01-29 08:20
2010.04.04
AlphaBlend без TransparentColor.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский