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 :
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 let usb0 = "/dev/ttyUSB0" let flags = Unix.([O_RDWR; O_NOCTTY; O_NONBLOCK]) let perm = 0o666 let fd = Unix.openfile usb0 flags perm
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 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
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.
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, _, _) -> ()
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
Partager