Bonsoir,
Je suis en train d'écrire un programme qui génére une trame sur le model MODBUS/JBUS. J'ai une fonction écrite par le groupe de travail qui calcul un CRC mais je n'arrive pas a m'en servir. J'ai pas codé depuis longtemps et mon C est un peu rouillé.
Voici la fonction en question :
unsigned short CRC16 ( puchMsg, usDataLen ) /* The function returns the CRC as a unsigned short type */
unsigned char *puchMsg ; /* message to calculate CRC upon */
unsigned short usDataLen ; /* quantity of bytes in message */
{
unsigned char uchCRCHi = 0xFF ; /* high byte of CRC initialized */
unsigned char uchCRCLo = 0xFF ; /* low byte of CRC initialized */
unsigned uIndex ; /* will index into CRC lookup table */
while (usDataLen--) /* pass through message buffer */
{
uIndex = uchCRCLo ^ *puchMsg++ ; /* calculate the CRC */
uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex] ;
uchCRCHi = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
Quand j'essaye de m'en servir, j'ai un crash due a une erreure mémoire.
Je dois générer succéssivement des trames et les envoyer sur un port série.
La trame que je dois générer fait 8 bytes CRC inclut : Slave add 2Hex | Function 2Hex | word 4Hex | data 4Hex | CRC 4 Hex|
j'utilise une structure auquel j'initialise les champs qui composeront ma trame
struct sFrame
{
unsigned int champ1;
unsigned int champ2;
...
unsigned int champX
}
struct sFrame * pFrame = (struct *) malloc(sizeof(sFrame));
une fois que j'ai tous mes champs, je dois calculer mon CRC. Pour cela doit assembler ma trame pour l'envoyer a la fonction.
double frameOut * pFrameOut;
J'avais utiliser la fct sprintf( frame, "%x%x%x%x%x", sFrame->champ1, sFrame->champ2 ..... sFrame->ChampX) mais cela ne semble pas marcher. J'ai donc essayer de faire su shift :
frameOut = sFrame->champ1 << 28 + sFrame->champ2 << 24 +sFrame->champ3<<16;
Or quand je fais cela j'obtient une erreure comme quoi le L-value est de type double
Les opérations sur les types je suis pas très au point. qu'est ce que je pourrais changer pour pouvoir utiliser la fonction CRC qui prend en entrée :
unsigned char *puchMsg ; /* message to calculate CRC upon */
unsigned short usDataLen ; /* quantity of bytes in message */
sachant que je dois avoir un mot formaté dans le genre 0x050303740002
Eventuellement, je peux découper en deux mon mot hexa avant de l'envoyer a la fonction CRC et du coup faire deux appels a la fonction - byte high order et low order-
J'espère avoir été un minimum clair
Merci