Linux - serial-port Lesen EAGAIN zurückkehren

Ich habe einige Probleme beim Lesen einiger Daten von einem seriellen port öffnete ich die folgende Art und Weise. Ich habe dieses Beispiel der code viele Male und alles funktionierte gut, aber jetzt, aus irgendeinem Grund, ich kann nicht herausfinden, ich bin völlig unfähig, etwas zu Lesen aus dem seriellen port.

Ich bin in der Lage zu schreiben, und alles wird korrekt empfangen am anderen Ende, aber die Antworten (die sind korrekt gesendet), nie erhalten haben (Nein, die Kabel sind alle ok 😉 )

Den code, den ich verwendet, um öffnen Sie die serielle Schnittstelle ist folgende:

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

Nachdem der port ist initializeed ich Schreibe ein paar Sachen, die es über einfache write-Befehl...

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

hCom, wo ist der Datei-Deskriptor (und es ist ok), und (wie ich sagte) das funktioniert. Aber... wenn ich eine Lesen danach, bekomme ich eine "Resource temporarily Unavailable" - Fehler aus errno.

Getestet habe ich wählen, um zu sehen, wenn der file-Deskriptor hatte etwas t gelesen... aber es ist immer mal aus!

Ich lese die Daten wie hier:

ret = read(hCom, rxchar, n);

und ich bekomme immer ein EAGAIN und ich habe keine Ahnung, warum.

Update:

Die HW ist in Ordnung! Ich kann sehen, dass es ist, eingehende Daten über die serielle Schnittstelle, da habe ich eine debug-Kabel zu Lesen, was Los ist, auf einem anderen terminal. So...

Ich weiß, was nicht blockierende tun sollte. Meine Frage ist... warum ist nicht alles immer Lesen!. Das gleiche setup funktioniert gut auf windows, so dass alle die hardware ist in Ordnung, die...

Dies treibt mich Nüsse! Ich bin sicher, es ist etwas einfach wie die Hölle! Ich habe sogar versucht, loszuwerden, O_NONBLOCK, um zu sehen, wenn würde ich Sie bekommen etwas... aber nichts...

Schreibe einen Kommentar