Pierre BOUSQUET a utilisé son clavier pour écrire :
Bonjour,
j'essai de transcrire un programme de C en WD dont voici le code :
[...]
je sèche un peu, pourriez-vous m'aider
Merci d'avance
Ca ressemble à du CRC16 MODBUS ?
https://groups.google.com/forum/#!topic/fr.comp.developpement.agl.windev/AwgIx_N-mOo
A+
--
Romain PETIT
contact : rompetit chez free fr
+-+ posté sur Usenet avec MesNews et non depuis un forum web +-+
news:fr.comp.developpement.agl.windev
http://www.mesnews.net/
http://fr.wikipedia.org/wiki/Newsgroup
bonjour si c'est du CRC modbus j'avais fais ça (il y a 10 ans ne pas me demander d'explication!)
PROCEDURE calculcrc16RTU(table,lg)
NBCar est un entier Crc_16 est un entier AdrCRC est un entier nCarCRC est un entier NumB est un entier Retenue est un entier CarCRC est un entier
Crc_16=0xFFFF AdrCRC=0xA001
POUR NBCar=1 A lg CarCRC=(table[NBCar]) Crc_16=OUExclusifBinaire(Crc_16,CarCRC) SI Crc_16<0 ALORS Crc_16=Crc_16+65536 NumB=0 TANTQUE NumB<=7 Retenue=ETBinaire(Crc_16,1) Crc_16=PartieEntière(Crc_16/2) SI Retenue ALORS Crc_16=OUExclusifBinaire(Crc_16,AdrCRC) SI Crc_16<0 ALORS Crc_16=Crc_16+65536 FIN NumB++ FIN FIN
RENVOYER (Crc_16)
Pierre BOUSQUET a pensé très fort :
Bonjour,
j'essai de transcrire un programme de C en WD dont voici le code :
Polynom: x16 + x12 + x5 + 1 ⇒ CRC_POLYNOM = 0x8408; Start Value: 0xFFFF ⇒ CRC_PRESET = 0xFFFF; C-Example: unsigned int crc = CRC_PRESET; for (i = 0; i < cnt; i++) /* cnt = number of protocol bytes without CRC */ { crc ^= DATA[i]; for (j = 0; j < 8; j++) { if (crc & 0x0001) crc = (crc >> 1) ^ CRC_POLYNOM; else crc = (crc >> 1); } }
WD : BuffHexa est chaîne = "020016FF81830008010000000000000000000000" b est entier c est entier Polynom est entier = 0x8408 crc est entier = 0xFFFF
POUR b=1 A Taille(BuffHexa) PAS 2 crc=OUExclusifBinaire(crc,HexaVersEntier(Milieu(BuffHexa,b,2))) POUR c=1 A 8 crc=bitDécaleDroite(crc,1)
SI ETBinaire(crc,1) ALORS crc=OUExclusifBinaire(crc,Polynom) FIN FIN FIN
je sèche un peu, pourriez-vous m'aider
Merci d'avance
bonjour si c'est du CRC modbus
j'avais fais ça (il y a 10 ans ne pas me demander d'explication!)
PROCEDURE calculcrc16RTU(table,lg)
NBCar est un entier
Crc_16 est un entier
AdrCRC est un entier
nCarCRC est un entier
NumB est un entier
Retenue est un entier
CarCRC est un entier
Crc_16=0xFFFF
AdrCRC=0xA001
POUR NBCar=1 A lg
CarCRC=(table[NBCar])
Crc_16=OUExclusifBinaire(Crc_16,CarCRC)
SI Crc_16<0 ALORS Crc_16=Crc_16+65536
NumB=0
TANTQUE NumB<=7
Retenue=ETBinaire(Crc_16,1)
Crc_16=PartieEntière(Crc_16/2)
SI Retenue ALORS
Crc_16=OUExclusifBinaire(Crc_16,AdrCRC)
SI Crc_16<0 ALORS Crc_16=Crc_16+65536
FIN
NumB++
FIN
FIN
RENVOYER (Crc_16)
Pierre BOUSQUET a pensé très fort :
Bonjour,
j'essai de transcrire un programme de C en WD dont voici le code :
Polynom: x16 + x12 + x5 + 1 ⇒ CRC_POLYNOM = 0x8408;
Start Value: 0xFFFF ⇒ CRC_PRESET = 0xFFFF;
C-Example:
unsigned int crc = CRC_PRESET;
for (i = 0; i < cnt; i++) /* cnt = number of protocol bytes without CRC */
{
crc ^= DATA[i];
for (j = 0; j < 8; j++)
{
if (crc & 0x0001)
crc = (crc >> 1) ^ CRC_POLYNOM;
else
crc = (crc >> 1);
}
}
WD :
BuffHexa est chaîne = "020016FF81830008010000000000000000000000"
b est entier
c est entier
Polynom est entier = 0x8408
crc est entier = 0xFFFF
POUR b=1 A Taille(BuffHexa) PAS 2
crc=OUExclusifBinaire(crc,HexaVersEntier(Milieu(BuffHexa,b,2)))
POUR c=1 A 8
crc=bitDécaleDroite(crc,1)
SI ETBinaire(crc,1) ALORS
crc=OUExclusifBinaire(crc,Polynom)
FIN
FIN
FIN
bonjour si c'est du CRC modbus j'avais fais ça (il y a 10 ans ne pas me demander d'explication!)
PROCEDURE calculcrc16RTU(table,lg)
NBCar est un entier Crc_16 est un entier AdrCRC est un entier nCarCRC est un entier NumB est un entier Retenue est un entier CarCRC est un entier
Crc_16=0xFFFF AdrCRC=0xA001
POUR NBCar=1 A lg CarCRC=(table[NBCar]) Crc_16=OUExclusifBinaire(Crc_16,CarCRC) SI Crc_16<0 ALORS Crc_16=Crc_16+65536 NumB=0 TANTQUE NumB<=7 Retenue=ETBinaire(Crc_16,1) Crc_16=PartieEntière(Crc_16/2) SI Retenue ALORS Crc_16=OUExclusifBinaire(Crc_16,AdrCRC) SI Crc_16<0 ALORS Crc_16=Crc_16+65536 FIN NumB++ FIN FIN
RENVOYER (Crc_16)
Pierre BOUSQUET a pensé très fort :
Bonjour,
j'essai de transcrire un programme de C en WD dont voici le code :
Polynom: x16 + x12 + x5 + 1 ⇒ CRC_POLYNOM = 0x8408; Start Value: 0xFFFF ⇒ CRC_PRESET = 0xFFFF; C-Example: unsigned int crc = CRC_PRESET; for (i = 0; i < cnt; i++) /* cnt = number of protocol bytes without CRC */ { crc ^= DATA[i]; for (j = 0; j < 8; j++) { if (crc & 0x0001) crc = (crc >> 1) ^ CRC_POLYNOM; else crc = (crc >> 1); } }
WD : BuffHexa est chaîne = "020016FF81830008010000000000000000000000" b est entier c est entier Polynom est entier = 0x8408 crc est entier = 0xFFFF
POUR b=1 A Taille(BuffHexa) PAS 2 crc=OUExclusifBinaire(crc,HexaVersEntier(Milieu(BuffHexa,b,2))) POUR c=1 A 8 crc=bitDécaleDroite(crc,1)
SI ETBinaire(crc,1) ALORS crc=OUExclusifBinaire(crc,Polynom) FIN FIN FIN