Sériové rozhraní a mobil II (4. díl) - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



Delphi

Sériové rozhraní a mobil II (4. díl)

seriovy port

3. ledna 2002, 00.00 | Pokračování seriálu o komunikaci přes seriový port. Dnes navážeme na minulý článek a ukážeme si vyhodnocování odpovědí z mobilu.

Vyhodnocení odpovědí

Telefon nám většinou odpovídá takto: zadaný příkaz (záleží na příkazu ATE - viz minulý díl), 2 nové řádky, požadovaná data, nový řádek, odpověď (může nabývat několik hodnot - OK = příkaz proveden, ERROR = při provádění se vyskytla chyba atd., viz sada AT příkazů), nový řádek.
Tento způsob odpovědi je pro další zpracování nevhodný, proto musíme oddělit požadovaná data od pomocných. To si ukážeme na příkladu - získávání základních údajů o telefonu a jejich přehledné zobrazení.

Nový příkaz můžeme poslat tehdy, až dostaneme odpověď na předchozí (jinak se nám vrátí chyba). Nemůžeme najednou poslat několik příkazů a postupně čekat na jejich odpovědi. Tento fakt nám trochu ztížil zpracování.

Nejprve se "zbavíme" vracení zadání příkazu (echa) příkazem ATE0 ihned po startu programu (událost OnFormCreate). Telefon je pomalejší než PC, proto zastavíme činnost programu procedurou Sleep na 200 ms (nutno vyzkoušet - pokud nedáme telefonu dostatečný čas na zpracování příkazu, tak se může vrátit jen část dat apod., delší doba je lepší, ale nepotěšíme tím uživatele), aby měl telefon čas na zpracování.

procedure TForm1.FormCreate(Sender: TObject);
begin
  typ:=1; //identifikátor zpracování
  VaComm1.WriteText('ATE0'+#13); //bez echa
  Sleep(200); //čas na zpracování v mobilu
end;

Nyní čekáme na odpověď. Jakmile telefon pošle data, vyvolá se událost VaComm1RxChar. Zde přečteme data a upravíme je k dalšímu zpracování.

procedure TForm1.VaComm1RxChar(Sender: TObject; Count: Integer);
var
  i:integer;
begin
  s:=VaComm1.ReadText; //čtení textu z portu
  repeat
    i:=pos(#13#10,s); //odstranění znaků CRLF (#13#10)
    Delete(s,i,2);
  until i=0;
  Delete(s,pos('OK',s),2); //ostranění odpovědi OK
  if pos('ERROR',s) <> 0 then ShowMessage('Chyba'); // chyba
  Dalsi; //dalsi zpracovani
end;

V proceduře Dalsi ukládáme podle typu AT příkazu (proměnná typ, která se mění při každém zadání AT příkazu) data do labelů a posíláme nový AT příkaz.

procedure TForm1.Dalsi;
begin
  case typ of
    1:VaComm1.WriteText('AT+CGMI'+#13); //dotaz na výrobce AT příkazem
    2:begin
        Label1.Caption:='Typ mobilu: '+s;
        VaComm1.WriteText('AT+CGMM'+#13); //dotaz na typ AT příkazem
      end;
    3:begin
        Label1.Caption:=Label1.caption+' '+s;
        VaComm1.WriteText('AT+CGMR'+#13); //dotaz na verzi AT příkazem
      end;
    4:begin
        Label2.Caption:=Label2.Caption+s;
        VaComm1.WriteText('AT+CGSN'+#13); //dotaz na IMEI AT příkazem
      end;
    5:begin
        Label3.Caption:=Label3.Caption+s;
        VaComm1.WriteText('AT^SCID'+#13); //dotaz na číslo SIM AT příkazem
      end;
    6:begin
        Delete(s,Pos('^SCID:',s),6); //odstranění znaků ^SCID: z čísla SIM
        Label5.Caption:=Label5.Caption+s;
      end;
  end;
  Inc(typ);
  Sleep(200); //čas na zpracování v mobilu
end;

Uvedený příklad byl testovány na 2 Siemensech C35i bez problémů. Zde je k stažení jako projekt v Delphi.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: