IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Plantage sur réception RS232


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 14
    Par défaut Plantage sur réception RS232
    Bonjour,

    Je suis en train de me faire une petite application sous linux. J'utilise le C. Pour simplifier, j'écoute un des ports RS232 pour receptionner une trame de 6 octets. La reception se fait a interval régulier et que j'ai fixé a 5 min environ. Probleme par moment et de facon completement aléatoire (au bout d'une heure, ou quelques jours), mon application n'affiche plus rien (Je fais l'affichage des octets recus a l'écran avec l'heure et dans un fichier txt). J'ai désactivé la gestion d'énergie, de mise en veille pensant que cela perturbait. Pas concluant. Si dans ma fenetre SHELL, j'arrete le prog et je relance cela repart mais pour un certain temps. En plus aucun message d'erreur.

    J'aurais souhaité quelques idées pour debugger mon probleme sachant que j'ai l'impression que c'est ma RS232 qui retourne rien. (J'ai aussi essayer un autre port)

    ci joint bout de code de l'initialisation du port ....

    fd = open(MODEMDEVICE, O_RDWR | O_NDELAY | O_NOCTTY );
    if (fd <0) {perror(MODEMDEVICE); exit(-1); }
    tcgetattr(fd,&oldtio);
    bzero(&newtio, sizeof(newtio));
    newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR;
    newtio.c_oflag = 0;

    newtio.c_lflag = 0;
    newtio.c_cc[VTIME] = 0;
    newtio.c_cc[VMIN] = 1;

    tcflush(fd, TCIFLUSH);
    tcsetattr(fd,TCSANOW,&newtio);

    while (STOP==FALSE)
    { res = read(fd,buf,255);
    if (res>0)
    { .
    .
    Traitement
    .
    .
    }
    usleep(10000); /* Pour éviter l'utilisation permanente du proc */
    }


    Merci d'avance

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Par défaut
    Pourquoi gérer un port serie par lecture systematique ?
    pose un signal pour activer la lecture uniquement quand des données sont disponibles, cela ne prend pas de temps CPU et évite tous risque de "perte" de données dans le buffer ou de perte de synchronisation (temps peut précis).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 14
    Par défaut Plantage sur réception RS232
    Bonjour,

    OK, mais je ne suis pas assez calé en programmation système sous linux. Les signaux j'en aient entendu parlé mais je ne sais pas comment les mettre en place

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    Tu devrais utiliser valgrind pour debugger le problème

  5. #5
    Nouveau membre du Club
    Profil pro
    télégestion dans le domaine de l'eau
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : télégestion dans le domaine de l'eau

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Par défaut
    J'utilise la fonction poll pour que éviter que la lecture de la liaison série soit trop pénalisante pour les autres process. Tant que rien a été reçu, cette fonction n'utilise pas le CPU. Le temps d'attente peut être borné avec un timeout. Les événements attendus sont paramétrés dans une structure passée à la fonction.
    Dans l'exemple qui suit le timeout est fixé à 1000ms.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
       #include <sys/poll.h> 
       struct pollfd ufds;
       ufds.fd = fd;
       ufds.events = 0x0 |POLLIN|POLLPRI|POLLHUP|POLLERR;
       ufds.revents = 0x0;
     
       poll(&ufds,1,1000);
       if (ufds.revents && (POLLIN|POLLPRI)) {
         res=read(fd,buf,6);
         Traitement
       } else {
          Erreur de réception ou dépassement de temps
       }

Discussions similaires

  1. [Débutant] Timer sur réception RS232
    Par Daetheia dans le forum VB.NET
    Réponses: 6
    Dernier message: 10/02/2012, 11h19
  2. [MFC] Plantage sur LoadFrame
    Par thieum74 dans le forum MFC
    Réponses: 11
    Dernier message: 06/09/2007, 13h15
  3. [firefox] plantage sur une url
    Par ggnore dans le forum Firefox
    Réponses: 2
    Dernier message: 12/05/2005, 22h06
  4. [DB2]Plantage sur COMMIT
    Par Dundee dans le forum DB2
    Réponses: 1
    Dernier message: 24/11/2004, 11h05
  5. [LG]plantage sur une commande basique !
    Par Jeff on the web dans le forum Langage
    Réponses: 5
    Dernier message: 13/01/2004, 19h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo