Ver Mensaje Individual
  #5  
Antiguo 26-02-2008
jplj jplj is offline
Miembro
 
Registrado: oct 2003
Posts: 189
Reputación: 23
jplj Va por buen camino
Hola:

En la línea que indica Crandel he hecho el procedimiento que listo más abajo. La salida del procedimiento también la listo a continuación.

He hecho algunas modificaciones:

En :
Código Delphi [-]
if (Data[0] <> 85) then Exit;

Se producía un error al compilar
Cita:
Array type required
De ahí :

Código Delphi [-]
var
   datos: PChar;
....
begin
....
   datos:= Data;

También modifiqué la formula para obtener los datos.

Código Delphi [-]
  // La que propone Crandel:
  FVelViento = WordToFloat(Data[3] * 16 + Data[4]);

  // La que he hecho:
   FVelViento:= ((Ord(datos[ 3])*256) + Ord(datos[ 4]))/16;

Creo que los datos que obtengo son correctos, tengo que contrastarlos con los de otra estación meteorológica para verlo.
Agradecería que me dijerais si encontráis algún error.

Si todo fuera correcto, me quedan dos preguntas:

1.- Determinar el resultado de la autoverificación:
A la luz de los resultado que obtengo para el 2 byte, cualquier valor diferente a 255 indicaría un error. Pero quería saber cómo puedo determinar cuál es en base a la tabla de auto-test.

2.- Control de validación "Checksum".
¿Cómo implemento en pascal la verificación del paquete?


Código Delphi [-]

procedure TForm1.ApdDataPacket1Packet(Sender: TObject; Data: Pointer;
  Size: Integer);
var
   datos: PChar;
   s: string;
   FVelViento: Double;
   FDirViento: Double;
   FTempAire : Double;
   FPresion  : Double;
   FHumRelat : Double;
   FPuntRocio: Double;
   FAzi_Nort : Double;

begin

   datos:= Data;
  if (datos[0] <> #85) then Exit else s:= 'Inicio ';
  // verifico que sean los datos de compatible al modelo que tengo
  if (datos[1] <> #18) then Exit else s:= s + ' WST ';

  // Verifico que los datos sean validos
  s:= s + #13#10 + 'byte nº  2: ' +IntToStr(Ord(datos[2]));

  s:= s + #13#10 + 'byte nº  3: ' +IntToStr(Ord(datos[3]));
  s:= s + #13#10 + 'byte nº  4: ' +IntToStr(Ord(datos[4]));
  s:= s + #13#10 + 'byte nº  5: ' +IntToStr(Ord(datos[5]));
  s:= s + #13#10 + 'byte nº  6: ' +IntToStr(Ord(datos[6]));
  s:= s + #13#10 + 'byte nº  7: ' +IntToStr(Ord(datos[7]));
  s:= s + #13#10 + 'byte nº  8: ' +IntToStr(Ord(datos[8]));
  s:= s + #13#10 + 'byte nº  9: ' +IntToStr(Ord(datos[9]));
  s:= s + #13#10 + 'byte nº 10: ' +IntToStr(Ord(datos[10]));
  s:= s + #13#10 + 'byte nº 11: ' +IntToStr(Ord(datos[11]));
  s:= s + #13#10 + 'byte nº 12: ' +IntToStr(Ord(datos[12]));
  s:= s + #13#10 + 'byte nº 13: ' +IntToStr(Ord(datos[13]));
  s:= s + #13#10 + 'byte nº 14: ' +IntToStr(Ord(datos[14]));
  s:= s + #13#10 + 'byte nº 15: ' +IntToStr(Ord(datos[15]));
  s:= s + #13#10 + 'byte nº 16: ' +IntToStr(Ord(datos[16]));
  s:= s + #13#10 + 'byte nº 17: ' +IntToStr(Ord(datos[17]));
  s:= s + #13#10 + 'byte nº 18: ' +IntToStr(Ord(datos[18]));
  s:= s + #13#10 + 'byte nº 19: ' +IntToStr(Ord(datos[19]));
  s:= s + #13#10 + 'byte nº 20: ' +IntToStr(Ord(datos[20]));

//  FVelViento:= (Ord(datos[3]) * 16 + Ord(datos[4]));

   FVelViento:= ((Ord(datos[ 3])*256) + Ord(datos[ 4]))/16;
   FDirViento:= ((Ord(datos[ 5])*256) + Ord(datos[ 6]))/16;
   FTempAire := ((Ord(datos[ 7])*256) + Ord(datos[ 8]))/16;
   FPresion  := ((Ord(datos[ 9])*256) + Ord(datos[10]))/16;
   FHumRelat := ((Ord(datos[11])*256) + Ord(datos[12]))/16;
   FPuntRocio:= ((Ord(datos[13])*256) + Ord(datos[14]))/16;
   FAzi_Nort := ((Ord(datos[15])*256) + Ord(datos[16]))/16;

{  if (Ord(datos[2]) <> 1) then Exit else s:= s + IntToStr(Ord(datos[2]));;
  // Vel veinto
  FVelViento = WordToFloat(Data[3] * 16 + Data[4]);
 ....}

   Memo1.Lines.Add('Paquete: '+s);
   Memo1.Lines.Add('Velocidad Viento   : '+ FloatToStr(FVelViento));
   Memo1.Lines.Add('Dirección Viento   : '+ FloatToStr(FDirViento));
   Memo1.Lines.Add('Temperatura        : '+ FloatToStr(FTempAire));
   Memo1.Lines.Add('Presión            : '+ FloatToStr(FPresion));
   Memo1.Lines.Add('Humedad relativa   : '+ FloatToStr(FHumRelat));
   Memo1.Lines.Add('Punto Rocio        : '+ FloatToStr(FPuntRocio));
   Memo1.Lines.Add('Angulo Azimut-Norte: '+ FloatToStr(FAzi_Nort));


   Memo1.Lines.Add('-------------------------------------------------');

end;


Cita:
Salida del procedimiento:
Paquete: Inicio WST
byte nº 2: 255
byte nº 3: 0
byte nº 4: 3
byte nº 5: 19
byte nº 6: 95
byte nº 7: 1
byte nº 8: 132
byte nº 9: 62
byte nº 10: 94
byte nº 11: 3
byte nº 12: 51
byte nº 13: 0
byte nº 14: 215
byte nº 15: 9
byte nº 16: 97
byte nº 17: 0
byte nº 18: 66
byte nº 19: 223
byte nº 20: 1
Velocidad Viento : 0,1875
Dirección Viento : 309,9375
Temperatura : 24,25
Presión : 997,875
Humedad relativa : 51,1875
Punto Rocio : 13,4375
Angulo Azimut-Norte: 150,0625
-------------------------------------------------
Nuevamente muchas gracias por el tiempo que me dedicáis.
Un Saludo
Juan Pedro.
__________________
Sonríe. Mañana puede ser peor.
Responder Con Cita