Récupérer la réponse d'une demande MODBUS/JBUS en C
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:
Code:
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);
} |
J'ai écris une nouvelle fonction dans laquelle je demande de lire n mots à à partir de l'adresse 0:
Code:
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");
} |
et dans mon programme main, voici ce que je fais:
Code:
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);
} |
(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.
J'ai trouvé sur internet une fonction qui utilise le read:
Code:
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");
}
} |
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.
Merci d'avance pour vos réponses,
Cordialement