Partage
  • Partager sur Facebook
  • Partager sur Twitter

Communication série RS485 - Protocole Modbus - RTU

Problème de lecture de trame

15 septembre 2020 à 16:14:18

Bonjour à tous,

J'ai un soucis très spécifique dans le domaine des automates. 

Je vais tenté de vous expliquer au mieux et je vous remercie d'avance pour votre future aide.

Pour contextualiser, je dois envoyer des données issues d'un lidar à un automate en protocole Modbus RTU via une communication série RS485.

Dans cet exemple, je suis considéré comme le second esclave, pas le premier. 

Je dois dans un premier temps, lire la trame de mon maitre automate, avec la fonction lecture puis les stocker dans un tableau de char puis envoyer les données que je souhaite via la fonction write.

Je ne sais pas si j'ai bien déclaré mes paramètres de mon port série RS485 mais j'ai un soucis uniquement pour la  partie lecture de la trame du maitre.

Lors que je lis ma trame, il ne s'arrête pas au bit stop. Donc je n'arrive pas à avoir les bonnes trames au bon format Modbus.

Comment gérer le bit stop dans la lecture d'une trame? 

Le but c'est que la lecture de la trame fasse :

1 bit Start : trame du maitre : 1 bit Stop    -   1 bit start : trame de l'esclave UN : 1 bit stop    -  1 bit Start : trame du maitre : 1 bit Stop    -   1 bit start : trame de l'esclave Deux : 1 bit stop


Mon programme gère n'importe comment les flags. Pouvez me dire comment faire pour que la lecture de la trame s'arrête au bit stop? 

Voici un exemple de mon code, donc pas le code en entier. 

#include <stdio.h>
 
#include <stdlib.h>
 
#include <time.h>
 
#include <termios.h>
 
#include <asm/ioctls.h>
 
#include <sys/ioctl.h>
 
#include <fcntl.h>
 
#include <string.h>
 
#include <errno.h>
 
#include <unistd.h>
 
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
////////////////////////////////////////////////////////        Program         ////////////////////////////////////////////////////////////
 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
int main() {

 
//initialisation du rs485
 
  char dev[] = "/dev/ttyUSB1";
 
  char lecture[10]={0};
 
  int  baudrate = B19200;
 
  int status;
 
  int serial_port;
 
  struct termios ti;

 
  serial_port = open(dev, O_RDWR|O_NONBLOCK | O_NOCTTY); 
 
    if (serial_port < 0) {
 
    printf("ERROR! Failed to open %s\n", dev);
 
    return -1;
 
     }
 
 
// configurarion du port serie en rs485
 

 
  tcgetattr(serial_port, &ti);         // Lire l ancienne config du serial port
 
  cfsetospeed(&ti,baudrate);  // configurer vitesse TX
 
  cfsetispeed(&ti,baudrate);  // Configurer vitesse RX
 
  ti.c_cflag |= CS8;   // 8 bit de data
 
  ti.c_iflag |= IGNPAR;  // ignorer les erreurs de parités
 
  ti.c_cflag &= ~PARENB; //pas de parité
 
  ti.c_cflag &= ~CSTOPB; // 1 bit de stop
 
  ti.c_cflag &= ~CSIZE; //option a 0
 
  ti.c_cflag &= ~CRTSCTS;
 
  ti.c_iflag &= ~(IXON | IXOFF | IXANY);
 
  ti.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL);
 
  cfmakeraw(&ti);
 
  tcsetattr(serial_port, TCSANOW, &ti);  // configurer la nouvelle config serial port
 
    ti.c_cc[VTIME] = 0;    // Wait for up to 1s (10 deciseconds), returning as soon as any data is received.
 
    ti.c_cc[VMIN] = 0;

 
    while (1)
 
    {
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Tableau d'échange ///////////////////////////////////
 
        printf("lecture des donnees en cours \n");
 
        printf("tableau d echange :\n");
 
         
        // On met le flag a zero et on va lire la trame du maitre
 
       int flag = fcntl(serial_port,F_GETFL,0);
 
        fcntl(serial_port,F_SETFL,flag);
 
        read(serial_port, lecture, sizeof(lecture));
 
        int l;
 
        for (l=0;l<8;l++)
 
        {
 
            printf("message recu %X ",lecture[l]);
 
        }
 
        printf("\n");

}

Merci pour votre aide. 

  • Partager sur Facebook
  • Partager sur Twitter
16 septembre 2020 à 18:39:45

Bonjour,

Doublon

Les doublons nuisent au bon fonctionnement du forum et sont donc interdits. Si vous vous êtes trompé de section, il suffit de signaler votre sujet au staff pour qu'il le déplace au bon endroit.

Je vous invite à continuer la discussion sur l'autre sujet :  https://openclassrooms.com/forum/sujet/probleme-de-timing-de-lecture-de-trame-rs485

Je ferme ce sujet. 

  • Partager sur Facebook
  • Partager sur Twitter