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 :

lecture des données sur le port USB en C


Sujet :

Embarqué

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 16
    Points : 5
    Points
    5
    Par défaut lecture des données sur le port USB en C
    Bonjour,
    Je développe en c un programme pour dialoguer avec un variateur. Je travaille sous linux.
    voilà mon programme:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <QtGui>
    #include <unistd.h>
    #include <fcntl.h>
    
    #define VOIE_NUMBER 5
    
    
    int main()
    {
    
    int fd;
    int i=0;
    char buff[20];
    
    
    fd= open("/dev/ttyUSB0", O_WRONLY | O_NDELAY);
    if (fd== -1)
    printf("Une erreur est survenue lors de la connexion avec le port serie 1.Les informations ne lui seront donc pas transmises.");
    else
    
    write(fd, "VLIM\r\n",5);
    
    
    while(read(fd,&buff[i],4)==1);
    
    {
    i++;
    }
    buff[i]='\0';
    
    write(4,buff, strlen(buff));
    printf("VLIM :%d", *buff);
    
    
    
    return 0;
    
    }
    
    normalement il doit afficher 160, mais malheureusement affiche 0.
    avec cette ligne write(fd, "VLIM\r\n",5); j'ai bien vérifié qu'il envoie 160.
    le problème ce trouve dans ces ligne
    
    while(read(fd,&buff[i],4)==1);
    
    {
    i++;
    }
    buff[i]='\0';
    
    write(4,buff, strlen(buff));
    printf("VLIM :%d", *buff);
    Est ce qu'il y a quelqu'un peut m'aider??

  2. #2
    Membre chevronné

    Homme Profil pro
    .
    Inscrit en
    Janvier 2006
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Janvier 2006
    Messages : 703
    Points : 1 950
    Points
    1 950
    Par défaut
    Pourrais-tu utiliser la balise code pour présenter ton code stp ?

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    Pourquoi mettre #include <QtGui> alors tu travailles en C ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(read(fd,&buff[i],4)==1);
    {
    i++;
    }
    Pourquoi un ; après le while ?

    En l'enlevant, je pense que tu lis 4 char et les écris dans le buffer ;te décale d'un cran ; tu lis puis écris à nouveau 4 char et en écrasant 3 au passage ; ainsi de suite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(4,buff, strlen(buff));
    4 ?

    A quoi te sert cette instruction ?

  4. #4
    Membre chevronné

    Homme Profil pro
    .
    Inscrit en
    Janvier 2006
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Janvier 2006
    Messages : 703
    Points : 1 950
    Points
    1 950
    Par défaut
    Je parlais de la balise code, pas quote. J'ai édité ton message en conséquence.
    Il faut que tu fasses ça à l'avenir.

    En remplaçant les 0 ici par des O. Sinon comme dans le MP que je t'ai envoyé, l'exemple est également formaté.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    merci d'abord pour ta réponse,

    oui j'ai modifié 4 par 1

    voilà mon nouveau programme

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <QtGui>
    #include <errno.h>
    
    
    
    
    
    int main()
    {
    
    int  fd;
    int  i=0;
    char buffer[20];
    
    
    fd= open("/dev/ttyUSB0", O_WRONLY | O_NDELAY);
        if (fd== -1)
                     printf("Une erreur est survenue lors de la connexion avec le port serie 1.Les informations ne lui seront donc pas transmises.");
        else
    
        write(fd, "VLIM\r\n",5);
    
      while(read(fd, &buffer[i],1)==1)
        {
            i++;
        }
    
    
           buffer[i]='\0';
    
            write(1,buffer, strlen(buffer));
            printf("VLIM :%d", *buffer);
    
    return 0;
    
    }
    mais, c'est que la fonction

    retourne toujours la valeur -1, je ne comprends pas c'est quoi le problème. sachant que la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    write(fd, "VLIM\r\n",5);
    demande VLIM qui est 160. je surveille bien le port par un logiciel et je voie que la fonction retourne 160.
    le souci je n'arrive pas à récupérer cette valeur.

    j'ai voulu utiliser errno pour définir l'erreur, mais malheureusement j'ai pas réussi à l'utiliser.

  6. #6
    Membre actif Avatar de Livegen
    Homme Profil pro
    Ingénieur logiciel embarqué Franco-allemand
    Inscrit en
    Avril 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Ingénieur logiciel embarqué Franco-allemand
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2008
    Messages : 83
    Points : 255
    Points
    255
    Par défaut
    J'aimerais que quelqu'un de plus expérimenté confirme.

    Mais je pense que le faite que read te retourne -1 est tout à fait normal.

    Tu ouvre ta liaison avec l'option O_WRONLY, qui signifie écriture seulement.

    Essaie de la remplacer par O_RDWR, pour pouvoir lire et écrire sur la liaison.

    Meilleures salutations, Livegen.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    Bien vu pour l'écriture seule Livegen, cela explique sûrement que la lecture plante.

    En revanche, je reste toujours très septique sur le code.

    demande VLIM qui est 160.
    Ca veut dire quoi ça ?

    oui j'ai modifié 4 par 1
    Mais 1 = quoi ? Write prend en 1er paramètre un descripteur de fichier, comment tu sais quel descripteur correspond à 1 ? La sortie standard forcément ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write(fd, "VLIM\r\n",5);
    Tu écris 5 char alors que ta chaine en contient 6, non ?


    EDIT ; essayes un code plus verbeux pour voir (attention, j'ai changé le nom du fichier=

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <string.h>
    #include <errno.h>
    
    int main(void)
    {
    
        int  fd;
        int  i=0;
        char buffer[20]={0};
    
    
        fd= open("/dev/tty", O_RDWR | O_NDELAY);
        if (fd== -1)
        {
            printf("Une erreur est survenue lors de la connexion avec le port serie 1.Les informations ne lui seront donc pas transmises.");
            return 1;
        }
    
        puts("Ecriture sur le bus");
        if(write(fd, "VLIM\r\n",6) == -1)
        {
            puts("Ecriture impossible...");
            printf("Errno = %d --> %s\n", errno, strerror(errno));
        }
           ;
    
        puts("Lecture en boucle");
        while(read(fd, &buffer[i],1)==1)
        {
            i++;
        }
        buffer[i]='\0';
        printf("Errno = %d --> %s\n", errno, strerror(errno));
        printf("Nombres d'iteration de la boucle %d\n", i);
    
        puts("Affichage des resultats");
        write(1,buffer, strlen(buffer));
        printf("VLIM :%d\n", *buffer);
        printf("VLIM :%s\n", buffer);
    
        return 0;
    }

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 16
    Points : 5
    Points
    5
    Par défaut Read
    Désolé pour le retard j'étais en vacances je vais voir ça demain.
    Je tiens à vous remercier

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    J'ai arrivé à résoudre ce problème: voilà le nouveau programme

    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
    
    //#include "configuration_duvariateur.h"
    
    //configuration_duvariateur::configuration_duvariateur()
    //{}
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<fcntl.h>
    #include <iostream>
    
    #define Taille 10000
    
    int                     main()
    {
      int                   fd1;
      int                   fd2;
      int                  i, m, n;
      char                  buffer[Taille];
    
      fd1 = open("/home/said/Bureau/configurationS303.par", O_RDONLY);
      if(fd1 == -1)
        {
          perror("Ouverture impossible");
          return (EXIT_FAILURE);
        }
      fd2 = open("/dev/ttyS0", O_WRONLY | O_NDELAY);
      if(fd2 == -1)
        {
          perror("Creation du fichier impossible !");
          return (EXIT_FAILURE);
        }
      while((n = read(fd1, buffer, Taille)) > 0)
        {
          m= write(fd2, buffer, n);
          std::cout << n << std::endl;
          std::cout << m << std::endl;
        //  std::cout << buffer << std::endl;
    
        }
    
    
      if(n == -1)/*                 //   L' erreur se passe donc ici */
        {
          perror("Erreur de lecture");
          return (EXIT_FAILURE);
        }
      close(fd1);
      close(fd2);
      return (EXIT_SUCCESS);
    }
    j'arrive pas à comprendre pourquoi m = 4095 càd 12bit.
    normalement n = 6441, ça veut dire il n'envoie pas tout le fichier.
    est que vous pouvez m'expliquer ce problème et me proposer quelques solutions ?

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    Oula ! Tu fais du C++ maintenant, tu n'as plus besoin de mettre stdio.h dans ton code.

    n = 6441 ? Où as-tu initialisé la variable ?

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    oui tu as raison question d'habitude

    ce n'est pas un problème d'initialisation, ( j'ai initialisé n= 0 mais ça change rien).
    Je pense que mon buffer ne peut pas enregistrer plus que 12bit. càd 4095.
    J'ai pensé à lire et écrire ligne par ligne mais je ne sais pas comment.
    est ce que vous pouvez m'expliquer comment faire??

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 485
    Points : 13 695
    Points
    13 695
    Billets dans le blog
    1
    Par défaut
    J'ai lu un peu vite tout à l'heure pour le n.

    C'est bien cette fonction que tu utilises ? http://man.developpez.com/man2/write.2.php


    Je pense que mon buffer ne peut pas enregistrer plus que 12bit. càd 4095.
    Je ne comprends pas le rapport entre 12 bits et 4095 octets (valeur renvoyée par write).

    normalement n = 6441, ça veut dire il n'envoie pas tout le fichier.
    Quelle taille fait le fichier /home/said/Bureau/configurationS303.par ?

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 16
    Points : 5
    Points
    5
    Par défaut
    Oui il n'envoie pas tout le fichier
    La taille du fichier /home/said/Bureau/configurationS303.par =6441.

    c'est pour ça j'ai essayé d'envoyer ligne par ligne, mais je ne sais pas comment?

Discussions similaires

  1. Problème de lecture de données sur le port USB
    Par lujacquet1 dans le forum C
    Réponses: 3
    Dernier message: 08/06/2015, 16h56
  2. Réponses: 7
    Dernier message: 18/07/2011, 18h34
  3. Envoyer des données sur le port série
    Par jbidou88 dans le forum Flash
    Réponses: 3
    Dernier message: 18/09/2006, 12h33
  4. [javax.comm] Envoyer des données sur le Port série
    Par deuspi dans le forum Applets
    Réponses: 2
    Dernier message: 29/08/2006, 10h40
  5. Récupérer des données via le port usb
    Par matmuth dans le forum C++Builder
    Réponses: 12
    Dernier message: 11/05/2005, 17h34

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