Linux - port série lire en retour EAGAIN

Je vais avoir quelques difficultés à lire des données à partir d'un port série, j'ai ouvert la façon suivante. J'ai utilisé cet exemple de code beaucoup de fois et tout a bien fonctionné, mais maintenant, pour une raison que je ne peux pas comprendre, je suis totalement incapable de lire quoi que ce soit à partir du port série.

Je suis capable d'écrire et tout est correctement reçu à l'autre bout, mais les réponses (qui sont envoyés correctement) ne sont jamais reçus (Non, tous les câbles sont ok 😉 )

Le code que j'ai utilisé pour ouvrir le port série est le suivant:

fd = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK | O_NOCTTY);
if (fd == -1)
{
    Aviso("Unable to open port");
    return (fd);
}
else
{
    //Get the current options for the port...
    bzero(&options, sizeof(options)); /* clear struct for new port settings */
    tcgetattr(fd, &options);

    /*-- Set baud rate -------------------------------------------------------*/
    if (cfsetispeed(&options, SerialBaudInterp(BaudRate))==-1)
        perror("On cfsetispeed:");
    if (cfsetospeed(&options, SerialBaudInterp(BaudRate))==-1)
        perror("On cfsetospeed:");

    //Enable the receiver and set local mode...
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~PARENB; /* Parity disabled */
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;  /* Mask the character size bits */
    options.c_cflag |= SerialDataBitsInterp(8);           /* CS8 - Selects 8 data bits */
    options.c_cflag &= ~CRTSCTS;                            //disable hardware flow control
    options.c_iflag &= ~(IXON | IXOFF | IXANY);           //disable XON XOFF (for transmit and receive)
    options.c_cflag |= CRTSCTS;                         /* enable hardware flow control */

    options.c_cc[VMIN] = 0;     //min carachters to be read
    options.c_cc[VTIME] = 0;    //Time to wait for data (tenths of seconds)

    //Set the new options for the port...
    tcflush(fd, TCIFLUSH);
    if (tcsetattr(fd, TCSANOW, &options)==-1)
    {
        perror("On tcsetattr:");
    }

    PortOpen[ComPort] = fd;
}

return PortOpen[ComPort];

Après le port est initializeed j'écris des trucs à elle par une simple commande d'écriture...

int nc = write(hCom, txchar, n);

où hCom est le descripteur de fichier (et c'est ok), et (comme je l'ai dit) cela fonctionne. Mais... quand je fais une lecture par la suite, j'obtiens une "Ressource Temporairement non disponible" erreur errno.

J'ai testé pour voir quand le descripteur de fichier avait quelque chose de t lire... mais il est toujours temps!

J'ai lu de données comme ceci:

ret = read(hCom, rxchar, n);

et j'ai toujours un EAGAIN et je n'ai aucune idée pourquoi.

Mise à jour:

Le HW est fonctionne bien! Je peux voir qu'il y a les données entrantes sur le port série parce que j'ai fait un debug câble de lire ce qui se passe sur un autre terminal. Alors...

Je sais que ce ne soit pas bloquante devrait le faire. Ma question est... pourquoi n'est pas rien de se lire!. La même configuration fonctionne très bien sur windows, de sorte que tout le matériel fonctionne très bien...

C'est me rend fou! Je suis sûr que c'est quelque chose de simple comme l'enfer! J'ai même essayé de se débarrasser de O_NONBLOCK à voir quand je reçois quelque chose... mais rien...

OriginalL'auteur André Moreira | 2009-10-23