Hlavní stránka‎ > ‎

Terminál pro tel. Siemens (Delphi, USB)

- Program Terminál pro Siemens je navržen jako studijní program AT příkazů.
- K vývoji tohoto programu jsem použil informace z webu DH Servis a Doveda.
- Pro připojení telefonu k USB jsem použil převodník (UART/USB) UMS3 od  www.asix.cz.
- Před připojením převodníku UMS3 do zdířky USB v PC nakopírujte potřebné ovladače do složky programu nebo do systémového adresáře Windows v PC.
- Po připojení se UMS3 v PC přihlásí jako další sériový port.
- Nyní zapněte program Terminál pro Siemens.
- Jako indikátor spojení programu Terminál s převodníkem UMS3 slouží LED D1, která v případě spojení začne trvale blikat.
- Jako indikátor spojení telefonu s programem Terminál telefon pípne.
- Pro snadné pochopení fce programu Terminál je tento program vybaven bublinkovou nápovědou.
- Program Terminál je odzkoušen na telefonu M35i.
- Odzkoušený telefon používá 3V komunikační logiku.
- V případě použití 5V komunikační logiky s jiným telefonem, prostudujte návod výrobce UMS3.
 
 
 Program Terminál pro tel. Siemens, výpis programu (Windows) psaneho v Delphi a PDF
 AT příkazů pro Siemens C35i můžete stáhnout zde. 
 
 
Ovladače programu pro tel. Siemens můžete stáhnout zde.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Náhled do výpisu programu:
 
unit Siemens;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, PORTINC, StdCtrls, ExtCtrls, Mask, XPMan, Registry, Spin,
  IAgaloLED;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Timer1: TTimer;
    Button3: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Memo2: TMemo;
    Button4: TButton;
    Button5: TButton;
    CheckBox1: TCheckBox;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    MaskEdit1: TMaskEdit;
    Button9: TButton;
    XPManifest1: TXPManifest;
    Image1: TImage;
    Button11: TButton;
    SpinEdit1: TSpinEdit;
    Label3: TLabel;
    Memo4: TMemo;
    Edit2: TEdit;
    Button13: TButton;
    Memo3: TMemo;
    Label4: TLabel;
    Label5: TLabel;
    Button12: TButton;
    Panel1: TPanel;
    Button2: TButton;
    Edit1: TEdit;
    Button10: TButton;
    Button14: TButton;
    MaskEdit2: TMaskEdit;
    Button15: TButton;
    Button16: TButton;
    ComboBox1: TComboBox;
    Memo5: TMemo;
    Label6: TLabel;
    Label7: TLabel;
    Button17: TButton;
    IAgaloLED1: TIAgaloLED;
    IAgaloLED2: TIAgaloLED;
    Label8: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure Button11Click(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Button13Click(Sender: TObject);
    procedure Memo3Change(Sender: TObject);
    procedure Memo4Change(Sender: TObject);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    procedure Button14Click(Sender: TObject);
    procedure Button15Click(Sender: TObject);
    procedure Button16Click(Sender: TObject);
    procedure Button12Click(Sender: TObject);
    procedure MaskEdit1Click(Sender: TObject);
    procedure Button17Click(Sender: TObject);
  
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  Registr,bit,CSQ,Lab4, Lab5 : String;
  Count,SM,Z,K,CSQi, Mem3, Mem4 :Integer;

implementation
uses Unit2, StrUtils;
{$R *.dfm}
procedure CSQx;
begin
CSQ := '';
   for SM:= 0 to  Form1.Memo1.Lines.Count do
   begin
   CSQ := Concat(CSQ, copy(Form1.Memo1.Lines.Strings[SM],1,1));
   end;
end;
 
function  BinToDec(Bits: String):Integer;
var
moc, x: Integer;
begin
x := 0;
moc := 1;
  for SM := 1 to 8 do
  begin
   if sm = 2 then moc := 2 else
   if sm = 3 then moc := 4 else
   if sm = 4 then moc := 8 else
   if sm = 5 then moc := 16 else
   if sm = 6 then moc := 32 else
   if sm = 7 then moc := 64 else
   if sm = 8 then moc := 128 else;
   x := ((StrToInt(Bits[9 - (SM)])) * moc) + x;
   end;
   Result := x;
end;

function HexToDec(Text:Char): Integer;
  //Text = převáděný jeden znak (malý).
  //Výsledek je integer.
const
  Convert: array['0'..'f'] of Integer =
    ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
     -1,10,11,12,13,14,15);
begin
    if not (Text in ['0'..'f']) then ShowMessage('Chyba convert HexToDec');
    Result := (Convert[Text] ) ;
end;
 

function DecToBin(Value:Extended; PocBit: Integer):String;
  //Value = převáděný bajt [DEC], PocBit = na kolik znaků má být výsledek, př: Value := 255 potom  PocBit := 8(minimálně).
//DecToBin :=  výsledek je řetězec ‚String'
var
Hodnota :String;
carka,PocZnak, SM: integer;
Label SMDec;
begin
Result := '';
SMDec:
Value := Value / 2 ;
carka := Pos(',',FloatToStr(Value));
 if carka > 0 then   Result := Concat('1',Result) else Result := Concat('0',Result) ;
 Hodnota := FloatToStr(Value);
 Delete(Hodnota,carka,10);
 Value := StrToInt(Hodnota);
 if Value > 0 then goto SMDec;
 PocZnak := Length(Result);
 PocZnak := PocBit -PocZnak;
 if PocZnak > 0 then
  begin
  for sm := 1 to PocZnak do begin
  Result := Concat('0',Result) ;
  end;
 end;
end;
 
 
 
procedure SMStoPDU;
var
SMa, SMn, MLI : Integer;
begin
SMa := 1;
MLI := 0;
for SMn := 1 to  Form1.Edit2.GetTextLen +1 do
 begin
 Form1.Memo3.Lines.Add(DecToBin(Ord(Form1.Edit2.Text[SMn]),7));
 if SMn >= 2 then
   begin
   if SMa =  8 then MLI := MLI +1 else
   Form1.Memo4.Lines.Insert((SMn -2)- MLI,(concat(Copy(Form1.Memo3.Lines[SMn-1],(8-(SMa)),(1+(SMa-1))), Copy(Form1.Memo3.Lines[SMn-2],(1-(SMa+1)),(8-(SMa))) )));
   if SMa = 8 then SMa:= 1 else Inc(SMa);
   end;
  end;
end;
 

procedure PDUtoSMS ;
var
SMn1,BinLop :Integer;
Binar1: String;
begin
  BinLop := 1;
  for SMn1 := 0 to Form1.Memo4.Lines.Count -1 do
  begin
  Inc(BinLop);
  if (SMn1 - 1) >= 0 then  Binar1 := Form1.Memo4.Lines[SMn1 - 1] else Binar1 := '';
  Form1.Memo3.Lines.Add  (concat ('0', Copy(Form1.Memo4.Lines[SMn1],BinLop,((Binlop -9) *(-1)) ), Copy(Binar1,1 ,(BinLop - 2) )));
    if BinLop = 8 then
    begin
    Inc(BinLop);
    if (SMn1+1 - 1) >= 0 then  Binar1 := Form1.Memo4.Lines[SMn1+1 - 1] else Binar1 := '';
    Form1.Memo3.Lines.Add  (concat ('0', Copy(Form1.Memo4.Lines[SMn1+1],BinLop,((Binlop -9) *(-1)) ), Copy(Binar1,1 ,(BinLop - 2) )));
    BinLop := 1;
    end;
  end;
end;
 
function KrossTel: String;
var
s, s1 : String;
begin
Form1.MaskEdit1.Text := Trim(Form1.MaskEdit1.Text);
for SM :=1 to Length(Form1.MaskEdit1.text)do
 begin
 s := Copy(Form1.MaskEdit1.text,(SM*2),1);
 s1 := Copy(Form1.MaskEdit1.text,((SM*2)-1),1);
 if s = ' ' then s := '';
 if s1 = ' ' then s1 := '';
 result := Concat(result, s, s1);
 end;
end;
 
 
 
procedure Send_Bytes(Value: String; Flg: Boolean);
begin
Form1.Memo2.Clear;
for SM := 1 to Length(VALUE)do
  begin
  SENDBYTE(Ord(Value[SM]));
  Form1.Memo2.Lines.Add(Value[SM]);
  end;
if Flg = True then
  begin
  SENDBYTE(13);
  Form1.Memo2.Lines.Add('CR');
  end;
end;
 
 
procedure Read_Byte;
var
Byt,Ind:Integer;
Label Loop;
begin
Form1.Memo1.Clear;
Ind := 0;
Loop:
Byt := READBYTE;
if byt >= 0 then
   begin
   if Byt = 13 then   Form1.Memo1.Lines.Add('CR (13)');
   if Byt = 10 then   Form1.Memo1.Lines.Add('LF (10)');
   if Byt >=32 then   Form1.Memo1.Lines.Add(Char(Byt)+ ' ('+(IntToStr(Byt))+ ')' );
   goto Loop;
   end
   else begin
   inc(Ind);
   if Ind = 5 then exit else goto Loop;
  end;
end;
 
 
procedure TForm1.Button2Click(Sender: TObject);
begin
Registr := Edit1.Text;
OpenCom(pchar(Registr +'19200,N,8,1'));
RTS(1);
Timer1.Enabled := True;
end;
 
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Count = 0 then count:= 1 else count:= 0  ;
if Count = 1 then
  begin
   RTS(0);
   IAgaloLED1.LedOn := true;
   IAgaloLED2.LedOn := true;
    end else
     begin
      RTS(1);
      IAgaloLED1.LedOn := false;
      IAgaloLED2.LedOn := false;
      end;
   end;
 
 
procedure TForm1.FormCreate(Sender: TObject);
begin
Count := 0;
Button10.Click;
Button12.Caption := ('AT+CMGL -- SMS číst.') + #13+' ' + #13+' ';
Label4.Caption := ('SMStoBin'+ #13 + IntToStr(Memo3.Lines.Count ) + '  znaků' );
Label5.Caption := ('BintoPDU'+ #13 + IntToStr(Memo4.Lines.Count ) + ' oktetů');
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Send_Bytes('AT',true);
Read_Byte;
end;
 
 
procedure TForm1.Button3Click(Sender: TObject);
begin
for SM:= 1 to MaskEdit1.GetTextLen do
 begin
 if MaskEdit1.Text[SM] =' ' then
  begin
  ShowMessage('Zadej dvanáctimístné tel. číslo');
  MaskEdit1.SetFocus;
  MaskEdit1.SelStart :=(3);
  exit;
  end;
 end;
Send_Bytes('ATD+'+ MaskEdit1.Text + ';',true);
Read_Byte;
end;
 
 
procedure TForm1.Button4Click(Sender: TObject);
begin
Send_Bytes('ATH',true);
Read_Byte;
end;
 
 
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 if CheckBox1.Checked = true then
  begin
  Button5.Caption := 'ATE1 - Echo';
  bit := '1';
  Button5.Hint := ('Ovládání Echa ( telefon zařadí před odpověď přijatý příkaz)')
  end
  else
   begin
   Button5.Caption := 'ATE0 - Echo';
   bit := '0';
   Button5.Hint := ('Ovládání Echa ( telefon nezařadí před odpověď přijatý příkaz)')
   end;
end;
 
 
procedure TForm1.Button5Click(Sender: TObject);
begin
Send_Bytes('ATE'+ bit,true);
Read_Byte;
end;
 
 
procedure TForm1.Button7Click(Sender: TObject);
begin
Send_Bytes('AT+CGMM',true);
Read_Byte;
  CSQx;
  Z := Pos('L',CSQ) ;
  Delete (CSQ,1,Z);
  K :=  (Pos('C',CSQ) ) -1 ;
 ShowMessage ('Verze telefonu: '+ #13 +(copy (CSQ,0,K)));
end;
 
 
procedure TForm1.Button8Click(Sender: TObject);
begin
Send_Bytes('AT+CBC',true);
Read_Byte;
  Form2.Visible := True;
  Form2.Caption := 'Stav energie';
  Form2.panel1.Visible  := True;
  Form2.Gauge1.MaxValue := 100;
  FOrm2.Timer2.Enabled := True;
   CSQx;
  Z := Pos(':',CSQ) ;
  K :=  (Pos(',',CSQ) - Z) -2 ;
  Z:= Z+2;
  CSQi:= StrToInt(copy (CSQ,Z,K));
  if CSQi = 0 then
    begin
    Form2.Label1.Caption := 'Napájení z baterie.';
    end;
  if CSQi = 1 then
    begin
    Form2.Label1.Caption := 'Napájení externě.';
    end;
   if CSQi = 2 then
    begin
    Form2.Label1.Caption := 'Baterie nepřipojena.';
    end;
    if CSQi = 3 then
    begin
    Form2.Label1.Caption := 'Chyba!';
    end;

  Z := Pos(',',CSQ) ;
  Delete (CSQ,1,Z);
  K :=  (Pos('C',CSQ) ) -1 ;
 CSQi:= StrToInt(copy (CSQ,0,K));
 Form2.Gauge1.Progress := CSQi;
end;
 
 
procedure TForm1.Button6Click(Sender: TObject);
begin
Send_Bytes('AT^SMSO',true);
Read_Byte;
end;
 
 
procedure TForm1.Button10Click(Sender: TObject);
var
Reg: TRegIniFile;
Cnt: Integer;
Lst: TStringList;
TstStr: String;
Label Loop1;
begin
Reg := TregIniFile.Create('');
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.OpenKey ('HARDWARE\DEVICEMAP\SERIALCOMM',False);
Lst := TStringList.Create;
Reg.GetvalueNames(Lst);
 for Cnt := 0 to Lst.Count -1 do
 begin
 Registr := ( Reg.ReadString('', Lst[Cnt], ''));
 Form1.Edit1.Clear;
 Form1.Edit1.Text := Registr;
 OpenCom(pchar(Registr +':19200,N,8,1'));
 DELAY(10);
 Send_Bytes('AT',true);
 TstStr := '';
 Loop1:
 SM := READBYTE;
 if SM > 0 then
  begin
  TstStr :=CONCAT(TstStr,(IntToStr( SM)));
  goto Loop1;
  end;
 if (TstStr = '658413131079751310') or (TstStr = '131079751310') then
  begin
  Button11.Click;
  Form1.Memo1.Clear;
  Form1.Memo2.Clear;
  ShowMessage('Spojeno přes'+ #13 + Registr +': 19200,N,8,1.');
  RTS(1);
  Timer1.Enabled := True;
  exit;
  end;
 end;
Lst.Free;
Reg.Free;
Read_Byte;
Form1.Memo1.Clear;
Form1.Memo2.Clear;
ShowMessage('Nespojeno! (zkontroluj zapojení a zapnutí telefonu)'+#13 ) ;
end;
 
 
procedure TForm1.Button9Click(Sender: TObject);
var
SMb :Integer;
PDUSMS: String;
begin
PDUSMS := '';
Lab4 := 'SMStoBin';
Lab5 := 'BintoPDU';
Label8.Caption  := '>>';
 for SM:= 1 to Form1.MaskEdit1.GetTextLen do
 begin
  if Form1.MaskEdit1.Text[SM] =' ' then
  begin
  ShowMessage('Zadej dvanáctimístné tel. číslo');
  MaskEdit1.SetFocus;
  MaskEdit1.SelStart :=(3);
  exit;
  end;
 end;
Memo3.Clear;
Memo4.Clear;
SMStoPDU;
Send_Bytes('AT+CMGS='+(IntToStr(Memo4.Lines.Count *2) ),true);
Read_Byte;
ShowMessage('AT+CMGS='+ (IntToStr(Memo4.Lines.Count *2) )+' je odesláno');
  for SMb := 0 to Memo4.Lines.Count -1 do
  begin
   if Memo4.Lines.Strings[SMb]  <> '' then
   begin
   PDUSMS:= PDUSMS + (IntToHex(BinToDec(Memo4.Lines.Strings[SMb]),2));
   end;
  end;
 Send_Bytes(('0011000C91') + (KrossTel) + ('0000AA')+ (IntToHex(Edit2.GetTextLen,2 ))+ (PDUSMS),False);
 SENDBYTE(26);
 Form1.Memo2.Lines.Add('SUB');
 SENDBYTE(13);
 Form1.Memo2.Lines.Add('CR');
Read_Byte;
end;
 
 
procedure TForm1.Button11Click(Sender: TObject);
begin
Send_Bytes('AT^SPST='+ IntToStr(SpinEdit1.Value) + ',1',true);
Read_Byte;
end;
 
 
procedure TForm1.Edit2Change(Sender: TObject);
begin
Label3.Caption := IntToStr(160 - Edit2 .GetTextLen )+ ' volných znaků';
  if Edit2.GetTextLen = 0 then
    begin
    Button9.Enabled := False;
    Button13.Enabled := False;
    end
  else
  begin
  Button9.Enabled := True;
  Button13.Enabled := True;
  end;
 if Edit2.GetTextLen = 160 then  beep;
end;
 

procedure TForm1.Button13Click(Sender: TObject);
begin
Send_Bytes(Form1.Edit2.Text,true);
Read_Byte;
end;
 
procedure TForm1.Memo3Change(Sender: TObject);
begin
Label4.Caption := (Lab4 + #13 + IntToStr(Memo3.Lines.Count - Mem3 ) +' znaků' );
end;
procedure TForm1.Memo4Change(Sender: TObject);
begin
Label5.Caption := (Lab5 + #13+ IntToStr(Memo4.Lines.Count - Mem4  ) + ' oktetů' );
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
If not(Key in[#8,#16,#32,#21..#126]) then
 begin
 Key := #0;
 beep;
 end;
end;
 
procedure TForm1.Button14Click(Sender: TObject);
var
PIN : String;
begin
PIN := '';
 for SM:= 1 to  Length(MaskEdit2.Text)    do
 begin
  if  MaskEdit2.Text[1] =' ' then
  begin
  ShowMessage('Zadej PIN SIM karty');
  MaskEdit2.SetFocus;
  MaskEdit2.SelLength :=(0);
  exit;
  end;

 if  MaskEdit2.Text[SM] =' ' then
 begin
 Send_Bytes('AT+CPIN='+ PIN,true);
 Read_Byte;
 exit;
 end;
 PIN := PIN +   MaskEdit2.Text[SM];
 end;
end;
 
procedure TForm1.Button15Click(Sender: TObject);
var
BufS1: String;
begin
  Send_Bytes('AT^SMGO?',true);
  Read_Byte;
 
   CSQx;
  Z := Pos(':',CSQ) ;
  Delete (CSQ,1,Z+1);
  K :=  (Pos(',',CSQ) ) -1 ;
  if (copy (CSQ,K+2,1)) = '0' then  BufS1 := 'Paměť na SIM pro SMS je volná. ';
  if (copy (CSQ,K+2,1)) = '1' then  BufS1 := 'Paměť na SIM pro SMS je plná. ';
  if (copy (CSQ,K+2,1)) = '2' then  BufS1 := 'Paměť na SIM pro SMS je plná, nová zpráva čeká na přijetí v SC. ';
 ShowMessage (BufS1 );
end;
 
procedure TForm1.Button16Click(Sender: TObject);
var
Dny, Mesice, Roky, Hodiny : String;
begin
  Send_Bytes('AT+CCLK?',true);
  Read_Byte;
  CSQx;
  Z := Pos('"',CSQ)+1 ;
  Roky := copy(CSQ,Z,2);
  Mesice:= copy(CSQ,Z+3,2);
  Dny:= copy(CSQ,Z+6,2);
  Hodiny := copy(CSQ,Z +9 ,8);
  ShowMessage(Dny + '.' + Mesice + '.20' + Roky + #13 + Hodiny );
end;
procedure TForm1.Button12Click(Sender: TObject);
var
DVT, SMa, SMb, SMbx: Integer;
TCSCA, TxtSMS,M3, M4 : String;
begin
  M3 := '';
  Mem3 := 0;
  Mem4 := 0;
  Lab4 := 'BintoSMS';
  Lab5 := 'PDUtoBin';
  Label8.Caption  := '<<';
  Memo5.Clear;
  Memo3.Clear;
  Memo4.Clear;
  Send_Bytes('AT+CMGL=' + IntToStr(ComboBox1.ItemIndex),true);
  Read_Byte;
  CSQx;

DVT:= 0;
for SM := 0 to Length(CSQ) do
  begin
  if CSQ[SM] = ':' then Inc(DVT);
  end;

for SM:= 1 to  DVT do
  begin
  Z := Pos(': ',CSQ) ;
  Delete (CSQ,1,Z+1);
  Z := Pos(',',CSQ) ;
  Memo5.Lines.Add('SMS č.: '+ copy (CSQ,1,Z-1) );
  Delete (CSQ,1,Z);
  Z := Pos(',',CSQ) ;
  Memo5.Lines.Add('Typ SMS: ' + ComboBox1.Items[StrToInt(copy (CSQ,1,Z-1))] );
  Delete (CSQ,1,Z);
  Z := Pos(',',CSQ) ;
  Delete (CSQ,1,Z);
  Z := Pos('C',CSQ) ;
  Memo5.Lines.Add('Počet oktetů PDU: '+ copy (CSQ,1,Z-1) );
  Delete (CSQ,1,Z);
  Memo5.Lines.Add('SCA PDU: ' + copy (CSQ,2,54));
  Delete (CSQ,1,1);
  Memo5.Lines.Add('Délka tel. č. SCA (oktetů): '+ copy (CSQ,1,2));
  Delete (CSQ,1,2);
  Memo5.Lines.Add('Formát tel. č. SCA: '+ copy (CSQ,1,2));
  Delete (CSQ,1,2);
  TCSCA := '';
  for SMa :=  1 to 6 do
  begin
  TCSCA := concat (TCSCA, copy(CSQ,2,1), copy (CSQ,1,1));
  Delete (CSQ,1,2);
  end;
  Memo5.Lines.Add('Tel. č. SCA: '+ TCSCA);
  Memo5.Lines.Add('PDU typ: '+ copy (CSQ,1,2));
  Delete (CSQ,1,2);
  Memo5.Lines.Add('Délka tel. č. odesílatele: '+ IntToStr(HexToDec(PansiChar(copy (CSQ,2,2))[0])));
  Delete (CSQ,1,2);
  Memo5.Lines.Add('Formát tel. č. odesílatele: '+ copy (CSQ,1,2));
  Delete (CSQ,1,2);
  TCSCA := '';
  for SMa :=  1 to 6 do
  begin
  TCSCA := concat (TCSCA, copy(CSQ,2,1), copy (CSQ,1,1));
  Delete (CSQ,1,2);
  end;
  Memo5.Lines.Add('Tel. č. odesílatele: '+ TCSCA);
  Memo5.Lines.Add('ID protokolu: '+ copy (CSQ,1,2));
  Delete (CSQ,1,2);
  Memo5.Lines.Add('Nastavení kódování: '+ copy (CSQ,1,2));
  Delete (CSQ,1,2);
 
  TCSCA := '';
  for SMa :=  1 to 3 do
  begin
  TCSCA := concat (TCSCA, copy(CSQ,2,1), copy (CSQ,1,1));
  Delete (CSQ,1,2);
  if SMa <3 then  TCSCA := concat (TCSCA,'.');
  end;
  Memo5.Lines.Add('Datum doručení SMS: 20'+ TCSCA);
  TCSCA := '';
  for SMa :=  1 to 3 do
  begin
  TCSCA := concat (TCSCA, copy(CSQ,2,1), copy (CSQ,1,1));
  Delete (CSQ,1,2);
    if SMa <3 then  TCSCA := concat (TCSCA,':');
  end;
  Memo5.Lines.Add('Čas doručení SMS: '+ TCSCA);
  Memo5.Lines.Add('Časová zóna: '+  concat ( copy(CSQ,2,1), copy (CSQ,1,1)));
  Delete (CSQ,1,2);
   Memo5.Lines.Add('Počet znaků SMS: '+ IntToStr(BinToDec((DecToBin((HexToDec(PAnsiChar(copy (CSQ,1,1))[0])),4))+ (DecToBin((HexToDec(PAnsiChar(copy (CSQ,2,1))[0])),4)) )));

 // Memo5.Lines.Add('Počet znaků SMS: '+ copy (CSQ,1,2));
  Delete (CSQ,1,2);
  K := (Pos('CL',CSQ) ) -1;
  Memo5.Lines.Add('Samotný PDU text SMS: '+ copy (CSQ,1,K));
 
  for SMb := 1 to  K div 2 do
  begin
  SMbx :=  (SMb * 2) - 1;
  Memo4.Lines.Add((DecToBin((HexToDec(PAnsiChar(copy (CSQ,SMbx,1))[0])),4))+ (DecToBin((HexToDec(PAnsiChar(copy (CSQ,SMbx+1,1))[0])),4)) );
  end;
  Delete (CSQ,1,K);
  Inc(Mem3);
  Inc(Mem4);
  PDUtoSMS ;
  TxtSMS := '';
  for SMb := 0 to Memo3.Lines.Count -1 do
  begin
  TxtSMS := concat(TxtSMS, Char(BinToDec(Form1.Memo3.Lines.Strings[SMb])));
  end;
  Memo5.Lines.Add('Text SMS: '+ TxtSMS );
  Memo3.Lines.Add('* * * * * * * *');
  Memo4.Lines.Add('* * * * * * * *');
  M3 := Concat(M3,Memo3.Text);
  M4 := Concat(M4,Memo4.Text);
  Memo3.Clear;
  Memo4.Clear;
  Memo5.Lines.Add('* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ');
  end;
  Memo3.Text := M3;
  Memo4.Text := M4;
end;
 
procedure TForm1.MaskEdit1Click(Sender: TObject);
begin
  MaskEdit1.SetFocus;
  MaskEdit1.SelStart :=(3);
end;
procedure TForm1.Button17Click(Sender: TObject);
begin
  Send_Bytes('AT+CSQ',true);
  Read_Byte;
  Form2.Visible := True;
  Form2.Caption := 'Hladina signálu';
  Form2.Image1.Visible  := True;
  Form2.Gauge1.MaxValue := 31;
  FOrm2.Timer1.Enabled := True;
   CSQx;
  Z := Pos(':',CSQ) ;
  K :=  (Pos(',',CSQ) - Z) -2 ;
  Z:= Z+2;
  CSQi:= StrToInt(copy (CSQ,Z,K));
  if CSQi = 0 then
    begin
    Form2.Label1.Caption := '- 113 dBm a méně';
    Form2.Gauge1.Progress := 0;
    end;
  if CSQi = 1 then
    begin
    Form2.Label1.Caption := '- 111 dBm';
    Form2.Gauge1.Progress := 1;
    end;
   if CSQi = 31 then
    begin
    Form2.Label1.Caption := '- 51 dBm a více';
    Form2.Gauge1.Progress := 31;
    end;
    if CSQi = 99 then
    begin
    Form2.Label1.Caption := 'neznámá hodnota';
    Form2.Gauge1.Progress := 31;
    end;
    if CSQi  in [2..30] then
    begin
    Form2.Label1.Caption := FloatToStr(- 109 + ((CSQi-2) *2) )  + ' dBm';
    Form2.Gauge1.Progress := CSQi;
    end;
end;
 
 
end.