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...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen diese.
Benötigen Sie das serielle terminal-Einstellungen zuerst.
verwenden Sie den Befehl
- stty -F /dev/ttyUSB0 -a
Überprüfen Sie, dass
ctsrts
ausgewählt ist-ctsrts
und die anderen erforderlichen Einstellungen mit
stty
Dienstprogramm, und Sie sind fertig.EAGAIN
mitO_NONBLOCK
bedeutet, es gibt keine empfangenen Daten auf dem port. Überprüfen, dass der port und Kabel sind ordnungsgemäß (mit minicom oder einige andere bekannte-gutes Programm) und die remote ist wirklich sendet einige Daten.siehe meine code-Beispiele, wenn EAGAIN, Sie würde versuchen, noch einmal zu Lesen:
Habe ich das gleiche problem. Kann ich übertragen, aber nicht empfangen (via USB-RS232-adapter-Kabel). Ich habe versucht, auf einem anderen linux-box, hatte eine RS232-Schnittstelle und es funktionierte Prima. Die einzige änderung die ich gemacht hatte, war von
/dev/ttyUSB0
zu/dev/ttyS0
. Der erste computer war Fedora die zweite ist Debian. Andere als die, idunno.Eine andere Sache. Wenn ich schließen Sie das com-Programm und starten Sie es neu, die Daten zu Lesen durch mein Programm! Die Daten der input-buffer, aber mein Programm weiß es nicht. Auch, gtkterm funktioniert gut, so ist die h/w ist alles OK. Mein Programm sieht nicht den UART-interrupt.
Diese linux-h/w abstraction layer ist eher falsch. Dies sollte kein problem sein.