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

Embarqué Discussion :

Problème d'ouverture/fermerture de port série sur /dev/ttySx


Sujet :

Embarqué

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème d'ouverture/fermerture de port série sur /dev/ttySx
    Bonjour à tous, je suis nouveau sur le forum et satisfait de rejoindre cette grosse communauté de développeurs.

    Je travaille en ce moment sur une carte linux embarqué qui tourne sous Debian, la FOX board G20 : http://www.acmesystems.it/FOXG20, peut-être que certains d'entre vous connaissent...

    Voici mon soucis, j'essaye de faire tourner un programme en C qui, entre-autres, communique via les liaisons série avec d'autres microcontrôlleur.

    A un moment donné je code une fonction qui prend en paramètre le port série concerné (j'ai besoin de /dev/ttyS1 jusqu'à ttyS4) et la trame à envoyer. Je teste si l'ouverture du port se passe correctement...
    Il s'avère à l'exécution que la fonction s'exécute, passe dedans et ressort correctement pendant un temps (j'ai envie de dire aléatoire mais je n'en sais rien) et que d'un coup, le port série reste bloqué, j'ai bien tenté de le fermer mais même la fermeture du port se passe mal...

    J'ai testé la valeur du renvoie du file descriptor et de la fonction close(fd); avec gdb, elles sont toutes deux égales à -1 avant et après les tests.
    Voici la partie de mon code que je soupçonne mal faite (je mets pas tout, ya aps mal de lignes) Je vais en commentaires les breakpoints posés sur gdb.

    Code cpp : 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
     
    // fonction générique utilisé pour écrire une trame sur un des ports COM depuis une valeur lue dans un des registres de la shm
    void sendFrame(int serialNum, char *frameToSend){
        int fd;
        char serialDir[11] = "/dev/ttyS";
        sprintf(serialDir,"%s%1d", serialDir, serialNum);
        if((fd = open(serialDir,O_RDWR|O_NOCTTY|O_NONBLOCK))<0){
            //TODO résoudre problème ouverture
            // gdb indique fd = -1
            int errorRes;
            if((errorRes = close(fd))!=0){
                printf("Erreur de fermeture du port série");
            }
            // gdb indique fd = -1 et close(fd) = -1
            FILE *logFileErr;
            printf("[Ecriture]Erreur d'ouverture port série %s.\n", serialDir);
            fflush(stdout);
            logFileErr = fopen(logFile, "a");
            if(logFileErr == NULL){
                printf ("Erreur d'ouverture du fichier de log.\n");
            }else{
                char *errMsg = NULL;
                sprintf(errMsg, "[Err][Date][Eng:can't open %s][Fr:impossible d'ouvrir %s]\n", serialDir, serialDir);
                fputs(errMsg, logFileErr);
                fclose(logFileErr);
            }
        }else{
            //----Initialisation des ports séries----
            // voir détail de l'initialisation dans readSerialThread()
            tcgetattr(fd, &tty_attributes);
            tty_attributes.c_cflag |= CREAD;
            tty_attributes.c_cflag |= CS8;
            tty_attributes.c_iflag |= IGNPAR;
            tty_attributes.c_lflag &= ~(ICANON);
            tty_attributes.c_lflag &= ~(ECHO);
            tty_attributes.c_lflag &= ~(ECHOE);
            tty_attributes.c_lflag &= ~(ISIG);
            tty_attributes.c_cc[VMIN]=1;
            tty_attributes.c_cc[VTIME]=0;
            cfsetospeed(&tty_attributes,B57600);
            cfsetispeed(&tty_attributes,B57600);
            tcsetattr(fd, TCSANOW, &tty_attributes);
     
            if(write(fd, frameToSend, strlen(frameToSend))!=strlen(frameToSend)){
                MSGDEBUG("erreur d'envoi\n");
            }else{
                MSGDEBUG("trame envoyée\n");
            }
        }
    }

    Et une fois l'erreur apparue, le port série devient définitivement inaccessible et il faut relancer le programme pour qu'il devienne accessible de nouveau. Je soupçonne l'application de garder le contrôle du port (/var/lock) et de ne pas le libérer convenablement.

    Comment faire pour libérer le port série correctement quand il y a une erreur d'ouverture???

    Merci d'avance

  2. #2
    Membre expérimenté

    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 545
    Points : 1 429
    Points
    1 429
    Par défaut
    Bonjour,

    Tu ouvres le port série à chaque appel de sendframe.
    Donc 2 appel consécutif => ouverture d'un port déjà ouvert => problème.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2013
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    OK, bon , je vais me débrouiller ouvrir les liaisons série une fois au début du main et les laisser en écoute..

    Merci à toi.

Discussions similaires

  1. Port série sur Vista
    Par zikototi dans le forum Composants
    Réponses: 1
    Dernier message: 29/08/2009, 22h59
  2. Problème de communication avec un port série
    Par hélène2 dans le forum C#
    Réponses: 8
    Dernier message: 22/04/2009, 09h26
  3. ouverture d' un port série
    Par stgi02 dans le forum MFC
    Réponses: 3
    Dernier message: 07/03/2006, 11h31
  4. Problème avec port Série sur Win XP
    Par alexorel dans le forum MFC
    Réponses: 9
    Dernier message: 27/10/2005, 15h32

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