Forum Linux.débutant le port serie en C

Posté par  .
Étiquettes : aucune
0
29
avr.
2005
Salut à tous,

je voudrais savoir comment écrire et lire sur un port série. J'ai vu partout que c'était simple avec read et write ....................mais non!!!

J'arrive à ouvrir le port mais je n'arrive rien a envoyer ou à lire sur le port série....
N'auriez vous pas la syntaxe pour effectuer ces opérations ???


numFichier=open(port,O_RDWR|O_NONBLOCK);
if(numFichier>0)
{
printf("OK\n");
do
{

printf("\nMENU :\n1) Emettre 'a'\n2) Recevoir\n3) Quitter\n:");

scanf("%i",&choix);

//#########################################################
if (choix==1)
{
printf("\nGO.....\n");
write(numFichier,buf,sizeof(buf));
printf("\nEcriture faites\n");
}
//#########################################################
else if (choix==2) // Recevoir
{
i=-1;
boucle=0;
while(i<=0 && boucle<=1000) // Effectue 1000 lecture max
{
boucle++;
i=read(numFichier,&texte,10);
printf("Nombre d'octet lu : %i\n", i);
}
}
//########################################################
else if (choix==3) // Quitter
key=1;

else printf("Mauvaise commande\n");
}
while(key==0);
close(numFichier);
}
else printf("ERREUR\n");



i=ioperm(port,1,0); // Demande permission de fermer le port
printf("Fermeture du programme\n");
  • # exemple d'implémentation

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

    Bonjour !

    Tu peux télécharger un soft que j'avais fait il y a quelques temps pour un appareil connecté sur le port série: http://mathias.bavay.free.fr/software/gm4lin/(...)

    J'avais essayé d'écrire la partie de gestion du port série (dans les fichiers "serial.c" et "serial.h") de la façon la plus propre possible afin de pouvoir facilement le conserver comme exemple d'implémentation (car ce genre d'exemple manque cruellement).

    Mathias
    • [^] # Re: exemple d'implémentation

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

      Dans ton code L80@serial.c:
      strftime(iso_time, (size_t)20, "%Y-%m-%d-%H:%M:%S", localtime(&timing);

      devrait etre:
      strftime(iso_time, (size_t)20, "%Y-%m-%dT%H:%M:%S", localtime(&timing);

      Notes le T qui separe la partie YYYY-MM-JJ et l'heure:min:sec.

      C'est decris dans le standard ISO 8601, dont une reference est faite dans un document du w3c par exemple:
      http://www.w3.org/TR/NOTE-datetime(...)

      Juste une remarque Out Of Topic en passant, désolé du dérangement.
  • # Ahum

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

    Plusieurs choses déjà la forme:
    les if() elseif() dans le cas la c'est franchement pas super et ca aide pas à la visibilité (par contre les //#### c'est bien)
    switch(choix) {
    case 1:
    blah blah;
    break;
    .
    .
    .
    default:
    MECHANT;
    break
    }

    Apres tu fais un if sur la valeur de retour du open:
    ca peut être égal à 0 (bon faut le faire expres mais pour un démon c'est possible)
    Plutot que printf("ERREUR\n"); faire perror("open serial port");
    Le ioperm je doute fortement qu'on l'utilise comme ca(et meme remarque pour le open sauf que la tu teste meme pas la valeur de retour).
    ioperm c'est pour accéder à une plage d'IO directe,
    De ce que je vois port (cf le open) c'est une chaine de caractere, donc ca doit pas être joli à voir
    et finalement
    Apres avec les read et write il se passe quoi?
    Ca plante?
    Ca bloque?

    PS:Je passe à côté du scanf pour lequel tu ne vérifie pas la valeur de retour (pour être sur qu'on a recu un entier)
    • [^] # ......

      Posté par  . Évalué à 1.

      Merci déjà pour vos information!

      scanf
      Comment voir si c'est bien un entier que l'on recoit ???
      Quel fonction, algo ???
      if else => switch
      je vais le faire
      ioperm
      Je l'utilisais pour communiquer avec le port parallele avec inb et outb aussi.
      Mais c'était juste une démo!
      perror
      j'utilise pas je ne vois pas l'interet pour mes petit programme. Mais c'est vrai que si mes programme doivent ce developper, il faudrais mieux que je fasse tout dans les regles de l'art.....
      open ????
      Je teste pas la sortie?????
      Alors quel test faut -il faire ???
      READ
      La mon programme est aléatoire. Des fois il plante, des fois il reste bloquer sur le read.
      WRITE
      Tout ce passe bien mais je n'ai pas les moyen de verifier si il a bien envoyer les données.
      INFO
      Pour info, j'utilise un module à la sortie du port qui boucle.
      C'est à dire qu'il s'envoie lui-même les données....

      Je te remercie déjà pour l'attention que tu me porte. En attendant ta prochaine réponse( :-) ) je vais changer mon programme.
      Merci
      • [^] # Re: ......

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

        regarde man scanf et regarde la valeur de retour
        Ca renvoie le nombre de champs remplit
        Donc if (scanf(blahblah)!=1)
        probleme;

        Pour le ioperm faut bien nettoyer quand même :)
        pour le perror t'as raison

        pour le open le problème c'est que la valeur de retour peut être égale à 0, donc il faut mettre if(fd>=0) au lieu de if(fd>0)
        Mais bon pour un programme normal en général ca passe

        Les réglages du port série sont bons? (tu peux faire en ioctl en C ou stty en console)
  • # How to

    Posté par  . Évalué à 2.

    Il y a un Howto Serial et un Howto serial programming sur tldp.org.
    Il y a un example de code donc après tu as plus qu'à adapter.

    hth,

    --
    Xtophe

Suivre le flux des commentaires

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