# C : écriture sur un port COM émule



## HommeCocoa (24 Septembre 2011)

Bonjour,

J'ai un petit dongle USB avec un Chip FTDI donc autrement dit un "émulateur de port COM" sur
USB.

Je le branche à mon USB, je vais dans le terminal et tape cd /dev et je trouve que quelque part
j'ai le répertoire: "tty.usbserial-A2001mBE" donc quelque part j'ai un "port COM" via l'usb.

Ce qui est COOOL 

Bon étape suivante, je tante de l'adresse en C selon "protocole" POSIX standard:


```
#include <stdio.h>   /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>   /* File control definitions */
#include <errno.h>   /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */

int open_port(void);

int main (int argc, const char * argv[])
{

    // insert code here...
    printf("Hello, World!\n");
    
    int fd = open_port();
    
    char Buff[]="V8 cars are coool";
    
    write(fd, Buff, strlen(Buff)+1);
    
    printf("SUCCESS!\n");
    return 0;
}

int open_port(void)
{
    int fd; /* File descriptor for the port */
    
    //tty.usbserial-A2001mBE
    fd = open("/dev/tty.usbserial-A2001mBE", O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1)
    {
        /*
         * Could not open the port.
         */
        
        perror("open_port: Unable to open /dev/tty.usbserial-A2001mBE - ");
    }
    else
        fcntl(fd, F_SETFL, 0);
    
    printf("PORT OPENED!\n");
    return (fd);
}
```

Le code compile COOL , il s'execute même et dans la console je récupère:

Hello, World!
PORT OPENED!

Donc le port est bien ouvert! Mieux encore, si je retire le dongle FTDI j'obtiens une erreur d'ouverture donc ça marche :rallyes: COOL

Par contre...

la console ne m'indique jamais que le program s'est terminé, donc j'imagine qu'il y a un soucis dans le write()... :sleep: et que ça n'envoie en fait rien sur mon PORT COM 

Quelqu'un a un peu d'expérience avec ça?
Merci à tous,
David


----------



## HommeCocoa (28 Septembre 2011)

Personne ici n'a fait un peu de port COM avec le Mac? ou alors sous Linux? Je crois que
c'est les même librairie


----------



## PA5CAL (28 Septembre 2011)

Bonjour

De mémoire, l'utilisation des ports série est un peu plus compliquée. 

On spécifie généralement les flags O_NOCTTY et O_NONBLOCK à l'ouverture.

Comme il est possible d'ouvrir plusieurs fois le même fichier _/dev/tty..._ , il faut commencer par empêcher d'éventuelles ouvertures ultérieures ( avec _ioctl()_, commande _TIOCEXCL_ ).

On peut ensuite remettre à zéro le flag NONBLOCK ( avec _fcntl()_, commande _F_SETFL_ ).

Il faut également penser à fixer les paramètres de communication ( voir _tcsetattr()_ et  _termios_ ) et s'occuper des lignes de handshake matériel ( _ioctl()_ avec _TIOCMSET_ et _TIOCMGET_ ).

Mais tout ça est assez loin pour moi (je le faisais sous Tiger), et je ne suis pas sûr que le système supporte très bien ces manipulations de ports série qui n'en sont finalement pas vraiment (derrière, c'est en fait le pilote d'un device USB qui travaille, et il ne le fait pas toujours aussi bien qu'on pourrait s'y attendre...).


----------

