C : écriture sur un port COM émule

HommeCocoa

Membre actif
3 Janvier 2003
173
0
Vevey - Suisse
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 :p

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

Bloc de code:
#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 :rolleyes:, 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 :nailbiting:

Quelqu'un a un peu d'expérience avec ça?
Merci à tous,
David
 
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...).