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

Caml Discussion :

Communication avec un port série


Sujet :

Caml

  1. #1
    Membre éprouvé
    Avatar de Cacophrene
    Homme Profil pro
    Biologiste
    Inscrit en
    Janvier 2009
    Messages
    535
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Biologiste

    Informations forums :
    Inscription : Janvier 2009
    Messages : 535
    Points : 1 125
    Points
    1 125
    Par défaut Communication avec un port série
    Bonjour tout le monde,

    Je soumets à votre sagacité le problème suivant. Je souhaite communiquer avec un micromoteur via un port série (plus exactement un adaptateur USB-série). Je travaille avec le module Unix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let usb0 = "/dev/ttyUSB0"
    let flags = Unix.([O_RDWR; O_NOCTTY; O_NONBLOCK])
    let perm = 0o666
    let fd = Unix.openfile usb0 flags perm
    Je définis ensuite les paramètres du transfert avec Unix.tcgetattr/Unix.tcsetattr et j'envoie des commandes au micromoteur qui est mis en mouvement. Donc, la fonction write_serial ci-dessous fonctionne correctement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    let write_serial () =
         let cmd = "/2P1000R\r\n" in (* un exemple de commande *)
         let len = String.length cmd in
         let ret = Unix.write fd cmd 0 len in
         assert (ret = len); (* pas propre mais le pb n'est pas là. *)
         Unix.tcdrain fd
    Le micromoteur renvoie des informations dès que le mouvement est terminé, mais il m'est impossible d'y accéder avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    let read_serial () =
         let len = 10 in
         let buf = Buffer.create len in
         let str = String.create len in
         let rec loop () =
             let n = Unix.read fd str 0 len in
             if n > 0 then (
                 Buffer.add_substring buf str 0 n;
                 loop ()
             ) else Buffer.output_buffer stdout buf in
         try loop () with Unix.Unix_error (Unix.EAGAIN, _, _) -> ()
    Curieusement, si j'utilise en même temps GtkTerm, celui-ci est capable de récupérer les données écrites par le micromoteur alors que ma fonction échoue avec EAGAIN.
    Une autre discussion arrive au même point que moi, mais il n'y a pas eu de réponse. Quelqu'un a-t-il une idée ?

    Cordialement,
    Cacophrène

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    On dirait que c'est lié à la manière dont tu accèdes aux fichiers sous linux/Unix (bien que ce soit un programme écrit en OCaml, tu aurais presque plus de chances avec le forum linux).


    Visiblement, tu essayes d'ouvrir ton fichier en lecture / écriture. Pour les flux FIFO, visiblement ça ne marche pas comme ça :

    O_RDWR
    Open for reading and writing. The result is undefined if this flag is applied to a FIFO.

    http://pubs.opengroup.org/onlinepubs.../xsh/open.html

    Si ma mémoire est bonne, tu devrais plutôt avoir :
    - un thread qui accède "/dev/ttyUSB0" en mode O_WRONLY (pour l'envoi de données)
    - un thread qui accède "/dev/ttyUSB0" en mode O_RDONLY (pour la réception de données)
    - un moyen de synchroniser ces deux threads (pour qu'ils s'échangent des données)

    Et bien sûr, ne pas oublier de fermer les descripteurs de fichier quand t'as fini...


    Maintenant, si un expert linux pouvait confirmer (ou infirmer) ces hypothèses...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

Discussions similaires

  1. Communication avec un port série
    Par Yann_69 dans le forum Android
    Réponses: 0
    Dernier message: 03/04/2013, 18h27
  2. Communication avec un port série
    Par Artist dans le forum VB.NET
    Réponses: 3
    Dernier message: 04/06/2011, 19h34
  3. Communication avec le port série
    Par Jackyzgood dans le forum C
    Réponses: 2
    Dernier message: 12/02/2011, 22h38
  4. Problème de communication avec un port série
    Par hélène2 dans le forum C#
    Réponses: 8
    Dernier message: 22/04/2009, 10h26
  5. Code VBA pour communication avec un port série dans EXCEL
    Par Fbroom dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/05/2008, 11h14

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