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

POSIX C Discussion :

Pb fonction read sur port série - GCC LINUX


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Points : 16
    Points
    16
    Par défaut Pb fonction read sur port série - GCC LINUX
    Bonjour,

    J'ai un souci avec une fonction read dans un thread avec GCC sous Linux.
    Mon code est en gros le suivant :

    while(1)
    {
    read(GLOBALE_PortCOM2,&c,1);
    ...
    }

    Le problème est que l'identificateur de port se passe a 0 tout seul :
    GLOBALE_PortCOM2 = 6 aprés ouverture du port (Normal : OK)
    GLOBALE_PortCOM2 passe à 0 tout seul, j'ai l'impression aléatoirement après un read !!!

    Je ne comprends pas pourquoi, quelqu'un peut il m'éclairer un peu ???

    Merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Il est plus que probable que tu aies un dépassement de tableau quelque part, qui vient écraser la variable juste à côté, en l'occurrence « GLOBALE_PortCOM2 ».

    Montre-nous ton code en entier (avec les balises [code] et [/code]). L'erreur n'est probablement pas très loin.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Est il possible de l'identificateur soit modifié automatiquement par appel de fonctions read ou write ?

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Oui !

    Montre-nous ton code, s'il-te-plaît.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Désolé pour le retard, voici le code de la boucle sur le quel l'id est modifié :

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
    while(1)
    	{
    	/* reception d'un caractere */
    	read(GLOBALE_PortCOM2,&c,1);
     
    	/* Traitement reception \r\n : on sort sur \r mais on doit supprimer \n */
    	if(MsgCmdeLCRModeTerminal.Cmde.Ptr == 0 && c == '\n')
    		continue;
     
    	/* Remise a 0 du pointeur reception pour vider le buffer */
    	if(MsgCmdeLCRModeTerminal.Cmde.Ptr < 4
    	   && (c == '-' || c == ENQ || c == STX || c == ETB))
    		MsgCmdeLCRModeTerminal.Cmde.Ptr = 0;
     
    	/* traitement du caractere recu */
    	if(c == CR)
    		{
    		MsgCmdeLCRModeTerminal.Cmde.Table[MsgCmdeLCRModeTerminal.Cmde.Ptr++] = NUL;
     
    		/* Si mode terminal interdit ou time out validite du mode Trm atteint */
    		if(GLOBALE_CfgSetu.Port2[COURANTE].Pr == 'O'
    			&& GLOBALE_Compteurs.TimeOutValiditeTrmPort[TEDI2] >= 60)
    			return(MODE_TERMINAL);
     
    		/* Je teste si j'ai deja quelque chose en attente dans la file d'emission du port */
    		msgctl(MsgCmdeLCRModeTerminal.IdMsgReponseLCR,IPC_STAT,&InfoFile);
    		if(InfoFile.msg_qnum > 0)
    			{
    			/* On vide la boite a message */
    			while(msgrcv(MsgCmdeLCRModeTerminal.IdMsgReponseLCR, (char *)&MsgReponseLCR, sizeof(MSG_REPONSE_LCR), getpid(), IPC_NOWAIT) >= 0);
    			}
     
    		/* Envoi du message commande LCR a la tache analyseur LCR */
    		MsgCmdeLCRModeTerminal.MsgType = getpid();
    		msgsnd(GLOBALE_IdMsgReceptionCmdeLCR, (char*)&MsgCmdeLCRModeTerminal, sizeof(MSG_COMMANDE_LCR), IPC_NOWAIT);
     
    		/* todo RAF : Débloquer au bout de 5 s */
    		Ret = msgrcv(MsgCmdeLCRModeTerminal.IdMsgReponseLCR, (char *)&MsgReponseLCR, sizeof(MSG_REPONSE_LCR), getpid(), 0);
     
    		if(Ret >= 0)
    			{
    			if(MsgReponseLCR.TypeReponseTEDI == R1)
    				{
    				/* Raz timer validite mode terminal */
    				GLOBALE_Compteurs.TimeOutValiditeTrmPort[TEDI2] = 0;
    				return(MODE_TERMINAL);
    				}
    			else if(MsgReponseLCR.TypeReponseTEDI == R2)
    				{
    				/* Raz timer validite mode terminal */
    				GLOBALE_Compteurs.TimeOutValiditeTrmPort[TEDI2] = 0;
    				return(MODE_TERMINAL);
    				}
    			else if(MsgReponseLCR.TypeReponseTEDI == R3)
    				{
    				/* Raz timer validite mode terminal */
    				GLOBALE_Compteurs.TimeOutValiditeTrmPort[TEDI2] = 0;
     
    				/* teste si la reponse est un point d'interrogation */
    				if(strcmp(MsgReponseLCR.Reponse,"?") == 0)
    					{
    					/* emission de la reponse LCR */
    					strcpy(Emission,MsgReponseLCR.Reponse);
    					write(GLOBALE_PortCOM2,Emission,strlen(Emission));
    					}
    				else
    					{
    					/* il faut y ajouter un point d'interrogation */
    					strcpy(Emission,MsgReponseLCR.Reponse);
    					strcat(Emission,"?");
    					write(GLOBALE_PortCOM2,Emission,strlen(Emission));
    					}
    				return(MODE_TERMINAL);
    				}
    			else if(MsgReponseLCR.TypeReponseTEDI == R4)
    				{
    				/* emission de la reponse LCR */
    				strcpy(Emission,"!");
    				write(GLOBALE_PortCOM2,Emission,strlen(Emission));
     
    				return(MODE_TERMINAL);
    				}
    			else if(MsgReponseLCR.TypeReponseTEDI == R5)
    				{
    				/* emission de la reponse LCR */
    				strcpy(Emission,MsgReponseLCR.Reponse);
    				strcat(Emission,"!");
    				write(GLOBALE_PortCOM2,Emission,strlen(Emission));
     
    				/* Activaton du TRM seulement sur emission d'une reponse*/
    				SYSTEM_ActivationTRM(MsgCmdeLCRModeTerminal.Origine);
     
    				return(MODE_TERMINAL);
    				}
    			else
    				{
    				/* Raz timer validite mode terminal */
    				GLOBALE_Compteurs.TimeOutValiditeTrmPort[TEDI2] = 0;
    				return(MODE_TERMINAL);
    				}
    			}
    		}
    	else
    		{
    		if(MsgCmdeLCRModeTerminal.Cmde.Ptr < TAILLE_MAX_CMD_LCR)
    			{
    			/* test de changement de mode */
    			if(c == '-' && MsgCmdeLCRModeTerminal.Cmde.Ptr == 0)
    				return(MODE_TEST);
    			if(c == ENQ)
    				return(MODE_BASE_ENQ);
    			if(c == STX)
    				return(MODE_BASE_STX);
     
    			/* test du backspace */
    			if (c == 0x08)
    				{
    				if(MsgCmdeLCRModeTerminal.Cmde.Ptr != 0)
    					MsgCmdeLCRModeTerminal.Cmde.Ptr--;
    				}
    			else
    				MsgCmdeLCRModeTerminal.Cmde.Table[MsgCmdeLCRModeTerminal.Cmde.Ptr++] = c;
    			}
    		else
    			return(MODE_TERMINAL);
    		}
    	}

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Le problème a été résolu avec une gestion différente du thread

Discussions similaires

  1. Communication sur port série (linux)
    Par Efhache84 dans le forum Débuter
    Réponses: 4
    Dernier message: 06/03/2009, 22h11
  2. Lecture sur port série sous Linux
    Par DangerousBowlOfJelly dans le forum C
    Réponses: 6
    Dernier message: 28/03/2008, 17h00
  3. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 10h43
  4. Etat de CTS sur port série
    Par Juste_Une_IlluZion dans le forum C++Builder
    Réponses: 9
    Dernier message: 12/09/2004, 10h46
  5. [Débutant] Réception sur port série
    Par Tophe59 dans le forum Langage
    Réponses: 43
    Dernier message: 28/06/2004, 11h04

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