PhilLu
Messages postés251Date d'inscriptionlundi 9 novembre 2009StatutMembreDernière intervention11 mai 2021
-
25 juin 2005 à 11:44
PhilLu
Messages postés251Date d'inscriptionlundi 9 novembre 2009StatutMembreDernière intervention11 mai 2021
-
2 juil. 2005 à 21:55
Salut,
Comment traduire ceci:
(Code C vers Delphi)
unsigned char crc;
crc = 0x84;
for (i = 0; i <= (message_length-1); i++)
{
crc = ((crc >> 1) | (crc << 7)) ^ message_bytes[i];
}
Commentaires trouvés:
Where message_length is the message length in bytes and message_bytes is the buffer containing the message (excluding the STX, ETX and CRC bytes).
? The CRC calculation excludes the STX, ETX, and the CRC sum byte.
? Example in hex: 02 04 01 00 11 03. Where 02 is the STX and 03 is the ETX. The length is 04 and the calculated CRC is 11.
Merci d'avance!!!
A+
PhilLu
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 25 juin 2005 à 14:51
petite precision supplementaire l'instruction for to do admet un
parametre supplementaire en C qui donne la valeur de l'increment qui
s'il est toujours de 1 en Delphi peut être >1 en C ce qui dans ce
cas oblige a passer par une boucle:
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 25 juin 2005 à 18:23
precision le decalage a droite est une division par deux tu peux donc
remplacer shr( crc) par crc div 2 ce qui donne le même resultat bien
qu'un peu moins performant.
egalement il est bon de savoir qu'une boucle for to do et
une boucle while do ont le même temps d'éxécution ~20ns avec un
processeur a 2,6Ghz
cs_Kenavo
Messages postés702Date d'inscriptionvendredi 21 mars 2003StatutMembreDernière intervention 1 octobre 20095 26 juin 2005 à 21:04
Pot, pot, pot, pot !
>PhilLu
Les traductions C -> Pascal qu'on livré mes confrères
Delphinautes ne sont pas fausses (alors qu'il vaudrait mieux oublier le
C pour bien écrire en Pascal, mais ça doit venir de notre cerveau
reptilien)
Mais y a comme un bug : Où qu'ils rentrent dans l'équation, les octets
de la chaîne de reception entre le STX (Start Of Text) et le ETX (End
Of Text) ? Parce que là tu vas, au mieux, compter le nombre d'octets !
'fectivement, il manque aussi le classique i++ du C dans ton code for machin. Bon qu'il n'y ait pas de code dans la boucle ....
C'est ça qu'est spécial dans le C, c'est qu'on arrive à tout écrire
dans le contrôle de la boucle pour ne pas l'écrire dans la boucle
elle-même ! Faut être vicieux !
Au fait ton CRC, c'est pour quel protocole ? Pas MODBUS ni UNITELWAY, c'est sûr !
>jlen100 très bien shr , pas besoin de div 2, surtout que dans le calcul de CRC, la valeur de la Carry peur être importante !
jlen100
Messages postés1606Date d'inscriptionsamedi 10 juillet 2004StatutMembreDernière intervention25 juillet 201413 27 juin 2005 à 00:36
> salut kenavo,
c'est vrai qu'il y a un bug dans le code de PhilLu et pas qu'un seul
d'ailleurs comme je lui fait remarquer dans ce qu'il a transmis cela
n'est n'y excutable n'y compilable;
d'ailleur le compliateur que j'utilise pour le C me donne une erreur de
compilation (il s'arrete sur la 1ere.) Mais bien que le C soit très
tolérant sur l'évaluation des expressions l'utilisation des
accolades n'est a ma connaissance pas admises mais on peut y mettre des
fonctions des l'instant qu'elle retourne une valeur( peu importe la
valeur même si elle n'affecte pas l'evaluation de la seconde expression)
Quand a oublier le C ce n'est malheureusement pas possible car certains
syteme ne se programment qu'en C (les microcontroleurs par exemple)
qu'en ce n'est pas en assembleur. Cela oblige à une certaine gymastique
cerebrale mais finalement ce n'est pas mauvais pour les neurores bien
quelques fois je peste contre l'un ou l'autre.
enfin pour le shr s'agissant d'un décalage à droite et non
une rotation normalement la carry ne doit pas être affectée d'ailleurs
je ne crois pas qu'il y ait d'instruction pour la tester tant en C
qu'en DELPHI
PhilLu
Messages postés251Date d'inscriptionlundi 9 novembre 2009StatutMembreDernière intervention11 mai 2021 27 juin 2005 à 19:31
Désolé!!!
J'ai beau taper le code correctement, il n'apparait pas correctement dans le groupe de discussion!?!
Pourquoi?
(J'utilise Konqueror sous linux)
A+
Phil.
en effet le C n'admet pas les accolades (begin end) dans l'evaluation d'expression et même en remplaçant les accolades par des parentheses la fonction n'est toujours correcte
si la fonction d'origine comprend une expression autre que i++ il faut passer par une boucle while du genre
i:=0;
while pas( condition_de_sortie) do
begin
traitement de la fonction;
expression modifiant condition_de_sortie
end;
pour information C considere comme toute expression<>0 ce qui ne
simplifie pas la conversion en DELPHI ou l'expression doit être boolean.
desolé de ne pas pouvoir d'aider plus
il est d'ailleurs possible que ton code soit l'objet d'une coquille typographique.
PhilLu
Messages postés251Date d'inscriptionlundi 9 novembre 2009StatutMembreDernière intervention11 mai 2021 30 juin 2005 à 07:11
Salut,
Désolé pour l'attente; voici le code envoyé d'un poste windows:
The algorithm for computing the Cyclical Redundancy Check (CRC) shall be the following C code fragment:
unsigned char crc;
crc = 0x84;
for (i = 0; i <= (message_length-1); i++)
{
crc = ((crc >> 1) | (crc << 7)) ^ message_bytes[i];
}
Where message_length is the message length in bytes and message_bytes is the buffer containing the message (excluding the STX, ETX and CRC bytes).
The CRC calculation excludes the STX, ETX, and the CRC sum byte.
Example in hex: 02 04 01 00 11 03. Where 02 is the STX and 03 is the ETX. The length is 04 and the calculated CRC is 11.
J'èspère qu'il passe cette fois ci!!!
A+
Phil.