Concatener hexa puis conversion

Salut à tous,

Je me remet à la programmation après 20ans … bref
Mon projet avance bien en UART mais je rencontre un souci (sur la fin du projet) pour concatener 5 données en hexadécimal avant de les convertir en décimal et de faire apparaître sur le moniteur série.

EX :
5 hexadécimal : 3E AA 44 C4 F2
Deviendrait : 3EAA44C4F2
Puis convertit = ….

I don't have an exact answer, but remember that EVERYTHING in the computer/microcontroller is in binary. :wink:

By default the input, output, and display are converted to decimal.

If some byte(s) represent something other than a number, an alphanumeric character, a pixel in an image, a microprocessor instruction, etc., the software has to know the context so it knows what to do with the binary number.

Hex is popular with programmers because it's easy (for humans) to convert between hex and binary. Since every nybble represents exactly one hex digit, you can learn to convert numbers of any size in your head. And it's easier to read/write hex than a long string of ones & zeros.

Tu peux expliquer la finalité? C'est un exercice de style ou il y a un besoin?

@DVDdoug please write in French on the French forum
Merci d’écrire en français sur le forum francophone

Quel arduino? Les petits AVR ne savent pas imprimer des unsigned long long

C’est un besoin :rofl:

Je récupère des données d’un implant RFID.
J’ai bien les bits de début et de fin, etc …

Dans la chaîne d’information, je stocke dans un buffer :

Tagmessage[0] = …
Tagmessage[1] = …
Tagmessage[2] = …
Tagmessage[3] = …
Tagmessage[4] = …

J’ai tenté un serial.print() avec des , & +
Pareil avec une variable « tag » : tag = …

Je me suis souvenu d’un vieux cours qui parlait des bits faible et forts. Donc j’ai tenté de décaler les bits avec << (de 2, 4, 8 bits) mais la somme des 5 données hexagonales que je convertit n’est pas correcte car la valeur en DEC est fausse.
J’ai vérifié sur Excel et sur la calculatrice du PC.

Donc j’en conclue que j’ai un soucis pour regrouper les 5 donnes HEX et/ou pour le décalage.

Il faudrait connaitre le type de Tagmessage : int, char, String ???

Si c'est des int, tu peux en effet utiliser les décalages par paquets de 8
Exemple, si on a :

Tagmessage[0] = 3E
Tagmessage[1] = AA
Tagmessage[2] = 44
Tagmessage[3] = C4
Tagmessage[4] = F2
(en fait tu auras les valeurs binaires dans ces cases du tableau, j'écris ça pour reprendre ton exemple)

tu convertis par:

uint64_t valeur = (((Tagmessage[0] << 8 + Tagmessage[1]) << 8 + Tagmessage[2]) << 8 + Tagmessage[3]) << 8 + Tagmessage[4];

Mais il y a d'autres façons de faire (avec une boucle, en multipliant au lieu de décalant, etc.).

Merci @lesept .

Les variables « Tagmessage[i] » et « tag » sont déclarées en uint32_t

J’ai essayé ta proposition de décalage, mais cela n’a pas fonctionné. Je retente demain car la fatigue a eu certainement raison de moi … 50h de programmation et de recherche, cette semaine

J’avais tenté la fonction inHexDec mais des messages d’erreur dans la compilation.

IDE1.6.5

uint64_t valeur = (((Tagmessage[0] << 8 + Tagmessage[1]) << 8 + Tagmessage[2]) << 8 + Tagmessage[3]) << 8 + Tagmessage[4];

Si on fait cela les opérations se font sur 32 bits et l'octet de poids fort est perdu. Il faut au moins forcer une opération en 64 bits

Comme ceci ?

uint64_t valeur = ((Tagmessage[0] << 8 + Tagmessage[1]) << 8 + Tagmessage[2]) << 8 + Tagmessage[3];
valeur = valeur << 8 + Tagmessage[4];

Saut que le print d’un uint64_t ne fonctionne pas sur Uno ou mega

Pourquoi vouloir mettre cela sous forme de nombre ? Gardez le buffer de 5 octets

Si vous avez besoin de comparer il y’a memcmp par exemple

Tu as donc un tableau d'entier sur 32 bits de 5 éléments, qui contient en fait une valeur sur un octet?

Tu peux nous montrer ton programme?

Pourquoi cette vieillerie ?

@J-M-L @vileroi merci pour vos attentions tardives.
Et quelle sympathie sur les forums.

Je vous extrait une partie du programme demain. Je ne vais pas rallumer ma station CAO maintenant et je vous répond depuis le téléphone.

Et oui je tourne sur un vieil IDE car c’est un souvenir de jeunesse :rofl: qui est installé sur un EePC qui date de mes années d’étudiantes, sous xp 32. Ce n’est pas un foudre de guerre mais il a son utilité :smiling_face_with_three_hearts:

Un peu de blabla, avant mes prochains posts sérieux !
L’électronique et l’informatique datent de 2000 à 2010 environ. Donc je ne suis pas un professionnel en la matière mais je ne débrouille pas trop mal en vba et arduino.
Je suis de l’autre côté de la branche technique :rofl: :rofl: mécanique/matériaux (composites, usinage, chaudronnerie, plasturgie) dans le secteur aéro…

Donc le petit … que je suis s’est lancé un défi ! Vingt ans après…
Vive le DIY !!

PROJET :
Réaliser un distributeur automatique de croquettes pour 2 chats, pucés, avec un rationnement différent.

Étape 1 : réparer l’imprimante 3D => DONE
Étape 2 : revoir les cours => DONE
Étape 3 : recherche bibliographique => DONE
Étape 4 : essais => DONE
Étape 5 : programmer => WIP
5.1 : LCD
5.2 : menu déroulant (5 boutons poussoirs)
5.3 : capteur de masse
5.4 : lecteur 134.2 kHz
Étape 6 : dessiner et fabriquer
Étape 7 : réaliser
Étape 8 : apéro

Donc je vous sollicite pour finaliser une erreur dans mon sous module « RFID ».
Je pourrais m’arrêter à comparer des codes HEX d’identification du type « if is == AA {} » mais je suis à 95% de finir la partie névralgique du projet.

Besoin :
Je souhaiterais que 5 de mes données HEX (AA, BB, CC, DD, EE) stockées dans mon tableau, soient « concatener » ou « additionner sous la forme « AABBCCDDEE » avant la conversion en DEC

Bonne soirée à demain

La question reste pourquoi voulez vous absolument fabriquer un entier et pourquoi du décimal ? Comme vous avez 5 octets vous ne pouvez pas utiliser un uint32_t qui n’en fait que 4. Il faut un uint64_t qui en fait 8, soit 3 octets de perdus… ça se fait simplement par décalage vous commencez a 0, vous ajoutez le premier octet, vous décalez de 8 bits, vous ajoutez le second octet, vous décalez de 8 bits, vous ajoutez le troisieme octet, vous décalez de 8 bits, vous ajoutez le quatrième octet, vous décalez de 8 bits, vous ajoutez le dernier octet, ça vous fait votre nombre. Si vous êtes sur un arduino 8 bits, print ne saura pas le gérer.

Une structure qui contient le tableau des 5 octets (qui pourrait être aussi une structure) par exemple ainsi que éventuellement d’autres attributs comme le nom du chat, ses horaires et quantité etc serait sans doute une meilleure façon de structurer vos données.

Moi, j'irais un poil plus loin, pourquoi vouloir concaténer les 5 octets?
La comparaison peut se faire octet par octet ce qui est quand même plus simple sur ces petites machines.

Oui ou par memcmp() en une seule fois

ok je note.
je t'avoue que j'ai des connaissances limités pour gagner en taille du fichier .ino
je ne suis pas encore au niveau de compétence me permettant d'optimiser.
J'arrive à faire fonctionner les fonctions principales et secondaires du projet, et je m'estime heureux

je n'ai pas ses connaissances ....

je vais me renseigner sur cette fonction que je ne connais pas encore.
merci