TODOPIC

Lenguajes de programación para PC => Delphi => Mensaje iniciado por: ASTROCAR en 13 de Diciembre de 2008, 12:44:37

Título: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 13 de Diciembre de 2008, 12:44:37
Hola buenos dias, me estoy iniciando en delphi y estoy haciendo una aplicacion para mostrar las data de un archivoi binario  de eeprom de las serie i2c, es decir estoy haciendo un programador de eeprom i2c y los archivos los voy a manejar en formato binario pero la verdad es que no tengo mucho conocimiento esto en una oportunidad lo hice pero en vb6 y para abrir archivos use open pero por lo que he investigado en delphi no se usa esa sentencia poara abrir archivos secuenciales.

Haa lo otro es que esa data de las eeprom la quiero visualizar en un control stringgrid ya que eso maneja filas y colunmas y asi veo mas semejansa con  la estructura de la data de las eeprom que basicamente esta en ese mismo orden de filas y colunmas.

yo ya logre abrir el cuadro de dialogo para halar la data pero nose como abrirla y mostrar en el control stringgrid

saludos y acepto todo tipo de opiniones a los conocedores de este mundo de programacion delphi.
Atten.
Alexander Santana
Barcelona-Venezuela.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: eto en 15 de Diciembre de 2008, 19:53:37
Hola ASTROCAR, últimamente he trabajado mucho con los stringgrid, y me di un tiempo para hacer un ejemplo espero que te sirva.
Para este ejemplo necesitas colocar en el formulario, un botón (button1), un dialogo abrir (opendialog1), un memo (memo1), y un stringgrid (stringgrid1).
Te adjunto el código fuente junto con un archivo *.HEX para que lo revises y si es lo que necesitas pues bien. Y el código quedaria asi:

Código: [Seleccionar]
procedure TForm1.FormCreate(Sender: TObject);
begin
  memo1.ScrollBars := ssBoth; // COLOCA LAS DOS BARRAS DE DESPLAZAMIENTO
  stringgrid1.ColCount := 5; // INDICA QUE DEBE TENER 5 COLUMNAS
  //CONFIGURACIONES OPCIONALES
  stringgrid1.Options := [goFixedVertLine,goFixedHorzLine,goVertLine,goHorzLine,goRangeSelect,goColSizing];
  stringgrid1.Anchors := [akLeft,akTop,akRight,akBottom];
  memo1.Anchors := [akLeft,akTop,akRight];
end;

Código: [Seleccionar]
procedure TForm1.Button1Click(Sender: TObject);
var
  j: integer;
begin
  { EL PROGRAMA LEE UN ARCHIVO *.HEX DESDE LA UNIDAD C:\
  EL FORMATO DEL ARCHIVO ES EL SIGUIENTE:

  :BBBBBBBB BBBBBBBB BBBBBBBB BBBBBBBB BBBBBBBBBB

  SE VE QUE LA PRIMERA LINEA COMIENZA CON DOS PUNTOS, Y LA ULTIMA FILA TIENE
  10 NUMEROS, Y EL RESTO TIENEN 8 NUMEROS.}
 
  opendialog1.InitialDir := getcurrentdir; //INDICA LA RUTA DEL DIRECTORIO DONDE ESTA EL PROGRAMA
  opendialog1.Filter := 'ARCHIVO HEX|*.hex'; //TIPO DE ARCHIVO QUE VA A ABRIR EL DIALOGO
  if opendialog1.Execute then
  begin
    //LEE EL ARCHIVO Y LO ESCRIBE EN EL MEMO1
    memo1.Lines.LoadFromFile(opendialog1.FileName);

    //CONFIGURA EL NUMERO DE FILAS DEL STRINGGRID1
    stringgrid1.RowCount := memo1.Lines.Count + 1;

    //PARA CADA FILA SE LEE Y SELECCIONA LA PORCION DE TEXTO PARA
    //COLOCARLA EN LAS CELDAS DEL STRINGGRID1
    for j := 0 to stringgrid1.RowCount do
    begin
      stringgrid1.Cells[0,j+1] := ansimidstr(memo1.Lines[j],2,8);
      stringgrid1.Cells[1,j+1] := ansimidstr(memo1.Lines[j],11,8);
      stringgrid1.Cells[2,j+1] := ansimidstr(memo1.Lines[j],20,8);
      stringgrid1.Cells[3,j+1] := ansimidstr(memo1.Lines[j],29,8);
      stringgrid1.Cells[4,j+1] := ansimidstr(memo1.Lines[j],38,10);
    end;

  end;

{
utilizar
USES StrUtils
Delphi syntax:
function AnsiMidStr(const AText: AnsiString; const AStart, ACount: Integer): AnsiString;

}
end;
Suerte.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: droky en 16 de Diciembre de 2008, 00:42:33
Hola,
Si quieres manejar ficheros binarios puros, tienes que usar las funciones blockwrite y blockread para tratarlos como tal.
Un ejemplo con un stringgrid en hexadecimal con las filas para offset y las columnas de direccion al estilo de  WinPic800
El ejemplo lo he hecho solo para 64 bytes, pero es para que veas como se usa.

(http://www.radikaldesig.com/imgs/binfiles.png)

Código: [Seleccionar]
procedure TForm1.FormCreate(Sender: TObject);
begin
stringgrid1.ColCount:= 17;
stringgrid1.RowCount:= 5;
stringgrid1.DefaultColWidth:=32;
stringgrid1.DefaultRowHeight:=16;

stringgrid1.Cells[0,0]:='Offset';
stringgrid1.Cells[1,0]:='0';
stringgrid1.Cells[2,0]:='1';
stringgrid1.Cells[3,0]:='2';
stringgrid1.Cells[4,0]:='3';
stringgrid1.Cells[5,0]:='4';
stringgrid1.Cells[6,0]:='5';
stringgrid1.Cells[7,0]:='6';
stringgrid1.Cells[8,0]:='7';
stringgrid1.Cells[9,0]:='8';
stringgrid1.Cells[10,0]:='9';
stringgrid1.Cells[11,0]:='A';
stringgrid1.Cells[12,0]:='B';
stringgrid1.Cells[13,0]:='C';
stringgrid1.Cells[14,0]:='D';
stringgrid1.Cells[15,0]:='E';
stringgrid1.Cells[16,0]:='F';
stringgrid1.Cells[0,1]:='$00';
stringgrid1.Cells[0,2]:='$10';
stringgrid1.Cells[0,3]:='$20';
stringgrid1.Cells[0,4]:='$30';

// MyHex := inttohex(255,2);
end;

function TForm1.HexToInt(Value: String): Integer;
 begin
   Result := StrToInt('$' + Value);
end;

procedure TForm1.savebin_buttonClick(Sender: TObject);
//Boton Crear fichero Bin con filtro .bin
begin
savedialog1.InitialDir := getcurrentdir;
savedialog1.Filter := 'ARCHIVO BIN|*.bin';
savedialog1.Execute;
if savedialog1.FileName <> '' then savebin(savedialog1.FileName);
end;

Procedure TForm1.Savebin(sFilename : String);
var
  byteArray : array[1..16] of byte;
  I, J, K, dato_bin : Integer;
  hFile : File;
begin

  Assignfile(hFile, sFileName);
  rewrite(hFile, 16);  //Usamos bloques de 16 bytes

  with StringGrid1 do
    for I := 1 to RowCount - 1 do
     begin
       K := 1;
       for J:= 1 to ColCount - 1 do
        begin
           dato_bin:=hextoint(Cells[J,I]);
           bytearray[K]:= dato_bin;  //cargamos 16 bytes en el array
           K:=K+1;
        end;
        blockwrite(hfile,bytearray,1); // Escribe bloque de 16 bytes
  end;
  CloseFile(hFile);
 End;



procedure TForm1.openBinClick(Sender: TObject);
//Boton Guardar fichero Bin con filtro .bin
begin
 opendialog1.InitialDir := getcurrentdir;
 opendialog1.Filter := 'ARCHIVO BIN|*.bin';
 opendialog1.Execute;
 if opendialog1.FileName<>'' then loadbin(opendialog1.FileName);
end;

procedure TForm1.loadbin( Nom_Fichero:string);
var
Fichero:file;
I, J: Integer;
dato_bin : array[1..16] of byte;
begin

  assignfile(fichero, Nom_Fichero);
  reset(fichero,16);  //Cargamos 16 bytes de cada vez ( 1 fila )


  with StringGrid1 do
    for I := 1 to RowCount - 1 do
     begin
       blockread(fichero,dato_bin,1); //Lee 1 bloque de 16 bytes
       for J:= 1 to ColCount - 1 do
        begin
           Cells[J,I]:= inttohex(dato_bin[J],2); //Pone 16 bytes en la fila
        end;
  end;
  closefile(fichero);
  end;


end.


Como puedes ver, hago lectura y escritura del fichero en bloques de 16 bytes porque así cargo por offsets de $10
Te dejo los fuentes y el ejecutable :
Fuentes y ejecutable (http://www.radikaldesig.com/data/filebin.zip)

Salu2
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: eto en 16 de Diciembre de 2008, 00:55:10
Hola droky muy buen ejemplo, no conocía esas funciones (blockread, blockwrite) a mi tambien me va a servir mucho tu ejemplo, pero más adelante con un proyecto que tengo pendiente.  :-/
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 16 de Diciembre de 2008, 05:01:35
oye que buenos ejemplo mejor imposible ya tendre para los dos formatos  bin y hex mi  agradecido y eso era exactamente la informacion que no manejaba en delphi los reviso al detallado y hago mi propio codigo y se los muestro aunque les digo que ya llevos mis avances.

Saludos y Nuevamentes gracias por su tiempo y valiosa colaboracion prestada.
Atten.
Alexander Santana.
Barcelona-Venezuela.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 25 de Diciembre de 2008, 17:31:17
Hola antes que todo Feliz Navidad y que el niño dios le respare todos los exitos posible y lo mejor salud  para todos los seres vivientes. Ahora paso a el tema en un principio inicie este post con el fin de manipular ficheron bin en un control Stringgrid pero por recomendaciones de un colega de este mismo foro empecea trabajar e investigar sobre el componente MPHexEditor que no es mas que un editor hexadecimal muy potente y aca les muestro los avance de el desarrollo de mi aplicacion el cual esta muy bueno aunque aun le falta y acepto todo tipo de recomendaciones.

En estos momentos estoy investigando varios puntos entre ellos con abrir ficheron con el formato intel hex lo otro es que una ves teniendo abierto un fichero en el formato que sea como hacer swap en el componente MPHexEditor.

Saludos y aca les subo una imagen y el ejecutable de como esta quedando mi aplicacion.
Atten.
Alexander santana.
Barcelona-Venezuela.
(http://img155.imageshack.us/img155/7711/eepromfe3.jpg)
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: droky en 26 de Diciembre de 2008, 08:48:34
Hola Astrocar,
Muy interesante este componente para un editor Hex.
HAcer un swap, ¿te refieres a cada byte del fichero? es decir si tienes en $0001 un byte de valor $FE, hacerle un swap y convertir el valor en $EF ¿no?
En ese caso lo más sencillo es coger el valor, convertirlo a string, cambiar de posición los dos caracteres y convertirlo al formato de origen en el componente (integer o hex). En caso de un swap a todo el bin, usar un bucle con un contador bidimensional tipo contador[i,j]

Te está quedando muy bien la aplicación. Ya nosmostrarás algo del programador   :)
Salu2
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 26 de Diciembre de 2008, 15:28:08
Hola Astrocar,
Muy interesante este componente para un editor Hex.
HAcer un swap, ¿te refieres a cada byte del fichero? es decir si tienes en $0001 un byte de valor $FE, hacerle un swap y convertir el valor en $EF ¿no?
En ese caso lo más sencillo es coger el valor, convertirlo a string, cambiar de posición los dos caracteres y convertirlo al formato de origen en el componente (integer o hex). En caso de un swap a todo el bin, usar un bucle con un contador bidimensional tipo contador[i,j]

Te está quedando muy bien la aplicación. Ya nosmostrarás algo del programador   :)
Salu2

Hola gracias por su comentario y en cuanto al swap si me refiero hacerlo a todo el fichero o en su defecto selecionar una parte del fichero y hacerle swap y el swap es algo como usted mismo mensiono pero no a un byte sino a  dos byte de la data ejemplo ff ee al hacerle swap quedaria de la siquiente manera ee ff.

Saludos y nuevamente gracias por dar su opinion y estar al pendiente de este post.
Atten.
Alexander Santana.
Barcelona-Venezuela.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 03 de Enero de 2009, 00:24:37
Buenas noches aca subo nuevamente el desarrollo de la aplicacion ya con el problema de swap resuelto y una que otras funciones para manipular la data que se carga en el componente.
Ahora el tema siguiente por atacar es el formato intel si tienes recomendaciones en cuando a dicho formato en delphi y presentarlo en el componente que estoy operando seria de gran ayuda.

Saludos y aca le subo como llevo la aplicacion.
Atten.
Alexander Santana.
Venezuela-Barcelona.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: droky en 03 de Enero de 2009, 09:26:58
Hola Alexander,
A ver si puedo ayudarte,
    
Formato general de un fichero en formato Intel HEX (8 bit)
Consta de sucesivos RECORDs (líneas a partir de ahora) que almacenan datos e información de como y donde van esos datos.
Cada línea comienza con un RECORD MARK que es un campo conteniendo 03AH, el código ASCII de los dospuntos (colon ) (’ : ’) .

Cada línea tirne un campo RECLEN que especifica el número de bytes de información o datosque siguen al campo RECTYPE (tipo de registro, o tipo de información contenida en la línea). Cada byte de datos se representa con dos caracteres ASCII y el valor máximo de RECLEN es de 255 o 'FF'.

Cada línea tiene un campo OFFSET (Load OFFSET) o dirección (ADDRESS) que especifica la dirección de 16 bit donde comienzan los datos que contiene la línea. Esto si la línea contiene datos, en caso de que no los contenga y contenga otros campos informativos entonces tiene que tener el valor '0000' o '30303030' hexadecimal.

Cada línea tiene un campo RECTYPE que indica el tipo de datos que contiene la línea. Este campo es usado para interpretar el resto de la línea. Los tipos de RECTYPE son:

’00’ Linea conteniendo datos <=Es el que usaremos
’01’ EOF fin de datos <=Tambien lo vamos a usar
’02’ Extended Segment Address Record ->De este pasamos
’03’ Start Segment Address Record ->De este tambien
’04’ Extended Linear Address Record -> Y de este
’05’ Start Linear Address Record -> y de estelo mismo

Cada linea tiene un numero variable de datos que pueden contener cero  o más bytes codificados en pares de dígitos hexadecimales . La interpretación de estos datos se hace según lo que indique el campo RECTYPE.

Cada línea termina con un campo CHECKSUM que contiene la representación hexadecimal en ASCII del complemento a 2 en 8 bits resultante de convertir cada par de códigos ASCII en su correspondiente número hexadecimal desde el campo RECLEN hasta el último byte de datos de la línea.Asímismo la suma de todos los datos de una línea, desde RECLEN e incluyendo el Checksum es igual a cero.

Ejemplo:

:1005AA00000102030405060708090A0B0C0D0E0F88
       ^----- calculo del checksum -----^^^
                                         ||
                              Check sum__|

RECLEN = 0x10 = 16
ADDRESS = 0x05AA
RECTYPE = 00
DATA = 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F
CHKSUM = 0x88 = 256 -sum(0x00+..+0x0F)= 256- 0x78

Esta podría ser una rutina de lectura:

Código: Delphi
  1. type buffer=array of byte;  //Asignamos una matriz dinámica
  2. var HexBuf:buffer;
  3.  
  4. function readline(HexLine:string; var Buf:buffer):integer;
  5. var ADDR,count:integer;
  6.  CHKSUM,SUMLINE,RECLEN,RECTYPE,DATA:byte;
  7.  t:shortstring;
  8. begin
  9.  // Longitud de la matriz (100000) se puede cambiar
  10.  SetLength(HexBuf,100000);
  11.  if HexLine[1]=':' then begin
  12.   t:='$'+copy(HexLine,2,2);   // lee longitud (RECLEN)
  13.   RECLEN:=strtoint(t);
  14.   CHKSUM:=0;
  15.   CHKSUM:=CHKSUM+RECLEN;
  16.   t:='$'+copy(HexLine,4,4); // lee offset
  17.   ADDR:=strtoint(t);
  18.   CHKSUM:=CHKSUM+lo(ADDR)+hi(ADDR);
  19.   t:='$'+copy(HexLine,8,2);
  20.   RECTYPE:=strtoint(t);
  21.   CHKSUM:=CHKSUM+RECTYPE;
  22.   case RECTYPE of
  23.    0:begin             // Bloque de datos
  24.      count:=0;
  25.      while (count < RECLEN) do begin
  26.       t:='$'+copy(HexLine,10+2*count,2);
  27.       DATA:=strtoint(t);
  28.       CHKSUM:=CHKSUM+DATA;
  29.       Buf[ADDR+count]:=DATA;
  30.       inc(count);
  31.      end;
  32.      t:='$'+copy(HexLine,10+2*count,2);
  33.      SUMLINE:=strtoint(t);
  34.      end;
  35.    1:begin                      // EOF o fin de fichero
  36.       t:='$'+copy(HexLine,10,2);
  37.       SUMLINE:=strtoint(t);
  38.       result:=1;
  39.      end;
  40.      else
  41.      begin
  42.         result := -2;  // tipo de record inválido
  43.         exit;
  44.      end;
  45.     end; //fin de bloque case
  46.   // test checksum
  47.   DATA:=SUMLINE+CHKSUM;
  48.   if (DATA<>0) then result:=-3; // checksum error
  49.  end
  50.  else result:=-1; // no hay record
  51. end;


Y un ejemplito de uso:

Código: Delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var Fname,line:string;
  3.     Fp : textfile;
  4.     ErrorCode:integer;
  5. begin
  6.     Fname:='test.hex';
  7.     AssignFile(Fp,Fname); //fichero test.hex
  8.     Reset(Fp);
  9.     while not eof(Fp) do
  10.     begin
  11.       Readln(Fp, line);//lee primera línea del fichero
  12.       ErrorCode := readline(line,HexBuf);
  13.       if (ErrorCode=0) then
  14.       begin
  15.        // Linea leída OK
  16.        // aquí va el código a pegar Hexbuf en tu control
  17.       end
  18.       else
  19.       begin
  20.        // Manejo de errores
  21.        //  0 = No error
  22.        // -1 = Fichero no es Intel Hex
  23.        // -2 = Tipo de record inválido
  24.        // -3 = Checksum error
  25.        break;  // fin loop
  26.       end;
  27.     end;
  28.     CloseFile(Fp);
  29. end;

Esto en cuanto a la lectura, para la escritura, puedes usar esta función:

Código: Delphi
  1. function writeline(ADDR,RECLEN,RECTYPE:integer;
  2.             var buf:buffer):string;
  3. var i:integer;
  4.  CHKSUM:byte;
  5.  
  6. begin
  7.  CHKSUM:=0;
  8.  result:=':'+inttohex(RECLEN,2)+
  9.             inttohex(ADDR,4)+inttohex(RECTYPE,2);
  10.  CHKSUM:=RECLEN+lo(ADDR)+hi(ADDR);
  11.  for i:=0 to RECLEN-1 do begin
  12.   result:=result+inttohex(buf[ADDR+i],2);
  13.   CHKSUM:=CHKSUM+buf[ADDR+i];
  14.  end;
  15.  result:=result+inttohex(256-CHKSUM,2);
  16. end;
  17.  
  18. function write_eof:string;
  19. begin
  20.  result:=':00'+'0000'+'01'+'FF';  // :00000001FF fin de fichero
  21. end;

Y un ejemplo de uso:

Código: Delphi
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. var Fname,line:string;
  3.     Fp : textfile;
  4.     ErrorCode,StartAddr,ByteCnt:integer;
  5.     A_Line,EOF_HEX:string;
  6. begin
  7.  
  8.     StartAddr:=$0000;  //Direccion de inicio 0000
  9.     ByteCnt:=3;    // 3 bytes
  10.     SetLength(HexBufOut,ByteCnt);
  11.     HexBufOut[0]:=$01;
  12.     HexBufOut[1]:=$02;
  13.     HexBufOut[2]:=$03;
  14.  
  15.     Fname:='test1.hex';
  16.     AssignFile(Fp,Fname); //Guarda fichero test1.hex
  17.     Rewrite(Fp);
  18.     // escribe 16 bytes en HexBuf
  19.     A_Line:=writeline(StartAddr,ByteCnt,$00,HexBufOut);  
  20.     EOF_HEX:=':00'+'0000'+'01'+'FF';// escribe EOF del fichero hex
  21.     writeln(Fp,A_Line);
  22.     writeln(Fp,EOF_HEX);
  23.     closefile(Fp); //cierra el fichero
  24. end;

Ahora solo necesitas implementar el poner los datos de Hexbuf a tu control y sacarlos para hexbuf antes de escribir el fichero, incorporar un cuadro de diálogo de abrir fichero o guardar y ya está. ¿sencillo, no? :mrgreen:
Espero haberte ayudado,

Salu2


Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 03 de Enero de 2009, 13:19:37
Ok droky muchas gracias por tu pronta respuesta y muy explicito lo del formato intel hex, ahora me toca que desarrole un codigo en delphi para que pueda interpretar el formato y asi representa la data en el componente editor como se quiere y lo otro seria ya guardar la data tambien manteniendo el formafo intel hex.

Saludos y voy hacer un codigo a mi manera lko que si tengo que investigar mejor es como manejar esos archivos binarios porque siguen siendo binario solo que ahora tiene un formato de identificacion como el caso del intel hex y asi otros formatos que ahora no los tocare como son el e2p que lo usa el software de ponyprog y el s19 que lo usa la gente de motorola y pare de contar pero como ya les indique siguen siendo binarios secuenciales lo otro es llevarlo o interpretarlo conm un formato tal.

Atten.
Alexander Santana.
Barcelona-Venezuela.

Este link tambiern puede ayudar: http://www.sixca.com/delphi/article/readhex.html
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: Nocturno en 03 de Enero de 2009, 13:49:21
No deberíais perderos la novela del amigo Diego: "El fichero .HEX explicado (http://www.todopic.com.ar/foros/index.php?topic=23342.0)"
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: jacrmr en 03 de Enero de 2009, 14:11:41
Citar
Saludos y voy hacer un codigo a mi manera lko que si tengo que investigar mejor es como manejar esos archivos binarios porque siguen siendo binario solo que ahora tiene un formato de identificacion como el caso del intel hex y asi otros formatos que ahora no los tocare como son el e2p que lo usa el software de ponyprog y el s19 que lo usa la gente de motorola y pare de contar pero como ya les indique siguen siendo binarios secuenciales lo otro es llevarlo o interpretarlo conm un formato tal.

En efecto como dices cualquier archivo es binario, pero la forma de apertura y de manejo no necesariamente lo es. Para el caso de archivos con formato .HEX, Tecktronix, S19, y similares deberías tratarlos como archivos de texto (que es lo que son en realidad), con lo cual se te facilita toda la manipulación de los datos.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: droky en 03 de Enero de 2009, 15:47:28
No deberíais perderos la novela del amigo Diego: "El fichero .HEX explicado (http://www.todopic.com.ar/foros/index.php?topic=23342.0)"
Interesante post, no lo habia visto,
Gracias Nocturno.
Salu2
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 03 de Enero de 2009, 20:54:27
No deberíais perderos la novela del amigo Diego: "El fichero .HEX explicado (http://www.todopic.com.ar/foros/index.php?topic=23342.0)"
Interesante post, no lo habia visto,
Gracias Nocturno.
Salu2
Yo si lo habia leido de hecho de ese post es que tengo claro el formato intel mi drama es llevar eso a delphi.

Ahora lo que comenta el colega jacrmr  tiene mucha razon pero recuerda que estoy usando un componente editor hex y por eso quiero representar mi  formato intel en ese dicho componente.

Saludos y nuevamente gracias por su opiniones.
Atten.
Alexander Santana.
Venezuela-Barcelona.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: eto en 04 de Enero de 2009, 02:29:22
Esta muy interesante este tema, de lo unico que tengo duda, es porque el foro no envia las notificaciones de los temas que he solicitado notificacion, pues este tema lo habia solicitado, y lo deje con unos cuantos post, pero regreso de algun tiempo y ya habian avanzado bastante y ni enterado, lo mismo pasa con otro post de programadores, tampoco me notifica.  :shock:

Pd. disculpen si me sali del tema.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 04 de Enero de 2009, 23:46:07
Esta muy interesante este tema, de lo unico que tengo duda, es porque el foro no envia las notificaciones de los temas que he solicitado notificacion, pues este tema lo habia solicitado, y lo deje con unos cuantos post, pero regreso de algun tiempo y ya habian avanzado bastante y ni enterado, lo mismo pasa con otro post de programadores, tampoco me notifica. 
Hola eto eso que comentas sobre que te avise sobre las respuestas del post no lo he revisado pero tomo este mismo respiuesta como prueba haber si te notifica de un a nueva respuesta y asumo que esa notificacion te la envia a tu correo que tienes suscrito en el foro o cuando entres nuevamente al foro te avise nose como solicitas ese aviso de todas maneras lo pondre en practica para ver eso ya que es muy importante eso de avisarle sobre los post que uno lleva una secuencia asi no se pierde de lo adelando y como va el tema en si.

saludos y bueno sin desviar el tema aca les subo el componente con el cual estoy trabajando para que los que le intereza ya lo tengas y puedan ir haciendo sus practica y como les comente en respuesta anteriores estoy en la etapa de im plementar el formato intel, luego les informo como me va ya que mi destresa en delphi es podre tengo que ir leyenmdo mucho para poder ir avanzando.

Atten.
Alexander Santana.
Barcelona-Venezuela.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: eto en 05 de Enero de 2009, 04:01:06
Hola astrocar, pues esta vez si me notificó, gracias., acabo de bajar el componente que subiste se ve interesante, lo probaré más tarde.

Saludos.

Pd. para que te notificque , cuando estas viendo un tema, en la parte donde esta el boton de respuesta, al lado aparece el boton de notificar, y en tu perfil configuras a donde y como quieres que te notifique.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 05 de Enero de 2009, 07:59:48
Hola astrocar, pues esta vez si me notificó, gracias., acabo de bajar el componente que subiste se ve interesante, lo probaré más tarde.

Saludos.

Pd. para que te notificque , cuando estas viendo un tema, en la parte donde esta el boton de respuesta, al lado aparece el boton de notificar, y en tu perfil configuras a donde y como quieres que te notifique.
Ok me alegro entonce caso cerrado lo de la notificacion y centremos entonce en el tema.

saludos y esperando opinioners varias, jajajaj.
Atten.
Alexander santana.
Barcelona-Venezuela.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: droky en 06 de Enero de 2009, 00:49:00
Hola Astrocar,
Después de ver el componente que has colgado, reescribiendo código para depurarlo al máximo, mi proposición para carga-guardar ficheros bin es la siguiente:

Código: Delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   FileCtrl, StdCtrls, ExtCtrls, Grids, MPHexEditor, XPMan, MPHexEditorEx;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     Button1: TButton;
  12.     Button2: TButton;
  13.     SaveDialog1: TSaveDialog;
  14.     OpenDialog1: TOpenDialog;
  15.    // XPManifest1: TXPManifest;
  16.     MPHexEditorEx1: TMPHexEditorEx;
  17.     procedure Button2Click(Sender: TObject);
  18.     procedure Button1Click(Sender: TObject);
  19.     procedure loadbin(Nom_Fichero:string);
  20.     procedure savebin(Nom_Fichero:string);
  21.   private
  22.     { Private declarations }
  23.   public
  24.     { Public declarations }
  25.   end;
  26.  
  27. var
  28.   Form1: TForm1;
  29.  
  30. implementation
  31.  
  32. {$R *.DFM}
  33.  
  34. procedure TForm1.loadbin(Nom_Fichero:string);
  35. begin
  36.   // Cargar fichero
  37.   with MPHexEditorEx1
  38.   do
  39.     if FileName <> Nom_Fichero then
  40.     begin
  41.       if not FileExists(Nom_Fichero)
  42.       then
  43.         CreateEmptyFile('Unnamed')
  44.       else
  45.         LoadFromFile(Nom_Fichero)
  46.  
  47.     end;
  48. end;
  49.  
  50. procedure TForm1.savebin(Nom_Fichero:string);
  51. begin
  52.   // Guardar fichero
  53. MPHexEditorEx1.SaveToFile(Nom_Fichero);
  54. end;
  55.  
  56. procedure TForm1.Button2Click(Sender: TObject);
  57. //Boton Guardar fichero Bin con filtro .bin
  58. begin
  59. savedialog1.InitialDir := getcurrentdir;
  60. savedialog1.Filter := 'ARCHIVO BIN|*.bin';
  61. savedialog1.Execute;
  62. if savedialog1.FileName <> '' then savebin(savedialog1.FileName+'.bin');
  63. end;
  64.  
  65. procedure TForm1.Button1Click(Sender: TObject);
  66. //Boton Cargar fichero Bin con filtro .bin
  67. begin
  68.  opendialog1.InitialDir := getcurrentdir;
  69.  opendialog1.Filter := 'ARCHIVO BIN|*.bin';
  70.  opendialog1.Execute;
  71.  if opendialog1.FileName<>'' then loadbin(opendialog1.FileName );
  72. end;
  73.  
  74. end.

No es necesaria ni la lectura ni escritura por bloques de los datos binarios, ya que van implementadas en el componente y son rápidas de ejecutar.
Intentaré colgar mañana ( por esta noche) la implementación básica de los hex en formato intel 8bits

Salu2
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 07 de Enero de 2009, 16:36:37
ok gracias Droky aunque desde que empece a trabajar con el componente ya pude sin problema cargar y guardar los ficheros bin mil dilculpas por no informar eso aunque yo subi ub ejecutableble de mi aplicacion que muestra es y otros avances mas y tambien dije que estoy es en la parte de el formato intel cosa que aun no lo he implementado del todo.

Bueno estuve patr de dias ausente del foro por que me fui al monte de caseria pero ya estoy de vueltas y con ganas de terminar la parte de intel para empezar luego y a fondo la parte de interface entre el pic18f2550 y la aplicacion qyue estamos manejando y quiero que sea via usb con que aun no la defino bienpor no tener cosas lista del soft como el formato intel y colocar las lista de eeprom que soportara el programador asi que ya hoy en la noche les comento los avances que desarrolle sobre eso del intel y agregue las eeprom a menejar.

Saludos y estamos en contacto por futuros avances de la aplicacion. pero ya cumpliento objetivos especificos para el final cumplir objetivos generales que es el programador de eeprom 100% funcional.
Atten:
Alexander Santana.
Barcelona-Venezuela.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 12 de Enero de 2009, 22:48:36
Hola buenas noches luego de tanto leer en delphi ya logre implementar las rutinas para procesar el formato intel, bueno sin mas comentarios aca le subo la manera de como pude hacer para abrir un fichero intel hex:

procedure TForm1.Button1Click(Sender: TObject);
var
Fhex: TextFile;
Fila,Aviso:string;
t:shortstring;
RECLEN,RECTYPE,DATA,CHKSUM:byte;
count,RESULTADO:INTEGER;
ADDRESS,SUMALINEA:word;
label
 error;
begin
  if OpenDialog1.Execute then          { Display Open dialog box }
  begin
  //LEE EL ARCHIVO Y LO ESCRIBE EN EL MEMO1
  memo1.lines.LoadFromFile(opendialog1.FileName);
  //Calcula el tamaño del fichero
  MPHexEditorEx1.datasize:=(memo1.Lines.Count-1)* 16;
  end;
  AssignFile(Fhex, OpenDialog1.FileName);   { File selected in dialog box }
  Reset(Fhex);
  //LEE Y PROCESA EL ARCHIVO Y LO ESCRIBE EN EL COMPONENTE
  while not eof(Fhex) do
  begin
  ReadLn(fhex, fila) ; //Lee las líneas del fichero
  RECLEN:=strtoint('$'+copy(fila,2,2));// lee longitud (RECLEN)
  ADDRESS:=strtoint('$'+copy(fila,4,4));// lee offset
  RECTYPE:=strtoint('$'+copy(fila,8,2));//Tipo de datos
  CHKSUM:=strtoint('$'+copy(fila,Length(fila)-1,2));//Checksum de la linea leida
  SUMALINEA:=RECLEN+lo(ADDRESS)+hi(ADDRESS)+RECTYPE;
  if fila[1]<>':' then
  begin
   Aviso:='Error en (:)';
   goto error;
  end;
        count:=0;
        while (count < RECLEN) do
        begin
        t:='$'+copy(fila,10+2*count,2);
        DATA:=strtoint(t);
        SUMALINEA:=SUMALINEA+DATA;
        MPHexEditorEx1.data[ADDRESS+count]:=DATA;
        inc(count);
        end;
  RESULTADO:=256-SUMALINEA;
  RESULTADO:=RESULTADO AND 255;
  IF CHKSUM<>RESULTADO THEN
  BEGIN
  AVISO:='Error en Checksum';
  goto error;
  end;

  end;

CloseFile(Fhex);
EXIT;

error:
  showmessage ('Fichero Corrupto '+Aviso);
end;


Ahora me resta la parte de guardar en formato intel que desde hoy empieso ese nuevo objetivo.

Saludos y aca tambien le dejo el ejecutable para que miren y disculpen mi desorden en la programacion pero principiante siempre es desordenado. Pero la idea es que funcione y esta hecho a mi manera de interpretar el formato intel si tienen sugerencias bienvenidas sean.
Atten.
Alexander Santana.
Anzoategui-Venezuela.
Título: Re: Archivo Binario(tambien conocido como secuencial)
Publicado por: ASTROCAR en 27 de Diciembre de 2009, 12:59:12
Hola Buenos dias y si mal no recuerdo ya hace un año que abri este post y lo tenia olvidado luego que termine la parte del formato intel.

En fin ya estoy retomando el tema nuevamente para ver si de una ves por todo termino mi programdor de eeprom; ahora el tema que quiero tocar es el de la comunicacion entre el pic y mi aplicacion delphi en un principio quise hacerlo en usb pero luego me dije si aun no manejo bien serial como voy a desarrollar en usb asi que decidi experimental con serial, por tal razon investigue sobre componentes que manejen puerto serial y ubique uno llamado TPAPRO el cual ya lo instale en mi version de delphi 7 y estoy en la parte de familiarizarme con dicho componente y alguien tiene informacion de este componete serial bienvenida sea.

La idea es configurar el puerto serial y luego establecer un protocolo para lectura, escritura y verificacion de las eeprom logico usando el componente ya mensionado.

Ejemplo desde la aplicacion delphi enviar un buffer en el cual diga que eeprom se va a trabajar ya sea I2c, SPI o MICROWIRE, seguido del tipo de eeprom si va hacer leida, escrita o verificada, por ultimo la direcion en la cual va hacer leida, escrita o verificada. <eso serial el protocolo a manejar y ya teniendo eso claro se envia el buffer que se vaya a escribir o en su defecto se recibe el buffer que va hacer escrito.

Saludos y sigo en mi proyecto y en estos momento estudiando el componente TPAPRO seria bueno tener ejemplo usando ese componente.
Atten.
Alexander Santana.
Venezuela-Barcelona.