Discussions Générales > Bus CAN

Bus CAN et Décimal

<< < (2/6) > >>

Jean-Luc:
Je répond également parce que finalement ce n'est pas spécifique à votre problème,

En fait votre problème n'est pas lié au CAN, vous l'auriez avec n'importe quel réseau.

Votre problème est de coller les octets constituant votre nombre à virgule dans les octets du message.

Pour émettre votre message vous utilisez un truc du genre


--- Code: ---can.sendMsgBuf(id,type,data,longueur);

--- Fin du code ---

où id est l'identifiant du message, type le type (0 = standard, 1 = extended), data un pointeur vers, au plus, une successions de 8 octets de données et longueur la longueur en octets, un byte.

Pour envoyer une variable v de type float dans un message standard, il faut écrire :


--- Code: ---can.sendMsgBuf(id,0,(byte *)(&v),sizeof(v));

--- Fin du code ---

&v donne un pointeur sur v, (byte *) le converti en un pointer sur un octet, sizeof(v) retourne la taille en octets de v, c'est à dire 4 mais c'est mieux de l'écrire comme ça.

À la réception, vous appelez :


--- Code: ---can.readMsgBuf(data, longueur);

--- Fin du code ---

Où data est un pointeur vers, au plus, une successions de 8 octets de données et longueur un pointeur vers un byte ou sera écrit la longueur en octets du message reçu.

Si v2 est votre variable de type float où vous souhaitez recevoir la donnée et len un byte où vous souhaiter voire écrit la longueur, il faut écrire :


--- Code: ---can.readMsgBuf((byte *)(&v2), &len);

--- Fin du code ---

Tony04:
Bonjour et merci Jean-Luc,

je viens d'apprendre quelque chose même si mes besoins ne sont pas des nombres à virgule que j'envoie.

Bon lundi soir de Pâques
Cordialement
Antoine

Jean-Luc:
Bonsoir Antoine,

Joyeuses Pâques à toi également

Un dernier truc. Il faut faire attention à l'endianess. Si le message est transmis entre une plateforme où les octets ne sont pas rangés dans le même ordre, il y aura un soucis. Exemple sur un nombre entier de 4 octets (32 bits) que l'on écrit 0x11223344 peut être stocké en little endian, vu comme un tableau d'octet, il s'écrirait { 0x44, 0x33, 0x22, 0x11 } ou big endian : { 0x11, 0x22, 0x33, 0x44 }

En pratique, autour de l'Arduino, il n'y a pas de soucis : un AVR, un ARM, un ESP ou un PIC32, tout le monde est little Endian.

JeeLet:
... mais non c'est pas des Sauvages sur Locoduino, tu vois!!

Bonjour

merci pour le ++ d'info sur le sujet  8)

je revient avec des croquis sous l'bras.

JeeLet:
Bonsoir

Recu hier mes 5 "Module Bus-CAN SBC-CAN01"  de chez JOY-hic, refait le câblage en plus propre.

avec la biblio ACAN / ACAN2515
 j'ai Tester les croquis (2BP et 2 Led) donner sur le super Tuto ACAN number ON ,  c'est implacable .. heu ... impeccable.

Donc me revoilà avec ma virgule   :o   

j'ai mis en application une "recette"  donnée par  skywodd sur le forum Arduino.

"Tu multiplies ton float par le nombre de dizaines après la virgule,
 tu le convertis en int(),
tu l'envoies à l'Arduino.

Coté Arduino, tu réceptionnes ce int en le recomposant,
tu le divises par le nombre de dizaine que tu avais derrière la virgule,
tu le convertis en float()."



Et c'est impeccable, enfin presque  ;D

pour le croquis émission rien a dire,  le problème c'est pour la réception.

comprend pas comment diviser quoi ou ??!!


--- Code: ---int ival = ????
et
float val = ival / 100.0;
--- Fin du code ---


voila mes super Croquis.

RE-Edit du samedi 25
j'ai supprimé les croquis, c'est une horreur  :D
mais je continue a avancer.

info du jour https://www.hackster.io/monkbroc/poor-man-s-can-bus-602636
du super light  :)







Navigation

[0] Index des messages

[#] Page suivante

[*] Page précédente

Utiliser la version classique