Truc de fou : Pointeurs qui ne comprennent pas les cases vides

Signaler
Messages postés
5
Date d'inscription
vendredi 27 mai 2005
Statut
Membre
Dernière intervention
12 juin 2005
-
Messages postés
5
Date d'inscription
vendredi 27 mai 2005
Statut
Membre
Dernière intervention
12 juin 2005
-
Bonjour,

Voilà je suis en train de faire un driver modbus et pour cela j'ai crée une fonction qui calcule le lrc ( controle de validité du message).

Le programme doit fonctionner sous Labwindows cvi.

Concretement la fonction lrc pointe successivement sur tous les élements d'un tableau. Le problème et que si il y a un 0 dans la chaine de caractere la fonctions plante.

Ce qui est vraiment étrange c'est que ce meme code compilé sous Visual fonctionne parfaitement ( je viens d'essayer parcequ'apres avoir cherché longtemps je n'ai pas trouvé d'erreur propre a la sytaxe du C.

Dc si qqun pouvait m'indiquer si il se passe qq chose au niveau du compilateur. merci d'avance

voilà mon code:

// modbus.cpp : Defines the entry point for the console application.
//


#include "stdafx.h" /* sous visual*/
#include /* sous cvi*/



unsigned char Exemple[8]={0x01,0x08,0x00,0x00,0x61,0x62,0x00,0x00} ;



void Num_to_ASCII(unsigned char *Nombre)
{
if (*Nombre 9 Le code ASCII est donné par un décalage de 30
{*Nombre=*Nombre+0x30;}
else // A -> F Il faut indiquer le code
{ switch (*Nombre)
{
case 10:
*Nombre = 0x41;
break;

case 11:
*Nombre = 0x42;
break;

case 12:
*Nombre = 0x43;
break;

case 13:
*Nombre = 0x44;
break;

case 14:
*Nombre = 0x45;
break;

case 15:
*Nombre = 0x46;
break;

default:
break;
}
}
}








unsigned short int calculate_lrc(unsigned char *z_p, unsigned short int z_message_length)
/* Fait tourner l'algorithme de longitudinal de redondance cyclique sur l'entrée z_p
(On donne l'adresse de départ dans l'appel à la fonction)*/
/* Renvoie une valeur de 16 bits LRC après achèvement et ajoute toujours 2 octets LRC au message */



{
unsigned char somme=0;
unsigned char next; // octet sur lequel on travaille
unsigned short int n, LRC=0;
unsigned short int Longueur_Message=z_message_length;
unsigned char lrch, lrcl,lrchA=0,lrclA=0;





/* Calcul de la somme */
while (z_message_length--) {
next = (unsigned char)*z_p;
somme+=next;// On utilise 1 octet pour faire modulo 256
z_p++;// c sur le pointeur que ca merde
}

/* Complément à 2 */
somme = (0xFF-somme)+1;


/* Conversion en ASCII */
lrch=((somme & 0xf0)>>4);
lrcl=(somme & 0x0f);


Num_to_ASCII(&lrch);
Num_to_ASCII(&lrcl);



LRC = (lrchA

5 réponses

Messages postés
5
Date d'inscription
vendredi 27 mai 2005
Statut
Membre
Dernière intervention
12 juin 2005

oui aussi j'ai oublié d'ajouter que si il n'y avait aucun 0 dans la trame la fonction lrc fait bien son travail
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Comment passes tu la taille de la chaine de caracteres a la fonction calculate_lrc() ? Si tu passes cette taille avec un strlen(), la taille ne sera pas correct car le 'calcul' s'arretera au premier 0 rencontré.

+2(p - n)
Messages postés
5
Date d'inscription
vendredi 27 mai 2005
Statut
Membre
Dernière intervention
12 juin 2005

La taille je la passe directement en numérique ou par une variable (enfin c pour plus tard quand j'aurais des trame de longueur variable) et jusqu'a présent je n'ai jamais utilisé de fonction pour ca. dc je comprend pas qu'en changeant de compilateur ca marche! y a peut etre des compilateurs qui croient que les cases avec 0 ne correspondent pas à une variable déclarée non?
Messages postés
202
Date d'inscription
dimanche 18 mai 2003
Statut
Membre
Dernière intervention
6 mars 2010

Moi je trouve ça très bizarre parceque le code a l'air d'être bon. tu
as essayer de debugger ligne a ligne et en vérifiant toutes les sorties.

Voili,Voilou
Messages postés
5
Date d'inscription
vendredi 27 mai 2005
Statut
Membre
Dernière intervention
12 juin 2005

Merci , je commencais a me poser des questions sur mes compétences ;-)

oui j'ai vérifié le prog ac le debugger et en surveillant l'adresse pointée a chaque itération=>
sur visual c : tout se passe bien
sur cvi : Le pointeur n'avance plus si il trouve 0x00