Linux - lectura de puerto serie devolviendo EAGAIN

Tengo algunos problemas para leer algunos datos de un puerto serie que abrí de la siguiente manera. He usado esta instancia de código muchas veces y todo ha funcionado bien, pero ahora, por alguna razón que no puedo descifrar, soy completamente incapaz de leer nada desde el puerto serie.

Puedo escribir y todo se recibe correctamente en el otro extremo, pero las respuestas (que se envían correctamente) nunca se reciben (No, todos los cables están bien;))

El código que utilicé para abrir el puerto serie es el siguiente:

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];

Después de inicializar el puerto, le escribo algunas cosas a través de un simple comando de escritura ...

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

donde hCom es el descriptor de archivo (y está bien), y (como dije) esto funciona. Pero ... cuando hago una lectura después, recibo un error de "Recurso temporalmente no disponible" de errno.

Probé seleccionar para ver cuando el descriptor de archivo tenía algo que leer ... ¡pero siempre se agota!

Leí datos como este:

ret = read(hCom, rxchar, n);

Y siempre recibo un EAGAIN y no tengo idea de por qué.

Actualizar:

El HW está funcionando bien! Puedo ver que hay datos de entrada en el puerto serie porque hice un cable de depuración para leer qué está pasando en otra terminal. Asi que...

Sé lo que debería hacer el no bloqueo. Mi pregunta es ... ¿por qué no se lee nada? La misma configuración funciona bien en Windows, por lo que todo el hardware funciona bien ...

¡Esto me está volviendo loco! Estoy seguro de que es algo tan simple como el infierno! Incluso intenté deshacerme de O_NONBLOCK para ver cuándo recibiría algo ... pero nada ...

Respuestas a la pregunta(5)

Su respuesta a la pregunta