Bonjour, j'ai un projet en info a réalisé sur un CHarlyRobot 30, en bref recevoir un fichier en Gcode et le traduire en langage machine CharlyRobot mais la j'ai une erreur donc Erreur de segmentation (core dumped) et je ne sais pas ce que c'est, j'ai cru comprendre que c'etait en raport avec les bufer ou pointeur mais sinon rien d'autre donc voici mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
void Mouvement(char *chaine_entrante){
 
printf("Entrer dans mouvement\n");
 
/***************************initialisation des variables******************************************************/
	int ret_rs_open  = 0;
	unsigned char buffer_methode[5];
	unsigned char buffer[46];
	char *pointeur; 
	int time_mvt =0, num_axe = 0;
	int compteur_axe = 0;
	int i = 0, j = 0;
	int vit_X = 0, vit_Y = 0, vit_Z = 0,vit_Z_retour = 0;
	char quel_axe;
	char methode = ' ';
 
	struct sigaction act;
    act.sa_handler = arret;
	signal(SIGINT,arret);	/*Interception des signaux ctrl^c et ctrl^z*/
	signal(SIGTSTP,arret);
 
 
	ret_rs_open = RS_open("USB1",9600,8,1,'N',1);
 
	printf("Test avant if");
 
	if( ( ret_rs_open)!= -1){		/*On test si la liaison à été effectuée, si 'ret_rs_open' est égale à -1 cela veut dire que la liaison n'a pas fonctionner */
 
/* On utilise la méthode strtok pour isoler les coordonnées et la méthode */
 
		/*Premier appel du strtok*/
		pointeur = strtok( chaine_entrante, " " );
 
		if(strcmp(pointeur,"@0A") == 0){
			buffer[i] = 0x40;
			i++;
			buffer[i] = 0x30;		//Deplacement relatif
			i++;
			buffer[i] = 0x41;
			i++;
			buffer[i] = 0x20;
			i++;
			methode = 'R';
		}
		else if(strcmp(pointeur,"@0M") == 0){
			buffer[i] = 0x40;
			i++;
			buffer[i] = 0x30;		//Deplacement absolue
			i++;
			buffer[i] = 0x4D;
			i++;
			buffer[i] = 0x20;
			i++;
			methode = 'A';
		}
		else{
			printf("Erreur de méthode de déplacement \n");
			close(ret_rs_open);
			exit(-1);	
		}
 
 
		while( pointeur != NULL ){
			pointeur = strtok( NULL, ",");			/* puis on cherche les autres séparateur */
			printf("Pointeur : %s \n",pointeur);
			compteur_axe++;
 
		/*Test de dépassement de l'espace de travail */
 
				switch(compteur_axe){
					case '1' :	quel_axe = 'X';
								X = *pointeur;
					case '2' :	quel_axe = 'X';
								vit_X = *pointeur;
					case '3' :	quel_axe = 'Y';
								Y = *pointeur;
					case '4' :	quel_axe = 'Y';
								vit_Y = *pointeur;
					case '5' :	quel_axe = 'Z';
								Z = *pointeur;
					case '6' :	quel_axe = 'Z';
								vit_Z = *pointeur;
					case '7' :	quel_axe = 'Z';
								Z_retour = *pointeur;
					case '8' :	quel_axe = 'Z';
								vit_Z_retour = *pointeur;
 
					default : printf("Default compteur axe");	
				}
 
			if(methode == 'A'){				/*Test si la methode est absolue*/
 
				if( ( (*pointeur > 25000) && (compteur_axe == 1 || 2 )  ) || ( (*pointeur > 40000) && (compteur_axe == 3 || 4) ) || ( (*pointeur > 10000) && ( compteur_axe == 5) ) || ( (*pointeur< -10000) && (compteur_axe == 6 ) ) ){
 
					printf("Erreur :: espace de travail de l'axe %c dépasser",quel_axe);
					close(ret_rs_open);
					exit(-1);
				}
 
			}
			else if(methode == 'R'){		/*Ou relatif*/
 
				if( ( ((*pointeur + X) > 25000) && (compteur_axe == 1 || 2 )  ) || ( (*pointeur > 40000) && (compteur_axe == 3 || 4) ) || ( (*pointeur > 10000) && ( compteur_axe == 5) ) || ( (*pointeur< -10000) && (compteur_axe == 6 ) ) ){ 
 
					printf("Erreur :: espace de travail de l'axe %c dépasser",quel_axe);
					close(ret_rs_open);
					exit(-1);
 
				}
			}
 
/*On lit les caractère scinder par strtok dans pointeur et on les entres dans le buffer pour l'envoie*/
 
			for(j = 0; j > sizeof(&pointeur ); j++){
				if(		*pointeur+j == '0')buffer[i] = 0x30;
				else if(*pointeur+j == '1')buffer[i] = 0x31;
				else if(*pointeur+j == '2')buffer[i] = 0x32;
				else if(*pointeur+j == '3')buffer[i] = 0x33;
				else if(*pointeur+j == '4')buffer[i] = 0x34;
				else if(*pointeur+j == '5')buffer[i] = 0x35;
				else if(*pointeur+j == '6')buffer[i] = 0x36;
				else if(*pointeur+j == '7')buffer[i] = 0x37;
				else if(*pointeur+j == '8')buffer[i] = 0x38;
				else if(*pointeur+j == '9')buffer[i] = 0x39;
				else if(*pointeur+j == '-')buffer[i] = 0x2D;
				else{
					printf("Erreur Caractère non connue"); 
					close(ret_rs_open);
					exit(-1);		
				}
 
				i++;
			}
 
			buffer[i] = 0x2C;
			i++;
 
		}
 
		/********************************************on entre la configuration des axes**************************************************/
/****On l'entre en dernier car pour connaitre le nombre d'axe il faut avoir finit le comptage d'axe grace a la methode strtok****/
			buffer_methode[0]  = 0x40;
			buffer_methode[1]  = 0x30;
 
			switch(num_axe){			/* Test de num_axe, l'entier caluler grâce au strtok qui definie le nom_axe */
				case '1' : buffer_methode[2] = 0x31;
				case '3' : buffer_methode[2] = 0x33;
				case '7' :
				default : buffer_methode[2] = 0x37;
			}
			buffer_methode[3] = 0x0D;
		RS_write(buffer_methode,4,ret_rs_open);			/* On envoie sur la liaison le contenu du buffer*/
		RS_write(buffer,i,ret_rs_open);
 
 
 
/************************Calcul du temps de déplacement pour faire le mouvement******************************/
 
		if( (num_axe == '1') || (num_axe == '3') ){
			time_mvt = 0;
			time_mvt = (X/vit_X) + (Y/vit_Y);			
 
		}
		if( (num_axe == '7') ){
			if( X > Y )			/*Si la distance X est plus grande que Y */
			{
				time_mvt = 0;
				time_mvt = X/vit_X;		/*on calcule en seconde le temps que mais le charlyrobot pour aller en pos X a la vitesse vit_X*/		
			}
 
			else				/*Si la distance Y est plus grande que X */
			{
				time_mvt = 0;
				time_mvt = Y/vit_Y;
			}
		}
 
	}
	else
	{
			printf("Erreur d'ouverture liaison \n");
			exit(-1);
	} 
 
	sleep(time_mvt);
	printf("Fermeture de la liaison \n");
	close(ret_rs_open);
}