Se connecter avec
S'enregistrer | Connectez-vous

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

Dernière réponse : dans Programmation

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
Lassé par la pub ? Créez un compte

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?
Expert Programmation

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).

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?
Lassé par la pub ? Créez un compte
Tom's guide dans le monde