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

C Discussion :

Problème lors de réception d'une chaîne de caractères


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut Problème lors de réception d'une chaîne de caractères
    Bonjour,

    J'ai un petit problème, j'aimerais réceptionner une chaîne de caractères via un gets depuis le port série de ma carte, la chaîne change constamment (chaîne de date et chaîne d'heure) du coup je ne vois pas comment l'a récupérée?

    J'ai fait des tests comme ça :

    Nom : pb gets1.jpg
Affichages : 892
Taille : 93,6 Ko


    En mettant un gets et en incluant une variable heure (de cette manière "char heure[7]" ). J'ai aussi mis un ( "if (heure[7] != 'H','A','+','-','I' ) car ce sont des caractères que j'utilise déjà mais je ne suis pas sur du tout pour cette partie, je ne voyais pas comment récupérer une chaîne inconnue..

    Dans tous les cas, quand je fou un gets dans le même programme d'interruption qu'un getc (que j'utilise pour la réception de caractère), mon getc ne fonctionne plus (le gets ne marche pas non plus d'ailleurs).

    Quelqu'un aurait une piste?

    Merci

  2. #2
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    Bonjours

    Pour t'aider j'aurais besoin de quelque exemple de ce que retourne ton get stp
    N'oublie pas le pouce vert

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par sourcilpower Voir le message
    Bonjours

    Pour t'aider j'aurais besoin de quelque exemple de ce que retourne ton get stp

    Bonjour,

    Le gets doit récupérer la date sous la forme "x/yy/zz", j'en ai un à faire aussi pour l'heure dans un format similaire, c'est pour ca que j'ai introduit un "char heure[7]" comme 7 caractères, je ne sais pas si c'est juste :/

    Merci

  4. #4
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    gets prend un char * donc char *heure serais plus approprier et pour ton if tu veux faire quoi exactement ?
    N'oublie pas le pouce vert

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par sourcilpower Voir le message
    gets prend un char * donc char *heure serais plus approprier et pour ton if tu veux faire quoi exactement ?


    Oui j'ai mis un "char heure[7]" c'est pas ca qu'il faut?

    Sinon mon if ne sert qu'à récupérer l'information que j'envoie.

    En gros mon autre programme va me transmettre la date sous le format x/yy/zz, j'aimerais récupérer cette information pour ensuite la mettre dans une mémoire avec un write_ext_eeprom.

    Le problème c'est qu'en mettant le programme que j'ai mis sur ma capture d'écran je ne recois rien et mes autres réception ne fonctionnent plus

  6. #6
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    il vaut mieux metre char *

    et que fait ta condition if ?

    et je ne vois nul part ou tu fait passer ton heure.
    N'oublie pas le pouce vert

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par sourcilpower Voir le message
    il vaut mieux metre char *

    et que fait ta condition if ?

    et je ne vois nul part ou tu fait passer ton heure.


    "char *", c'est à dire? (désolé je débute)

    L'heure provient du logiciel Labview qui est connecté à ma carte par une liaison RS232, j'envoie l'heure et la date depuis le logiciel Labview et je la réceptionne sur ma carte pour ensuite la mettre dans une variable et puis ensuite j'irais écrire les données dans une EEPROM.

    Ma condition "if" c'était juste pour un test (voir si j'arrivais à réceptionner les données et les mettre dans une variable), je voulais faire un truc du genre

    if je receptionne
    output_high(led_rouge)

  8. #8
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    char * est une chaîne de caractère alloué dynamiquement
    char [7] est une chaîne de caractère alloué statiquement de 7 caractère
    par contre en c il ne faut pas oublier que les chaines se termine par un '\0' donc ta chaîne serrais a 8

    ton heure est sur ce format 'h/mm/ss' ? pourquoi elle n'est pas a ce format 'hh/mm/ss' ? ce veut dire que tu ne dépasse jamais la dizaine d'heure ?

    ta condition vérifie juste si les caractère précisé n'existe pas
    N'oublie pas le pouce vert

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par sourcilpower Voir le message
    char * est une chaîne de caractère alloué dynamiquement
    char [7] est une chaîne de caractère alloué statiquement de 7 caractère
    par contre en c il ne faut pas oublier que les chaines se termine par un '\0' donc ta chaîne serrais a 8

    ton heure est sur ce format 'h/mm/ss' ? pourquoi elle n'est pas a ce format 'hh/mm/ss' ? ce veut dire que tu ne dépasse jamais la dizaine d'heure ?

    ta condition vérifie juste si les caractère précisé n'existe pas


    Merci encore pour ta réponse.

    Oui je me suis trompé c'était pour la date le format x/yy/zz avec le jour en x.

    Donc si je comprends bien, la condition est inutile du coup et ça reviendrait à intégrer une variable "char [9]" au début du programme puis de mettre quelque chose comme ça dans le sous programme d'interruption :

    gets();
    if gets()==[9]
    {
    output_high(led_rouge);
    }


    Enfin ca me parait faux ce que je viens d'écrire mais je n'ai pas trop compris la structure du char que tu m'as conseillé, je met le nom d'une variable après comme ca : "char [9]heure" ?

    Ce que je veux dire c'est qu'une fois que je récupère la chaine, comment je peux la "manipuler" dans le programme C si cette chaine de données n'est pas dans une variable car mon but finale serait d'écrire cette donnée dans une mémoire EEPROM donc de faire un :

    write_ext_eeprom(adresse=X, "variable contenant les données de l'heure");

    Merci (et désolé )

  10. #10
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    par contre ton heure vient d'ou ?

    et donne moi un exemple concret pour ton heure avec de vrai donnee stp
    N'oublie pas le pouce vert

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Ok, alors voici le fonctionnement :

    Logiciel labview sur le PC connecté à ma carte électronique (avec un PIC) en liaison série RS232.

    Je prend la date de windows grâce au logiciel Labview et je la transmets au PIC grâce à la liaison RS232. La date est dans un formet xx/yy/zz donc au moment où j'écris ce message elle sera transmise de cette manière "07/05/15".

    Je dois prendre l'heure et la date du coup l'heure c'est le meme fonctionnement, j'envoie l'heure de windows aussi.

    Et donc moi ce que j'aimerais faire c'est récupérer les données de la date qui seront transmises comme ca "07/05/15" afin d'écrire ces données sur une mémoire de ma carte avec un "write_ext_eeprom". Le problème c'est que ces données je les recois bien (j'ai fait un test avec un analyseur logique) mais je n'arrive pas à les mettre dans une variable pour ensuite les utilisés comme je le veux dans mon programme C.

  12. #12
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    Si j'ai bien compris tu veux récupérer ce que reçois ton port rs232 ?
    N'oublie pas le pouce vert

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Bonjour,
    gets attend les caractère de fin de chaine '\n' donc s'il ne le reçoit pas, c'est normal que ta fonction soit bloquante. De plus, gets peut très bien te renvoyer une chaine de caractère dont la taille est supérieure à ce que tu attends en cas d'erreur de transmission sur le caractère '\n'.
    => Je te conseille de plutôt utiliser fgets (l'utilisation de gets est déconseillée : http://emmanuel-delahaye.developpez....-c/?page=Page6).

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Bonjour, alors j'ai essayé plusieurs choses et je pense avoir trouvé mais j'ai quand meme un problème.


    sourcilpower : oui je veux récupérer ce que je recois du port RS232


    boboss123 : j'ai réussi avec gets et j'ai réussi (mais mes getc sont bloqués comme tu l'as dit), après j'ai essayé un fgets comme ca :

    char heure[6] (l'heure est envoyé comme cela en ASCII : 15:35 donc c'est bien 6 avec le caractère nul non?)


    et j'ai fait un : fgets (heure, 6, ???), le problème se trouve au niveau de mes points d'interrogations je pense, j'ai cherché sur internet et beaucoup mettent STDIN à cet endroit, sauf que j'ai lu que STDIN c'était pour le clavier ou un fichier, je n'arrive pas à trouver ce que je dois mettre pour une réception série.


    Merci


    EDIT : voilà le programme (le fgets est en bas) : Nom : Capture.PNG
Affichages : 686
Taille : 33,0 Ko

  15. #15
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    Le probleme c'est que recuperer le flux rs232 c'est pas aussi simple c'est un "prog" apart et un complexe
    N'oublie pas le pouce vert

  16. #16
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjours
    Citation Envoyé par sourcilpower Voir le message
    Le probleme c'est que recuperer le flux rs232 c'est pas aussi simple c'est un "prog" apart et un complexe
    La récupération du flux où des données sur un port série (RS232) n'est pas si complexe que l'on pense, Il suffit d'avoir une bonne documentation et utiliser les API système a disposition pour écrire voir lire sur un port série (voir mon poste dans le cas d'un système UNIX/GNU LINUX ici).
    Cependant pourquoi lire où récupérer les données RS232 via la fonction GETS qui est faite pour lire les chaines de caractère sur l'entrée standard ?
    Si vous souhaitez lire les caractères de la liaison série pourquoi ne pas définir une taille max de buffer suffisamment grand pour être sûr que les données vont être correctement ajouté ou lue tard ?
    Voici un exemple en partant sur certaine source de mon précédent postes sous un UNIX.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /*	Ex lecture data	*/
    	do{
    		i_read = read( ptr->fd, &c_str, 1 );
    		if( (-1) == i_read ){
    			close( ptr->fd );
    			f_ResetLiaison( ptr );
    			fprintf(stderr, "Erreur de lecture data %s\n",
    					strerror(errno) );
    			exit( EXIT_FAILURE );
    		}
    		*( ptr->ptr_data + i_Cmpt) = c_str;
    		i_Cmpt += 1;
    	}while( BUFFER > i_Cmpt );
    ou
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /*	Ex lecture data	*/
    	do{
    		i_read = read( ptr->fd, &c_str, 1 );
    		if( (-1) == i_read ){
    			close( ptr->fd );
    			f_ResetLiaison( ptr );
    			fprintf(stderr, "Erreur de lecture data %s\n",
    					strerror(errno) );
    			exit( EXIT_FAILURE );
    		}
    		*( ptr->ptr_data + i_Cmpt) = c_str;
    		i_Cmpt += 1;
    	}while( BUFFER > i_Cmpt || (*ptr->ptr_data - (i_Cmpt-1) ) != '\0');
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  17. #17
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    j'ai poster aussi une source pour récupérer le flux rs232 http://www.developpez.net/forums/d15...ine-caractere/

    j'espert qu'avec nous deux tu trouvera ton bonheur.
    N'oublie pas le pouce vert

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Citation Envoyé par sambia39 Voir le message
    Cependant pourquoi lire où récupérer les données RS232 via la fonction GETS qui est faite pour lire les chaines de caractère sur l'entrée standard ?
    Le problème des fonctions qui ne récupèrent qu'un seul caractère à la fois sans avoir besoin d'envoyer un '\n', c'est qu'elles ne sont pas standard. La solution qui me semble le plus élégante est d'utiliser fgets (on peut très bien l'utiliser pour ne récupérer qu'un seul caractère à la fois)

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Citation Envoyé par Anarandel Voir le message
    j'ai réussi avec gets et j'ai réussi (mais mes getc sont bloqués comme tu l'as dit), après j'ai essayé un fgets comme ca :
    char heure[6] (l'heure est envoyé comme cela en ASCII : 15:35 donc c'est bien 6 avec le caractère nul non?)
    Oui c'est ça. Cependant, il faut que tu gères la récupération de taille de chaines variables si tu veux que ton programme soit robuste.
    Attention la chaine que du reçois est peut-être '12:35\n\0' et non pas '12:35\0'.

    Citation Envoyé par Anarandel Voir le message
    et j'ai fait un : fgets (heure, 6, ???), le problème se trouve au niveau de mes points d'interrogations je pense, j'ai cherché sur internet et beaucoup mettent STDIN à cet endroit, sauf que j'ai lu que STDIN c'était pour le clavier ou un fichier, je n'arrive pas à trouver ce que je dois mettre pour une réception série.
    Tu dois avoir une fonction qui ouvre ton port RS232 en te renvoyant une variable de type FILE*

  20. #20
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour
    Citation Envoyé par boboss123 Voir le message
    Le problème des fonctions qui ne récupèrent qu'un seul caractère à la fois sans avoir besoin d'envoyer un '\n', c'est qu'elles ne sont pas standard. La solution qui me semble le plus élégante est d'utiliser fgets (on peut très bien l'utiliser pour ne récupérer qu'un seul caractère à la fois)
    Il est clair qu'il existe de façon plus simple et élégante de faire des choses mais il est encore plus évident de bien choisir son standard (dans mes exemples je me base sur le standard POSIX) certes les fonctions POSIX sont pas optimisé mais elle permette de faire au mieux certaines choses de façon élégante.
    Peut-être que je me trompe mais la fonction read est parfaitement capable de lire non pas un caractère à la fois mais aussi le nombre exact d'octet du buffer qui lui a été fourni.

    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/06/2009, 09h38
  2. problème lors de création d'une vue
    Par gapse dans le forum Oracle
    Réponses: 7
    Dernier message: 26/07/2006, 12h59
  3. Réponses: 1
    Dernier message: 05/03/2006, 23h06
  4. Problème pour exécuter une chaîne de caractères
    Par Pongo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/09/2005, 10h34
  5. [TForm] Problème lors du déplacement d'une fenêtre sans barre de titre
    Par Benjamin GAGNEUX dans le forum Composants VCL
    Réponses: 3
    Dernier message: 14/10/2004, 17h10

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