Forum Programmation.c parametrer le port USB

Posté par  .
Étiquettes : aucune
0
18
mai
2005
Salut à tous

Dans un premier je voudrais savoir comment on fais pour paramétrer le port USB (vitesse, parité, stop) , comme Minicom pour le port série par exemple.

Ensuite je voudrais savoir comment on fait pour paramétrer le port série et USB en C, ce qui m'as l'air nettement plus complexe.

Merci d'avance pour vos réponse.
  • # c'est simple : on ne le fait pas

    Posté par  . Évalué à 3.

    Le port USB de ton PC (je suppose) ne se parametre tout simplement pas.
    La vitesse est indiqué lors de la connexion du peripherique par la presence d'une resistance entre les lignes, la valeurs et l'emplacement de la resistance indique si tu est LowSpeed (1Mb/s)(USB 1.0), HighSpeed(12Mb/s)(USB1.1) ou FullSpeed(480Mb/s)(USB2.0).
    Ensuite la communication niveau bit et octet (partié,stop,synchro horloge) est géré par le composant USB, le programmeur ne s'en soucis pas.
    Coté soft la spec USB tiens en 500 pages (et c'est pas tres comprehensible) donc remercie le kernel linux de tout implementer (la couche host).
    Pour communiquer avec un peripherique USB deux solutions:
    1)-Ecriture d'un driver linux (module) (demande certaine connaissance)
    2)-Utilisation d'une librayri depuis l'espace utilisateur faisant la majortié du boulot chaint pour te laisser de concentrer sur la partie de discution pure avec ton periph.
    pour le 1) tu peut lire usb-skelthon dans les sources de ton kernel linux : /usr/scr/linux/drivers/usb/
    pour le 2) l'utilisation de libusb (ref:http://libusb.sourceforge.net/)(...)

    Mais je pense que ta question est trop flou pour que je puisse te repondre plus efficacement, que projette tu faire avec l'usb de ton pc ?
    • [^] # Re: c'est simple : on ne le fait pas

      Posté par  . Évalué à 1.

      Pour l'instant, je veut juste envoyer des données sur mon port série.
      J'utilise un convertisseur USB/COM.
      J'ai déjà fait un bout de programme mais je ne recoit pas bien les données.
      je voulais savoir si il était configurer pareil...

      Voici mon code pour la lecture :
      #include <asm/io.h>
      #include <unistd.h>
      #include <stdlib.h>
      #include <asm/fcntl.h>
      #include <termios.h>
      #include <string.h>
      #include <stdio.h>
      #include <sys/select.h>



      #define O_BINARY 0x8000
      #define SEC 3
      #define USEC 0



      int main()
      {
      //===========Déclaration et initialisation des variables =======
      fd_set rfds;
      int fd[3], fdMax=-1, i=0, retour=-1, port, nb;
      struct timeval timeout;
      timeout.tv_sec=SEC;
      timeout.tv_usec=USEC;
      char buf[]="___";


      //============= Ouverture des différents port ===============
      fd[0] = open("/dev/ttyS0",O_RDWR); // COM1
      if(fd[0]==-1){ printf("Erreur (0) !!!!!"); return -1;}
      fd[1] = open("/dev/ttyS1",O_RDWR); // COM2
      if(fd[1]==-1){ printf("Erreur (1) !!!!!"); return -1;}
      fd[2] = open("/dev/ttyS2",O_RDWR); // USB
      if(fd[2]==-1){ printf("Erreur (2) !!!!!"); return -1;}

      printf("\n\nListe des ports ouverts :\nS0 : %i\nS1: %i \nS2: %i\n",fd[0], fd[1], fd[2]);

      // =============== Recherche ddu fd le plus grand ===========
      for(i=0;i<=2;i++)
      {
      if (fd[i] > fdMax) fdMax = fd[i];
      }
      printf("Maxfd = %i\n\n", fdMax);

      do
      {
      //============= Pause de 1 secondes entre chaque itérations=
      printf("Pause entre chaque itération...");
      getchar();
      timeout.tv_sec=SEC;
      timeout.tv_usec=USEC;

      // ================== Initialisation des fd a surveiller ==
      FD_ZERO(&rfds);



      // === C'est ici que l'on designe les fd a surveiller ====
      for(i=0;i<=2;i++)
      {
      FD_SET(fd[i],&rfds);
      }


      //=========== c'est la que l'on surveille ==========
      retour=select( fdMax+1, &rfds, NULL, NULL, &timeout);
      printf("\n### %i ###\n\n", retour);


      //= C'est ici que l'on regarde si il y a eu du changement ==
      for(i=0;i<=2;i++)
      {
      if (FD_ISSET(fd[i],&rfds)) { printf("données recu sur le port \"ttyS%i\"\n",i); port=i;}
      }

      }while(retour<=0);


      printf("\nAncienne chaine: |%c| (%i)\n", buf[0], sizeof(buf));
      nb=read(fd[port], &buf, 1);
      printf("%i octet de lu", nb);
      printf("\nNouvelle chaine: |%s| (%i)\n", buf, sizeof(buf));
      printf("\nNouvelle chaine: |%s| (%i)\n", &buf, sizeof(buf));


      close(fd[0]);
      close(fd[1]);
      close(fd[2]);

      printf("\n ### Fin ###\n");
      return 0;
      }



      Et voilà mon code pour l'écriture :
      #include <asm/io.h>
      #include <unistd.h>
      #include <stdlib.h>
      #include <asm/fcntl.h>
      #include <termios.h>
      #include <string.h>
      #include <stdio.h>

      #define USB "/dev/ttyUSBO"
      #define COM "/dev/ttyS0"
      #define O_BINARY 0x8000


      int main()
      {

      int numFichier,key=0,choix=0,i=0, boucle=0;
      char texte[256], car='a';
      char port[13];
      printf("1)USB\n2)COM1)\n:");
      scanf("%i",&choix);

      key=0;
      while(key==0)
      {
      switch(choix)
      {
      case 1: strcpy(port,"/dev/ttyUSB0");
      key=1;
      break;
      case 2: strcpy(port,"/dev/ttyS0");
      key=1;
      break;
      default: key=0;
      printf("\a");
      break;
      }
      }
      printf("\nport=%s",port);
      key=0;


      printf("\n\n\n\n\n\n\n\n\n\n ####### FICHIER.C #######\n Dialogue avec le port usb\n");

      printf("Ouverture du port ....... ");
      numFichier=open(port,O_RDWR|O_BINARY);
      // numFichier=open(port,O_RDWR|O_NONBLOCK);
      if(numFichier>=0)
      {
      printf("OK (%i)\n",numFichier);
      do
      {

      printf("\nMENU :\n1) Emettre '%c'\n2) Recevoir\n3) Changer de caractère\n0) Quitter\n:", car);
      scanf("%i",&choix);

      //#########################################################
      if (choix==1) // Emettre
      {
      i=write(numFichier,&car,sizeof(car));
      printf("\n%i octet(s) ecrit \n",i);
      }


      //#########################################################
      else if (choix==2) // Recevoir
      {
      i=-10;
      boucle=0;
      while(i<0 && boucle<1000000)
      {
      i=read(numFichier,&texte,sizeof(texte));
      boucle++;
      }
      printf("Nombre d'octet lu : %i \n", i);
      }


      //########################################################
      else if (choix==3) // Changer
      {
      printf("\n (%c) Nouveau caractère", car);
      getchar();
      printf(" :");
      scanf("%c", &car);
      printf("\n Votre caractère : |%c|\n", car);
      }



      //#########################################################
      else if (choix==0) // Quitter
      {
      key=1;
      }
      else printf("Mauvaise commande\n");
      }
      while(key==0);
      close(numFichier);


      }
      else printf("ERREUR\n");

      printf("Fermeture du programme\n");
      printf("\a");
      return 0;
      }

      Lorsque je lis ce que j'ai recu, il me mets rien...

      Est ce que ca viens par ce qu'il ne se comprenne pas ?!?!?!?!?


      Si je maîtrise déjà ça, je pourrais aller plus loin...
      Mettre le PC sur un BUS RS485 en maître et gerer des lecteurs de badge. De la domotique en gros...
      • [^] # Re: c'est simple : on ne le fait pas

        Posté par  . Évalué à 5.

        bon, de ton point de vue tu n'as pas a te soucier de savoir si ca passe par l'usb ou par ailleur, c'est le role du driver de ton convertisseur usb/serie de faire la translation.
        Question a 0.01cts (d'euro) pour en savoir plus sur la situation

        1) tu utilise bien un cable croisé entre tes deux ports serie (un sur l'usb l'autre sur le pc) ?

        2) Dans ton soft aucune init du debit ni de la partité et tout ca comme decris dans le serial howto, pourquoi ne pas faire l'init correctement?

        3)si tu lance deux instance de minicom, l'une sur le port serie et l'autre sur le port usb/serie, les deux minicom communique correctement entre eux ?
        • [^] # Re: c'est simple : on ne le fait pas

          Posté par  . Évalué à 1.

          1) tu utilise bien un cable croisé entre tes deux ports serie (un sur l'usb l'autre sur le pc) ?

          Oui

          2) Dans ton soft aucune init du debit ni de la partité et tout ca comme decris dans le serial howto, pourquoi ne pas faire l'init correctement?

          Je l'avais fais et je l'ai viré parceque le resultat était le même. Mais je pense que je vais le remettre. Il me génais car il prenais de la place, ja vais le faire proprement....


          3)si tu lance deux instance de minicom, l'une sur le port serie et l'autre sur le port usb/serie, les deux minicom communique correctement entre eux ?

          Si je savais lancer minicom pour le port USB je l'aurais fais.....
          Donc si tu peut m'éclairer...

          PS: sa fais maximum 1 mois que je suis sous linux et j'ai pas appris grand chose.....
          • [^] # Re: c'est simple : on ne le fait pas

            Posté par  . Évalué à 3.

            Si je savais lancer minicom pour le port USB je l'aurais fais.....
            le point de depart sous linux est l'instruction man ou l'instruction info
            man minicom ou
            info minicom si le premier ne donne rien.
            on y trouve qu'avec l'option -p
            minicom -p /dev/ttyUSB0
            ca devrait communiquer sur le convertisseur USB.(a tester)
            Tu n'as pas d'oscilloscope sous la main ?
            Pour voir si l'emission ce passe bien et si c'est la reception qui coince ou l'inverse ?
            • [^] # Re: c'est simple : on ne le fait pas

              Posté par  . Évalué à 1.

              non je n'ai pas ça sous la main!

              Je vais tester man minicom...

              Je suis nouveau sous linux donc je n'ai pas encore les reflexes man... et info je ne connaissait pas!
              Merci!
      • [^] # Re: c'est simple : on ne le fait pas

        Posté par  (site web personnel) . Évalué à 2.

        J'ai déjà écris un code tty qui fonctionne très bien depuis 2 vrai lien séries.

        Par contre, je n'arrive pas à utilisé un convertiseur USB/RS232 (celui hyper chère de la fnac) avec le code. Il ne fait que recevoir mais n'émet rien.

        Peut-être une histoire de configuration, genre il ne supporte que la gestion cts/rts ?

        "La première sécurité est la liberté"

  • # howto

    Posté par  (site web personnel) . Évalué à 3.

    Recherche le serial-programming-howto.

    "La première sécurité est la liberté"

    • [^] # Re: howto

      Posté par  . Évalué à 1.

      Je l'ai déjà vu. Mais je pense que c'est soit la configuration du port USB et COM qui ne s'entendent pas, ou c'est ma lecture qui ne va pas. Je ne vois rien qui m'éclaircisse dans le HOWTO...
      • [^] # Re: howto

        Posté par  (site web personnel) . Évalué à 3.

        ben l'usb n'a rien à voir avec un lien tty donc bon.

        "La première sécurité est la liberté"

        • [^] # Re: howto

          Posté par  . Évalué à 1.

          Est ce que tu peut -être plus clair ?

          Pour ouvrir le portUSB, j'utilise ttyUSB0.....
          • [^] # Re: howto

            Posté par  (site web personnel) . Évalué à 1.

            > Pour ouvrir le portUSB, j'utilise ttyUSB0.....

            Non la phrase correcte c'est: pour ouvrir le port serie de mon
            adaptateur USB, j'utilise /dev/ttyUSB0
            .

            Comme dit plus haut ce n'est pas a toi de t'occuper du fait que
            le port serie est sur USB ou non ca c'est le boulot du kernel.
            Pour toi ou pour les applications (minicom, setserial, ...) il faut juste
            specifier du nom du peripherique (/dev/ttyUSB0 au lieu de /dev/ttyS0).
  • # tutoriaux

    Posté par  (site web personnel) . Évalué à 1.

    si tu veux lire le port SERIE:

    http://sourceforge.net/projects/monitor-68hc08/(...)
    source: rs232.c

    si tu veux lire le port USB:
    inspire toi de
    http://usbirboy.sourceforge.net/(...)
    http://projets.sequanux.org/membres/sim/usb/(...)
    qui sont des projets basiques.

    SI tu as un adaptateur USB-serie, alors tu as un port serie, et tu ne DOIS alors PAS t occuper de la couche USB.

    Je crois que c est le moment de ressortire ma maxime:
    "si tu ne comprends pas la reponse qu on te propose, c est que tu as mal formule ta question."

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.