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 <ansi_c.h>/* sous cvi*/
unsigned char Exemple[8]={0x01,0x08,0x00,0x00,0x61,0x62,0x00,0x00} ;
void Num_to_ASCII(unsigned char *Nombre)
{
if (*Nombre<=9) // 0 -> 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<<8) | (lrclA);
z_p=z_p-Longueur_Message;
/*On place le lrc en fin de trame*/
z_p[Longueur_Message+1] = lrcl;
z_p[Longueur_Message] = lrch;
//z_p[Longueur_Message+1] = 0xFF;
//z_p[Longueur_Message] = 0xFF;
return LRC;
}
int main(int argc, char* argv[])
{
calculate_lrc (Exemple,6);
printf("Hello World!\n");
return 0;
}