Ver Mensaje Individual
  #3  
Antiguo 10-11-2012
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Reputación: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
yevabas,

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  function HexToInt(NumHex: String): Int64;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Convierte números Hexadecimales a Decimales
function HexToInt(NumHex: String): Int64;
var
  i, j : Integer;
  Hex : String;

  AuxStr : String;
  NumDec: Int64;

  PowerHex: Int64;
  AuxPower : Extended;

begin

   NumDec := 0;
   j := Length(NumHex);

   for i := j downto 1 do
   begin

      AuxPower := Power(16,j-i);
      AuxStr := FloatToStr(AuxPower);
      PowerHex := StrToInt(AuxStr);

      Hex := NumHex[i];

      if (Hex ='A') then Hex := '10';
      if (Hex ='B') then Hex := '11';
      if (Hex ='C') then Hex := '12';
      if (Hex ='D') then Hex := '13';
      if (Hex ='E') then Hex := '14';
      if (Hex ='F') then Hex := '15';

      NumDec := NumDec + StrToInt(Hex) * PowerHex;

   end;

   Result := NumDec;

end;

// Versión 1:
// Recibe Datos Hex de un Puerto Serial en modo Byte y los muestra en Hex en un Control TMemo
// Se asume que los Datos Hex son enviados al Puerto Serial en su representación Decimal para su
// posterior procesamiento.
procedure TForm1.Button1Click(Sender: TObject);
var
   BufferPort : Array[1..80] of Byte; // Asume para la prueba que se reciben 80 Bytes del Puerto Serial
   i : Integer;
   DataPort : String;

begin

   // Inicializa BufferPort antes de recibir datos del Puerto Serial
   FillChar(BufferPort, Sizeof(BufferPort), 0);

   // Simula recibir datos del Puerto Serial a BufferPort iniciando en AA = 170
   for i:= 1 to 80 do
   begin
      BufferPort[i] := 169 + i;
   end;

   // Recorre BufferPort y almacena los datos en DataPort
   for i:= 1 to 80 do
   begin
      // Los Datos de BufferPort son convertidos a Hexadecinales de longitud 2
      DataPort := DataPort + IntToHex(BufferPort[i],2);
   end;

   // Almacena los datos del Puerto Serial en un Control TMemo
   Memo1.Lines.Add(DataPort);

end;

// Versión 2:
// Recibe Datos Hex de un Puerto Serial en modo Char y los muestra en Hex en un Control TMemo
// Se asume que se requiere la representación Decimal de los Datos Hex para su posterior
// Procesamiento
procedure TForm1.Button2Click(Sender: TObject);
var
   BufferPort : Array[1..80] of Byte; // Asume para la prueba que se reciben 80 Bytes del Puerto Serial
   i, j : Integer;
   DataPort : String;
   SerialPort : String;
   NumHex : String;

begin

   // Inicializa BufferPort antes de recibir datos del Puerto Serial
   FillChar(BufferPort, Sizeof(BufferPort), 0);

   // Simula recibir datos del Puerto Serial a SerialPort
   Serialport := '010203040506070809AABBCCDDEEFF';

   // Extrae los datos simulados del Puerto Serial a BufferPort
   j := 1;
   for i:= 1 to Length(SerialPort) do
   begin
      if (i Mod 2 <> 0) then
      begin
         NumHex := Copy(SerialPort,i,2);
         BufferPort[j] := HexToInt(NumHex);
         Inc(j);
      end;
   end;

   // Recorre BufferPort y almacena los datos en DataPort
   for i:= 1 to 80 do
   begin
      // Los Datos de BufferPort son convertidos a Hexadecinales de longitud 2
      DataPort := DataPort + IntToHex(BufferPort[i],2);
   end;

   // Almacena los datos del Puerto Serial en un Control TMemo
   Memo1.Lines.Add(DataPort);

end;

// Versión 3:
// Recibe Datos Hex de un Puerto Serial en modo Char y los muestra en Hex en un Control TMemo
// Esta es una versón reducida de la anterior en la cual se asume que no se requiere la
// representación Decimal de los Datos Hex obtenidos del Puerto Serial.
procedure TForm1.Button3Click(Sender: TObject);
var
   i : Integer;
   DataPort : String;
   SerialPort : String;
   NumHex : String;

begin

   // Simula recibir datos del Puerto Serial a SerialPort
   Serialport := '010203040506070809AABBCCDDEEFF';

   // Extrae los datos simulados del Puerto Serial a DataPort
   for i:= 1 to Length(SerialPort) do
   begin
      if (i Mod 2 <> 0) then
      begin
         NumHex := Copy(SerialPort,i,2);
         DataPort := DataPort + NumHex;
      end;
   end;

   // Almacena los datos del Puerto Serial en un Control TMemo
   Memo1.Lines.Add(DataPort);

end;

end.
El código anterior muestra tres versiones que simulan recibir datos Hexadecimales de un Puerto Serial y visualizan la data recibida en un Control TMemo, quizás alguna versión se adapte a tu proyecto.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 10-11-2012 a las 22:27:03.
Responder Con Cita