Crc C>Delphi

PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021 - 25 juin 2005 à 11:44
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 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

15 réponses

jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
25 juin 2005 à 14:17
salut,

tu peux tradiure ainsi:

unsigned char crc -> var crc:char;( ou byte)

crc = 0x84;->crc:=$84;(valeur hexadecimale);

par contre dans l'expression:

for (i 0; i { crc ((crc >> 1) | (crc } il doit y avoir une erreur de transcription

en effet

1) { correspond au begin

2) ] correspond a end;

3) for (i = 0; est incomplete -> for expression:= constante to constante do

{crc = ((crc >> 1) | (crc }-> ici encore les parentheses sont incorrectes 3 prentheses ouvrantes et 1 fermante

begin

crc:= inc(crc) or crc

end;
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
25 juin 2005 à 14:30
salut,une petite ereur s'est glissée

au lieu de

begin

crc:= inc(crc) or crc

end;

c'est

begin

crc: = shr(crc) or crc

end;

en fait crc := decalage à droite de crc (une fois) ou binaire du resultat avec crc
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
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:

while expression< valeur finale do

begin

actions a faire pendant la boucle

expression:=expression+increment;

end,
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
25 juin 2005 à 16:14
Merci jlen, je teste et je te dit quoi!
A+
PhilLu
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
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
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
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 !



Ken@vo

<hr size="2" width="100%">Code, Code, Codec !

[%3C/body ]
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
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
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
27 juin 2005 à 19:24
Voici le code correct (désolé le copié-collé à échoué)

unsigned char crc;
crc=0x84;
for (i=0;i<=(message_length-1);i++)
{
crc=((crc>>1)|(crc<<7))^message_bytes[i];
}

Ceci pour du protocole ASTM.
Merci pour votre aide (la ligne entre {} ne me dit vraiment rien!!!
A+
Phil.
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 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.
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
27 juin 2005 à 20:43
sans le code correct il m'est impossible de t'aider

en effet la compilation du code que tu donnes est impossible en C ANSI

je l'ai inclus dans une fonction d'un projet en cours

void essai(void)

{

unsigned char crc,i;

crc=0x84;

for (i=0;i{crc=((crc>>1)|(crc};

}

et voici le resultat:

Y:\CODESOURCE\MATERV1\MAIN.C (695,27) : ERROR (100) Syntax error

Y:\CODESOURCE\MATERV1\MAIN.C (695,27) : ERROR (193) Missing ";" detected

Y:\CODESOURCE\MATERV1\MAIN.C (695,32) : ERROR (100) Syntax error

Y:\CODESOURCE\MATERV1\MAIN.C (695,32) : ERROR (100) Syntax error

Y:\CODESOURCE\MATERV1\MAIN.C (695,32) : ERROR (193) Missing ")" detected

Linking...

WARNING (731) --> File ".\main.obj" is not found.

la premiere coresspond a l'accolade ouvrante

la seconde a (crc

les suivantes indique des erreurs générales

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.
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
27 juin 2005 à 21:12
Si on part de l'exemple donné, et des indication C ca pourrait être :



function ChaineATransmettre(s : string) : string;

const

STX = #2;

ETX = #3;

var

CRC : Byte;

i : Integer;

begin

CRC : = $84;

for i:= 1 to length(s) do

CRC : = (CRC shr 1) xor ord(s[i]);

Result := STX + s+ Chr(CRC) + ETX

end ;




ce qui avec la chaine s = #4#1#0 donne le résultat prévu (s := ChaineATransmettre(#4#1#0);)



Mais ce n'est là que pure spéculation ......



Ken@vo
<hr size="2" width="100%">Code, Code, Codec !




http://noepatents.eu.org/index.php/NON_aux_brevets_logiciels
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 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.
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
30 juin 2005 à 10:10
Ben voilà, la fonction de calcul de CRC est donc :




function ChaineATransmettre(s : string) : string;
const
STX = #2;
ETX = #3;
var
CRC : Byte;
i : Integer;
begin

// Calcul du CRC

CRC : = $84;
for i:= 1 to length(s) do
CRC : = (CRC shr 1) or (CRC shl 7)) xor ord(s[i]);



// Contitution de la chaine
Result := STX + s+ Chr(CRC) + ETX
end ;






Ken@vo

<hr size ="2" width="100%">Code, Code, Codec !

[%3C/body ]
0
jlen100 Messages postés 1606 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 25 juillet 2014 13
30 juin 2005 à 22:59
rien a redire sur la solution de kenavo ça va nettement mieux avec le bon code
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
2 juil. 2005 à 21:55
Merci, cette fois c'est la bonne!!!
A+
PhiLu
0
Rejoignez-nous