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
De ahí :
Código Delphi
[-]
var
datos: PChar;
....
begin
....
datos:= Data;
También modifiqué la formula para obtener los datos.
Código Delphi
[-]
FVelViento = WordToFloat(Data[3] * 16 + Data[4]);
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 ';
if (datos[1] <> #18) then Exit else s:= s + ' WST ';
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])*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;
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.