AT команди.

Тема в разделе "WASM.ELECTRONICS", создана пользователем XshStasX, 6 янв 2009.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Как узнать что ответ на АТ команду модему закончился...тоесть у меня идет в цикле опрос модема на поступления нових символов, если такие есть они записываться в буфер. а в условии выхода из цикла идет функции которая смотрит есть ли признак конца ответа на команду...до этого я делал так все до етого ответы на команды всегда кончались такими вариантами слов:OK, ERROR, NO ANSWER. и были всегда с начала новой строки.
    в итоге так решил организовать процедуру чтения ответа от модема:
    Код (Text):
    1. FUNCTION STOP_READ(var p:pointer):BOOL;
    2. const
    3.  END_ANSWER_COUNT = 3;
    4.  END_ANSWER :array[1..END_ANSWER_COUNT] of string =('OK','ERROR','NO ANSWER');
    5. var
    6.  Telephon:^TTelephon;
    7.  I,j:byte;
    8.  s:string;
    9. begin
    10.  Telephon:=p;
    11.  Result:=false;
    12. For I:=1 to Telephon.datatel.RecvCount do
    13.  if Telephon.datatel.RecvData[i]=#10 then
    14.   begin
    15.    s:=copy(Telephon.datatel.RecvData,i+1,Telephon.datatel.RecvCount);
    16.    s:=Trim(s);
    17.     For J:=1 to END_ANSWER_COUNT do
    18.      if s=END_ANSWER[j] then
    19.       Result:=true;
    20.    if Result then exit;
    21.   end;
    22. end;
    23.  
    24. procedure read_to_tel(var p:pointer);
    25. var
    26.  Telephon:^TTelephon;
    27.  ch:string;
    28.  count:DWORD;
    29. begin
    30. count:=0;
    31. Telephon:=p;
    32. Telephon.datatel.RecvData:='';
    33. repeat
    34.  sleep(100);
    35. ch:=#0;
    36. ReadFile(Telephon.setting.Htel,ch[1],length(ch),count,nil);
    37. if count>0 then
    38.  begin
    39.   Telephon.datatel.RecvData:=(Telephon.datatel.RecvData+ch);
    40.   Telephon.datatel.RecvCount:=LENGTH(Telephon.datatel.RecvData);
    41.  end;
    42. until STOP_READ(p);  
    43. end;
    но проблема возникла в том что: встретил я такой из возможних вариантов ответа на команду:+CME ERROR: 3 ...тоесть в случаи если мне такое ответит модем выход из цикла считывания не произойдет...а ответ то мы получили....думал это ответ тож вложить к списку, но что-то мне кажеться что ответов других которые приведут к зацикливанию считывания моей процедуры будет очень много...
    Теперь вопрос: как можна более точно узнать что нам уже полностью ответил модем ев команду и как можна быстрей что это узнать...есть еще какието более точные варианты кроме как делать просто задержу на 1-2сек перед чтением?