Ir al contenido


Salvar un file Intelhex.


  • Por favor identifícate para responder
65 respuestas en este tema

#1 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 07 noviembre 2008 - 06:33

Hola amigos, aqui esta un procedure que salva un file y lo hace en el formato intelhex:


delphi
  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls;
  6. type buffer=array of byte;  //assign as Dynamic array
  7. var HexBufOut:buffer;
  8. type
  9.   TForm1 = class(TForm)
  10.     SaveDialog1: TSaveDialog;
  11.     Button1: TButton;
  12.   procedure Button1Click(Sender: TObject);
  13.   private
  14.     { Private declarations }
  15.   public
  16.     { Public declarations }
  17.   end;
  18. var
  19.   Form1: TForm1;
  20. implementation
  21. {$R *.dfm}
  22. function writeline(ADDR,RECLEN,RECTYPE:integer;
  23.             var buf:buffer):string;
  24. var i:integer;
  25. CHKSUM:byte;
  26. begin
  27. CHKSUM:=0;
  28. result:=':'+inttohex(RECLEN,2)+  inttohex(ADDR,4)+inttohex(RECTYPE,2);
  29. CHKSUM:=RECLEN+lo(ADDR)+hi(ADDR);
  30. for i:=0 to RECLEN-1 do begin
  31. result:=result+inttohex(buf[ADDR+i],2);
  32. CHKSUM:=CHKSUM+buf[ADDR+i];
  33. end;
  34. result:=result+inttohex(256-CHKSUM,2);
  35. end;
  36. function write_eof:string;
  37. begin
  38. result:=':00'+'0000'+'01'+'FF';  // :00000001FF
  39. end;
  40.  
  41. procedure TForm1.Button1Click(Sender: TObject);
  42. var Fname,line:string;
  43. Fp : textfile;
  44. ErrorCode,StartAddr,ByteCnt:integer;
  45.   A_Line,EOF_HEX:string;
  46. begin
  47.   StartAddr:=$0000;  // start address
  48.   ByteCnt:=6;    // 6 bytes
  49.   SetLength(HexBufOut,ByteCnt);
  50.   HexBufOut[0]:=$01;
  51.   HexBufOut[1]:=$02;
  52.   HexBufOut[2]:=$03;
  53.   HexBufOut[3]:=$04;
  54.   HexBufOut[4]:=$05;
  55.   HexBufOut[5]:=$06;
  56. Fname:='C:\Documents and Settings\XP\My Documents\test1.hex';
  57. AssignFile(Fp,Fname); { File selected in dialog }
  58. Rewrite(Fp);
  59. // write 16 bytes in HexBuf
  60. A_Line:=writeline(StartAddr,ByteCnt,$00,HexBufOut);
  61.   EOF_HEX:=':00'+'0000'+'01'+'FF';// write end of HEX file
  62.     writeln(Fp,A_Line);
  63.   writeln(Fp,EOF_HEX);
  64. closefile(Fp);
  65. end;
  66. end.


A ver si ahora si logro entender este procedure y logro que trabaje bien.

Un Saludo.
PD:mas tarde explico las dudas y que es lo que no logro entender en el.

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 07 noviembre 2008 - 08:26

Pues usando el mismo buffer que cuando leíamos el fichero, la cosa queda mas o menos así:


delphi
  1. type
  2.   TBuffer = array[$0000..$FFFF] of Byte;
  3.  
  4. const
  5.   EmptyLine = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
  6.   // EmptyLine = '00000000000000000000000000000000';
  7.  
  8. procedure SaveBufferToFile(Buffer: TBuffer; Filename: String);
  9. var
  10.   i,j,CRC: Integer;
  11.   Str: String;
  12. begin
  13.   with TStringList.Create do
  14.   try
  15.     for j:= 0 to $FFF do
  16.     begin
  17.       Str:= EmptyStr;
  18.       CRC:= 0;
  19.       for i:= 0 to $0F do
  20.       begin
  21.         Str:= Str + IntToHex(Buffer[(j shl 4) + i],2);
  22.         CRC:= CRC + Buffer[(j shl 4) + i];
  23.       end;
  24.       if Str <> EmptyLine then
  25.       begin
  26.         CRC:= (((CRC + $10 + (j shr 4) + ((j shl 4) and $FF)) xor $FF) + 1)
  27.           and $FF ;
  28.         Str:= ':10' + IntToHex(j shl 4,4) + '00' + Str +  IntToHex(CRC,2);
  29.         Add(Str);
  30.       end;
  31.     end;
  32.     Add(':00000001FF');
  33.     SaveToFile(Filename);
  34.   finally
  35.     Free;
  36.   end;
  37. end;




Y para probarlo podemos usar el código de lectura:


delphi
  1. var
  2.   i,j: Integer;
  3.   Buffer: TBuffer;
  4. begin
  5.   with TStringList.Create do
  6.   try
  7.     LoadFromFile('c:\prueba.hex');
  8.     // Llenamos todo el buffer con $FF
  9.     FillChar(Buffer,Sizeof(Buffer),#$FF);
  10.     // Leemos el archivo linea a linea e insertamos los datos en el buffer
  11.     for i:= 0 to Count - 1 do
  12.       Insertar(Strings[i],Buffer);
  13.    // Aqui lo guardamos con otro nombre para ver como queda
  14.     SaveBufferToFile(Buffer,'c:\resultado.hex');
  15.   finally
  16.     Free;
  17.   end;
  18. end;


  • 0

#3 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 07 noviembre 2008 - 10:15

Gracias seoane, llegando a la casa le doy una probadita a ese codigo.

Un Saludo.

#4 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 27 diciembre 2008 - 07:16

Hola Maestro.



delphi
  1. // Leemos el archivo linea a linea e insertamos los datos en el buffer
  2. for i:= 0 to Count - 1 do
  3.  
  4. Insertar(Strings[i],Buffer); // aqui tengo un problemita
  5.  
  6. // Aqui lo guardamos con otro nombre para ver como queda
  7. SaveBufferToFile(Buffer,'c:\resultado.hex');



¿Como debo declarar "Insertar"?

Un Saludo.

#5 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 29 diciembre 2008 - 08:25

Hola seoane, creo que el problema es que no tenia este procedimiento:



delphi
  1. function Insertar(Str: String; var Buffer: TBuffer): String;
  2. var  i,j,k: Integer;
  3. begin 
  4. Result:= EmptyStr; 
  5. Str:= Trim(Str); 
  6. if Copy(Str,1,1) = ':' then   
  7. if TryStrToInt('$' + Copy(Str,2,2),i) then     
  8. if Length(Str) = ((2*i) + 11) then       
  9. if TryStrToInt('$' + Copy(Str,4,4),j) then         
  10. if TryStrToInt('$' + Copy(Str,8,2),k) then           
  11. if k = 0 then             
  12. begin               
  13. Str:= Copy(Str,10,2*i);               
  14. for k:= j to (j + i - 1) do               
  15. begin                   
  16. Buffer[k]:= StrToInt('$' + Copy(Str,1,2));                   
  17. Delete(Str,1,2);                 
  18. end;             
  19. end;
  20. end;



Un Saludo.

PD: Creo que esta fue mi confucion, no entendia que me hacia falta este procedimiento tambien. ;)

#6 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 29 diciembre 2008 - 06:10

Este es el que no se deja. jajajajajaja: Copila pero no esta salvando nada en el file prueba.hex.



delphi
  1. uses
  2.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  3.   Dialogs, StdCtrls, Buttons;
  4. type
  5. TBuffer = array[$0000..$FFFF] of Byte;
  6. type
  7.   TForm1 = class(TForm)
  8.     BitBtn1: TBitBtn;
  9.     procedure BitBtn1Click(Sender: TObject);
  10.   private
  11.     { Private declarations }
  12.    
  13.   public
  14.     { Public declarations }
  15.   end;
  16.  
  17. var
  18.   Form1: TForm1;
  19.   Buffer: TBuffer;
  20. const  //EmptyLine = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
  21.   EmptyLine = '00000000000000000000000000000000';
  22. implementation
  23.  
  24. {$R *.dfm}
  25.  
  26. function Insertar(Str: String; var Buffer: TBuffer): String;
  27. var  i,j,k: Integer;
  28. begin
  29. Result:= EmptyStr;
  30. Str:= Trim(Str);
  31. if Copy(Str,1,1) = ':' then
  32. if TryStrToInt('$' + Copy(Str,2,2),i) then
  33. if Length(Str) = ((2*i) + 11) then
  34. if TryStrToInt('$' + Copy(Str,4,4),j) then
  35. if TryStrToInt('$' + Copy(Str,8,2),k) then
  36. if k = 0 then
  37. begin
  38. Str:= Copy(Str,10,2*i);
  39. for k:= j to (j + i - 1) do
  40. begin
  41. Buffer[k]:= StrToInt('$' + Copy(Str,1,2));
  42. Delete(Str,1,2);
  43. end;
  44. end;
  45. end;
  46.  
  47. procedure SaveBufferToFile(Buffer: TBuffer; Filename: String);
  48. var
  49. i,j,CRC: Integer;
  50. Str: String;
  51. begin
  52. with TStringList.Create do
  53. try
  54. for j:= 0 to $FFF do
  55. begin
  56. Str:= EmptyStr;
  57. CRC:= 0;
  58. for i:= 0 to $0F do
  59. begin
  60. Str:= Str + IntToHex(Buffer[(j shl 4) + i],2);
  61. CRC:= CRC + Buffer[(j shl 4) + i];
  62. end;
  63.   if Str <> EmptyLine then
  64.   begin
  65.   CRC:= (((CRC + $10 + (j shr 4) + ((j shl 4) and $FF)) xor $FF) + 1)
  66.   and $FF ;
  67.   Str:= ':10' + IntToHex(j shl 4,4) + '00' + Str +  IntToHex(CRC,2);
  68.   Add(Str);
  69.   end;
  70.   end;
  71.   Add(':00000001FF');
  72.   SaveToFile(Filename);
  73.   finally    Free;
  74.   end;
  75.   end;
  76. procedure TForm1.BitBtn1Click(Sender: TObject);
  77. var
  78. i,j: Integer;
  79. begin
  80. with TStringList.Create do
  81. try
  82. LoadFromFile('C:\Documents and Settings\XP\test.HEX');
  83. // Llenamos todo el buffer con $FF
  84. FillChar(Buffer,Sizeof(Buffer),#$FF);
  85. // Leemos el archivo linea a linea e insertamos los datos en el buffer
  86. for i:= 0 to Count - 1 do
  87. Insertar(Strings[i],Buffer);
  88. // Aqui lo guardamos con otro nombre para ver como queda
  89. SaveBufferToFile(Buffer,'C:\Documents and Settings\XP\prueba.HEX');
  90. finally
  91. Free;
  92. end;
  93. end;
  94.  
  95. end.



Algo no termino de entender en este codigo.A sido lo que mas trabajo me a costado(poder logra salvar un file intelhex) :@

Un Saludo.

#7 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 06 enero 2009 - 05:45

Amigo ego dele una miradita a tus 12 puntos para el 2009. :p


Un Saludo.

#8 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 07 enero 2009 - 07:01

Amigo ego dele una miradita a tus 12 puntos para el 2009. :p


Un Saludo.


La funcion



delphi
  1. procedure SaveBufferToFile(Buffer: TBuffer; Filename: String);



es la que se encarga de guardar los datos a un archivo

Y lo hace con esta instruccion



delphi
  1. // Aqui lo guardamos con otro nombre para ver como queda
  2. SaveBufferToFile(Buffer,'C:\Documents and Settings\XP\prueba.HEX');




Todo esta ahi amigo (y)

Salud OS


  • 0

#9 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 08 enero 2009 - 03:30

Pues usando el mismo buffer que cuando leíamos el fichero, la cosa queda mas o menos así:


delphi
  1. type
  2.   TBuffer = array[$0000..$FFFF] of Byte;
  3.  
  4. const
  5.   EmptyLine = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
  6.   // EmptyLine = '00000000000000000000000000000000';
  7.  
  8. procedure SaveBufferToFile(Buffer: TBuffer; Filename: String);
  9. var
  10.   i,j,CRC: Integer;
  11.   Str: String;
  12. begin
  13.   with TStringList.Create do
  14.   try
  15.     for j:= 0 to $FFF do
  16.     begin
  17.       Str:= EmptyStr;
  18.       CRC:= 0;
  19.       for i:= 0 to $0F do
  20.       begin
  21.         Str:= Str + IntToHex(Buffer[(j shl 4) + i],2);
  22.         CRC:= CRC + Buffer[(j shl 4) + i];
  23.       end;
  24.       if Str <> EmptyLine then
  25.       begin
  26.         CRC:= (((CRC + $10 + (j shr 4) + ((j shl 4) and $FF)) xor $FF) + 1)
  27.           and $FF ;
  28.         Str:= ':10' + IntToHex(j shl 4,4) + '00' + Str +  IntToHex(CRC,2);
  29.         Add(Str);
  30.       end;
  31.     end;
  32.     Add(':00000001FF');
  33.     SaveToFile(Filename);
  34.   finally
  35.     Free;
  36.   end;
  37. end;




Y para probarlo podemos usar el código de lectura:


delphi
  1. var
  2.   i,j: Integer;
  3.   Buffer: TBuffer;
  4. begin
  5.   with TStringList.Create do
  6.   try
  7.     LoadFromFile('c:\prueba.hex');
  8.     // Llenamos todo el buffer con $FF
  9.     FillChar(Buffer,Sizeof(Buffer),#$FF);
  10.     // Leemos el archivo linea a linea e insertamos los datos en el buffer
  11.     for i:= 0 to Count - 1 do
  12.       Insertar(Strings[i],Buffer);
  13.    // Aqui lo guardamos con otro nombre para ver como queda
  14.     SaveBufferToFile(Buffer,'c:\resultado.hex');
  15.   finally
  16.     Free;
  17.   end;
  18. end;



Hola ego, solo dime algo. ¿Aqui falta un procedimiento? porque estos dos pedazos de codigo no me trabajan.

Un Saludo.

PD:Lo que me explicas en el post anterior esta claro.

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 08 enero 2009 - 04:40

Puedes darme un archivo que tengas ya creado con los hexa?, para hacer la prueba y darte una respuesta mas acertada.

Salud OS
  • 0

#11 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 08 enero 2009 - 04:53

Hola amigos,
Hace dias que veo este hilo pero no son conceptos que manejo ¿alguién podría explicarme de que se trata el tema?  :D, perdonen soy novato
  • 0

#12 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 08 enero 2009 - 04:55

Puedes darme un archivo que tengas ya creado con los hexa?, para hacer la prueba y darte una respuesta mas acertada.

Salud OS


Claro carnal aqui esta uno:
http://suncoastmicros.com/SERINT.HEX

Un Saludo.

PD:Este puto server no quiere mis files. :@

#13 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 08 enero 2009 - 04:59

Hola amigos,
Hace dias que veo este hilo pero no son conceptos que manejo ¿alguién podría explicarme de que se trata el tema?  :D, perdonen soy novato


Hola amigo Felipe. Pues un IntelHex file es un tipo de formato que se usa para programar uC y pues la cosa es salvar el contenido de la memoria de un uC en un file dentro de la PC.

Un Saludo.

#14 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 08 enero 2009 - 05:04


Hola amigos,
Hace dias que veo este hilo pero no son conceptos que manejo ¿alguién podría explicarme de que se trata el tema?  :D, perdonen soy novato


Hola amigo Felipe. Pues un IntelHex file es un tipo de formato que se usa para programar uC y pues la cosa es salvar el contenido de la memoria de un uC en un file dentro de la PC.

Un Saludo.


Ah... como quien dice... no entendi  :$
¿uC?, tu eres el experto  :D
  • 0

#15 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 08 enero 2009 - 05:49

Es facil amigo, comienza a leer este hilo desde el principio y pues cuando llegues al final si no entiendes un poco mas, pues entonces te mandamos a unas clases de IntelHex con el burro. :p

Un Saludo.

#16 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 08 enero 2009 - 05:52

Bueno Felipe aqui esta la primera leccion:
http://www.kmitl.ac....ustrate/hex.htm

Un Saludo.

#17 felipe

felipe

    Advanced Member

  • Administrador
  • 3.283 mensajes
  • LocationColombia

Escrito 08 enero 2009 - 08:48

Gracias Jose, aunque aú me parece que me hablaran en chino le daré una leida  :D
  • 0

#18 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 09 enero 2009 - 11:37

Puedes darme un archivo que tengas ya creado con los hexa?, para hacer la prueba y darte una respuesta mas acertada.

Salud OS


¿Sigues probando carnal?

Un Saludo.

#19 Guest_Jose Fco_*

Guest_Jose Fco_*
  • Visitante

Escrito 09 enero 2009 - 04:08

Yo se que un dia de estos algun maestro posteara un ejemplito que funcione. :p


Un Saludo.

#20 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 09 enero 2009 - 04:10

Yo se que un dia de estos algun maestro posteara un ejemplito que funcione. :p


Un Saludo.


Claro que si amigo, estoy en ello :)

Ya lo puse al tope de mi lista de pendientes (y)

Salud OS
  • 0




IP.Board spam blocked by CleanTalk.