• [^] # Re: c'est simple : on ne le fait pas

    Posté par . En réponse au message parametrer le port USB. É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...