Bonjour a toutes et tous,
Je souhaite solliciter votre aide pour de la communication série en C. J'ai écris un programme en C qui me permet de réaliser la communication en série (protocole MODBUS/JBUS) entre une carte d'entrées/sorties et mon PC (je travail sous linux Ubuntu et j'utilise eclispe comme environnement de développement).
Pour définir ma communication série, j'utilise la structure termios utilisée dans la fonction suivante:
J'ai écris une nouvelle fonction dans laquelle je demande de lire n mots à à partir de l'adresse 0:
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 int configurationPort() { int port_serie; struct termios options; port_serie = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);//lecture et ecriture | pas controlling terminal | ne pas attendre DCD //cas d'erreur d'ouverture if(port_serie < 0) { perror("Erreur d'ouverture du port serie"); exit(-1); } else { printf("Port serie numero %d bien ouvert. \n", port_serie); //chargement des données tcgetattr(port_serie, &options); //B38400 bauds cfsetospeed(&options, B38400); options.c_cflag |= (CLOCAL | CREAD);//programme propriétaire du port //structure en 8N1 !! options.c_cflag &= ~PARENB; //pas de parité options.c_cflag &= ~CSTOPB; // 1 bit de stop options.c_cflag &= ~CSIZE; //option a 0 options.c_cflag |= CS8; //8 bits tcsetattr(port_serie, TCSANOW, &options); //enregistrement des valeurs de configuration printf("Configuration OK strcuture en 8N1 !. \n"); } printf("DEBUG: fin configuration port\n"); return(port_serie); }
et dans mon programme main, voici ce que je fais:
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 void lectureSortiesTOR(int port) { /*========================================= * Description : Formate la trame ModBus et envoi la trame creee *=========================================*/ int nombreOctetsEcris; // variable de vérification pour l'écriture sur le port char bufferEmissionModBus[8]; bufferEmissionModBus[0] = 2; bufferEmissionModBus[1] = 4; bufferEmissionModBus[2] = 0 / 256; bufferEmissionModBus[3] = 0 & 255; bufferEmissionModBus[4] = 0 / 256; bufferEmissionModBus[5] = 9 & 255; addCRC16(bufferEmissionModBus, 8 - 2); // ajout du CRC sur les deux derniers octets du tableau 'bufferEmissionModBUS' nombreOctetsEcris = write(port, bufferEmissionModBus, 8); // écriture sur le port série printf("DEBUG: nombre octets ecris = %d\n", nombreOctetsEcris); if (nombreOctetsEcris < 0) { perror("ERROR\n"); printf("DEBUG: visualisation d'une erreur\n"); } printf("DEBUG: Envoie Termine.\n"); }
(la fonction initialisation n'a aucune incidence sur la communication série, c'est pour cela que je n'en parle pas). Maintenant,ce que je veux faire et c'est là que j'ai un problème, c'est que je veux récupérer dans un tableau la réponse de la demande faite en MODBUS/JBUS.
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 int main(void) { int port_serie; printf("DEBUG: Lancement du programme\n"); initialisation(); printf(flagComStarted ? "DEBUG: true\n" : "DEBUG: false\n"); port_serie = configurationPort(); while(1) { sleep(1); lectureSortiesTOR(port_serie); printf("Boucle lectureSortiesTOR"); } return(0); }
J'ai trouvé sur internet une fonction qui utilise le read:
Donc je voulais savoir si cette fonction peut marcher pour récupérer la réponse de ma demande MODBUS/JBUS et je voulais savoir aussi à quelle moment je dois l'utiliser parce que j'ai un gros doute là dessus.
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 void onDataAvailable(int port) { /*========================================= * Description : Lecture du port série *=========================================*/ int reception; char buffer[23] = ""; printf("Lecture des donnees en cours ... \n"); fcntl(port,F_SETFL,10);//mode bloquant pour la fonction read() si aucun caractere dispo, programme attend reception = read(port, buffer, 23);//buffer contitendra les données, 23 est le nombre d'octets a copier dans cet espace printf("message recu : %s\n",buffer); if(reception == -1) { printf("DEBUG: Erreur lecture\n"); } else { printf("DEBUG: Reception finie\n"); } }
Merci d'avance pour vos réponses,
Cordialement
Partager