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
Vous devez vous connecter pour publier un commentaire.
Lire cette.
OriginalL'auteur jldupont
Vous devez vérifier le numéro de série du terminal de paramètres.
utiliser la commande
- stty -F /dev/ttyUSB0 -a
Vérifier que
ctsrts
est sélectionné comme-ctsrts
et les autres paramètres requis avec
stty
utilitaire et vous avez terminé.OriginalL'auteur Sunny
EAGAIN
avecO_NONBLOCK
n'y a pas de données reçues sur le port. Vérifiez que le port et le câble fonctionne correctement (à l'aide de minicom ou de quelque autre bon programme), et que la télécommande est vraiment de l'envoi des données.OriginalL'auteur bdonlan
voir mes exemples de code, si EAGAIN, vous essayez de lire à nouveau:
câble null-modem ou externe câble de boucle? si le plus tard, le brochage?
juste soudé le Tx et Rx du port RS232 à un autre, et ensuite de lire le formulaire de hyperterminal sur une autre machine
eh bien, mon code a testé et fonctionne dans les deux externes de bouclage de cas et de code c vs hyperterminal cas. comment au sujet de l'utilisation sans NONBLOCK mais attendez(500ms) lors de l'écriture, et de définir FNDELAY avant de lire, à l'instar de mon code? si encore fonctionne pas pour vous, je n'ai aucune idée de trop.
désolé, mais avez-vous essayé de fil de la broche no 5 de concert, en plus de #2-#3 & #3-#2? sons #5 est requis lors de dans PC-PC.
OriginalL'auteur Test
J'ai ce même problème. Je peux transmettre, mais pas en recevoir (via adaptateur USB-RS232 câble). J'ai essayé sur une autre machine sous linux, qui avait un port RS232 et il a très bien fonctionné. La seule modification que j'ai faite a été de
/dev/ttyUSB0
à/dev/ttyS0
. Le premier ordinateur a été Fedora le deuxième est celui de Debian. Autres que que, idunno.Une autre chose. Quand je ferme le programme de com et de le redémarrer, les données sont lues par mon programme! Les données de la mémoire tampon d'entrée, mais mon programme ne le savent pas. Aussi, gtkterm fonctionne très bien, de sorte que le h/w est tous OK. Mon programme ne vois pas l'UART d'interruption.
Ce linux h/w couche d'abstraction est plutôt faux. Cela ne devrait pas être un problème.
OriginalL'auteur Don Lawrence