Se connecter / S'enregistrer
Votre question

Récupération des données d'un fichier .hex

Tags :
  • Programmation
Dernière réponse : dans Programmation
14 Avril 2010 17:27:15

Bonjours a tous,
J'ai un fichier .hex comme suit que j'envoi par liaison RS232:

:100000000C9472000C948B000C948B000C948B005D
:100010000C948B000C948B000C948B000C948B0034
:100020000C948B000C948B000C948B000C948B0024
:100030000C948B000C948B000C948B000C948B0014
:100040000C948B000C948B000C948B000C948B0004

et je voudrais faire une fonction pour récupéré juste les données souligné dans mon buffer,
mais je n'arrive pas a construire la fonction permettant de le réaliser, c'est pour quoi je demande votre aide.
Je vous remercie d'avance pour l'attention que vous porterez a mon problème

Autres pages sur : recuperation donnees fichier hex

a b L Programmation
14 Avril 2010 20:57:00

Et tu fais ça en quel langage ?

Ps: il est aussi préférable de tester la taille, l'adresse, le type de record et surtout le checksum à la fin.
m
0
l
15 Avril 2010 11:00:14

Je fais cela en langage C,
c'est pour une section de bootloader pour microcontroleur ATMEGA2560, j'ai pour objectif une fois dans le bootloader, récupéré les octets de données du fichier .hex (exemple au dessus) qui sont envoyer par liaison RS232. Dans un premier temps je voulais juste regarder si je pouvais récupéré les octets de données en me passant du reste ( en supposant que tous les fichier .hex ont le même nombre de ligne et que les lignes ont le même nombre d'octets) comme suit :

  1. 1.if (toto >= 718) /* lorsque j'ai tous les octets du fichier envoyer */
  2. 2. {
  3. 3. for(i=0; i<718; i++)
  4. 4. {
  5. 5. indice=0;
  6. 6. for(j=0;j<NBR_LIGNES;j++) /* temps qu'il y a des lignes dans le fichier */
  7. 7. {
  8. 8. indice+=9; /* je saute les 9 premier octets */
  9. 9. for(y=0;y<33;y++) /* boucle pour prendre les 33 octets de données*/
  10. 10. {
  11. 11. donnees[i][y]=buffer[indice]; /* indice prend la valeur du tableau */
  12. 12. indice++;
  13. 13. }
  14. 14. indice+=2; /* saute les 2 dernier octets */
  15. 15. }
  16. 16. putchar1(donnees[j][y]); /* affichage des données */
  17. 17.
  18. 18. }
  19. 19. toto=0;
  20. 20. }


Mais effectivement il faut que je tienne compte de tester la taille, l'adresse, le type de record et le checksum.
aurais-tu une idées de comment procédé stp?
m
0
l
Contenus similaires
a b L Programmation
15 Avril 2010 20:43:49

1. Vérifie que buffer[0] == ':'
2. convertir la taille avec strtol() pour la conversion en base 2
3. convertit l'adresse
4. récupère les données, fait une conversion des données ascii -> hexa
5. mettre dans un buffer la conversion hexa de 2, 3 et 4, et faire le calcul de checksum à comparer

Pour la conversion hexa, tu peux aussi faire des macros très simples (une pour le nibble et une pour l'octet).
m
0
l
19 Avril 2010 12:00:43

j'ai programmé un petit bout de code qui permet de modifier la partie flash de mon microcontroleur. il marche correctement et j'arrive en envoyant le fichier .hex (découper en 3 sous fichier .hex de 256octets) par RS232 a changer la partie application.

voici mon code : (il n'est pas du tout optimal car je test dans un premier temps la faisabilité)

  1. int main(void)
  2. {
  3. unsigned char finalbuffer[NBR_LIGNES][32];
  4. unsigned char finalbufferpage3[1][32];
  5. unsigned char finalpage1[256];
  6. unsigned char finalpage2[256];
  7. unsigned char finalpage3[256];
  8. int j,y;
  9. int indice;
  10. int indicefinal;
  11.  
  12. toto=0;
  13. // Set the interrupt vector to the start of the bootflash
  14. cli(); // disable interrupt in order to move the interrupt vector
  15. MCUCR = (1<<IVCE);
  16. MCUCR = (1<<IVSEL);
  17. sei(); //re-enable the interrupt
  18.  
  19. initIO();
  20. initUSART1();
  21. initVariateur(); //Initialise le variateur pour que le moteur reste bloqué pendant une mise à jour soft.
  22.  
  23. while(1)
  24. {
  25. PORTJ &= ~(1<<LED1);
  26. PORTJ &= ~(1<<LED2);
  27. PORTJ &= ~(1<<LED3);
  28. PORTJ &= ~(1<<LED4);
  29.  
  30. while( toto<718 );
  31. if (toto >= 718)
  32. {
  33. indice=0;
  34. for(j=0;j<NBR_LIGNES;j++)
  35. {
  36. indice+=9;
  37. for(y=0;y<32;y++)
  38. {
  39. finalbuffer[j][y] = buffer[indice];
  40. indice++;
  41. }
  42. indice+=4;
  43. }
  44. indicefinal=0;
  45. for(j=0;j<NBR_LIGNES;j++)
  46. {
  47. for(y=0;y<16;y++)
  48. {
  49. finalpage1[indicefinal] = asciitohexa(finalbuffer[j][y*2],finalbuffer[j][(y*2)+1]);
  50. indicefinal++;
  51. }
  52. }
  53. boot_program_page(0,finalpage1);
  54. toto=0;
  55. }
  56. while( toto<718 );
  57. if (toto >= 718)
  58. {
  59. indice=0;
  60. for(j=0;j<NBR_LIGNES;j++)
  61. {
  62. indice+=9;
  63. for(y=0;y<32;y++)
  64. {
  65. finalbuffer[j][y] = buffer[indice];
  66. indice++;
  67. }
  68. indice+=4;
  69. }
  70. indicefinal=0;
  71. for(j=0;j<NBR_LIGNES;j++)
  72. {
  73. for(y=0;y<16;y++)
  74. {
  75. finalpage2[indicefinal] = asciitohexa(finalbuffer[j][y*2],finalbuffer[j][(y*2)+1]);
  76. indicefinal++;
  77. }
  78. }
  79. boot_program_page(256,finalpage2);
  80. toto=0;
  81. }
  82. while( toto<52 );
  83. if (toto >= 52)
  84. {
  85. indice=0;
  86. for(j=0;j<1;j++)
  87. {
  88. indice+=9;
  89. for(y=0;y<28;y++)
  90. {
  91. finalbufferpage3[j][y] = buffer[indice];
  92. indice++;
  93. }
  94. indice+=4;
  95. }
  96. indicefinal=0;
  97. for(j=0;j<1;j++)
  98. {
  99. for(y=0;y<14;y++)
  100. {
  101. finalpage3[indicefinal] = asciitohexa(finalbufferpage3[j][y*2],finalbufferpage3[j][(y*2)+1]);
  102. indicefinal++;
  103. }
  104. }
  105. boot_program_page(512,finalpage3);
  106. toto=0;
  107. }
  108.  
  109. }
  110.  
  111. return 0;
  112. }


aurait-tu une idéé pour prendre en compte toute les données du fichier .hex? et ne pas sauter le start code, byte count etc... comme je le fait dans mon code?
m
0
l
a b L Programmation
19 Avril 2010 19:17:54

Tu peux décoder toutes la chaine sauf le premier caractère ':', tu convertit tout en hexa, et tu fais des memcpy dans d'autres buffer pour récupérer les morceaux.
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS