Hola amigos , en este hilo , logramos descifrar leer los datos que mandaba un GPS.
delphi
procedure TForm3.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); var i, j: Integer; texto, gprmc, campos, checksum: String; atComm:string; begin atComm := 'AT$EVTEST';/// comando AT ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, ToBytes( atComm)); // Comprobamos la cabecera (recuerda que los bytes estan invertidos en los integer) if (Length(AData) > 4) and (PInteger(@AData[0])^ = $00020400) then begin texto:= Copy(PAnsiChar(@AData[4]), 1, Length(AData) - 4); Memo1.Lines.Add(texto); i:= Pos('$GPRMC', texto); if (i > 0) then begin j:= Pos(#13#10, texto, i); if (j > 0) then begin // Tenemos la cadena que nos interesa gprmc:= Copy(texto, i, j - i); i:= Pos('*', gprmc); if i > 0 then begin // Separamos la suma de comprobacion del resto de la cadena campos:= Copy(gprmc, 2, i-2); checksum:= Copy(gprmc, i+1, 2); // Comprobamos la suma de comprobacion if calcChecksum(campos) = StrToInt('$'+checksum) then begin // Separamos los campos with TStringList.Create do try StrictDelimiter:= TRUE; Delimiter:= ','; DelimitedText:= campos; // Por ejemplo la latitud seria //Memo1.Lines.Add(Strings[3]); finally Free; end; end; end; end; end; end; end;
sin respuesta,
despues probe esto:
delphi
procedure TForm3.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); var i, j: Integer; texto, gprmc, campos, checksum: String; atComm:string; begin atComm := 'AT&V'; ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, ToBytes( atComm)); texto:= Copy(PAnsiChar(@AData[4]), 1, Length(AData) - 4); Memo1.Lines.Add(texto); end;
obtengo respuesta , pero ademas de la transmision, muchos espacios en blanco...
que puedo hacer para descifrar todo el contenido del "AData: TIdBytes" a texto?
Saludos!
Update:
He logrado hacer esto:
delphi
function HexToAsc(strData:string): string; var sresult:string; sfinal:string; hexc:cardinal; i:integer; Car: string; begin i:=1; while i<=length(strData) do begin Car := copy(strData,i,2); if Car <> '00' then begin hexc := strtoint('$' + Car); sresult := inttostr(hexc); sresult := chr(strtoint(sresult)); sfinal := sfinal + sresult; end; i:=i+2; end; result := sfinal end; procedure TForm3.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); var i, j: Integer; texto, gprmc, campos, checksum: String; atComm:string; begin atComm := '<0><1><4><0>AT+CGSN<13>'; ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, ToBytes( atComm)); texto := ToHex(AData); texto := HexToAsc(texto); Memo1.Lines.Add(texto); end;
resultado:
delphi
2 5000 $GPRMC,212950.00,A,1529.161133,N,08759.134766,W,0.0,0.0,160418,1.6,W,A*3F 538605 <0 <----- respuesta???
parece que necesito pulir la funcion HexToAsc, en fin. me hechan un mano?