10
votes

Linux - Port série Lire l'aigité de retour

Je suis un peu de difficulté à lire des données à partir d'un port série, j'ai ouvert la manière suivante. Je l'ai utilisé cette instance de code de beaucoup de temps et tout va bien travaillé, mais maintenant, pour une raison que je ne peux pas comprendre, je suis totalement incapable de lire quoi que ce soit du port série.

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

le code que je l'habitude d'ouvrir le port série est le suivant : p>

ret = read(hCom, rxchar, n);


1 commentaires

J'ai le même problème. Je peux transmettre mais ne pas recevoir (via un câble d'adaptateur USB-RS232). J'ai essayé sur une autre boîte Linux qui avait un port RS232 et cela a bien fonctionné. Le seul changement que j'ai fait était de / dev / ttyusb0 à / dev / ttys0 . Le premier ordinateur était Fedora le second est Debian. Autre que ça, iDunno. Une autre chose. Lorsque je ferme le programme COM et redémarrez-le, les données sont lues par mon programme! Les données sont le tampon d'entrée, mais mon programme ne le sait pas. En outre, GTKTERM fonctionne bien, de sorte que le H / W est tout correct. Mon programme ne voit pas l'interruption de UART. Cette couche d'abstraction H / W Linux est plutôt à la tourbière


4 Réponses :


11
votes

Lire Ce . < / p>

Eagain non bloquant des E / S a été sélectionné à l'aide de O_NONBLOCK et aucune donnée était immédiatement disponible pour la lecture.


1 commentaires

C'est exactement le problème, si un peu terrestre. Je suppose que la question plus large est la raison pour laquelle vous spécifiez-vous O_NONBLOCK si vous n'êtes pas préparé à gérer son comportement?



0
votes

eagain avec o_nonblock signifie qu'il n'y a pas eu de données reçues sur le port. Vérifiez que le port et le câble fonctionnent correctement (en utilisant Minicom ou un autre programme bien connu), et que la télécommande envoie vraiment des données.


0 commentaires

0
votes

Voir mes échantillons de code, si egain, vous essayez de lire à nouveau:

...
options.c_cflag &= ~PARENB; 
options.c_iflag &= ~INPCK; 
...
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // input
options.c_oflag &= ~OPOST; // output
...
fd = open("/dev/ttyUSB0", O_RDWR | O_NDELY | O_NOCTTY);
fcntl(fd, F_SETFL, 0);
...
int nc = write(hCom, txchar, n);
msleep(500); // wait 500ms
fcntl(hCom, F_SETFL, FNDELAY); // don't block serial read
ret = read(hCom, rxchar, n);
if (ret > 0) {
    here had read n bytes or just partial data, read again if partial.
} 
if (ret < 0) {
    if (EAGAIN == errno) {
        not a real error, just read again.
    } else {
        oops, errors.
    }
}
...


7 commentaires

été là;) vérification de la boucle. Ensuite, sélectionnez Sélectionner pour vérifier lorsque les données sont disponibles ... Tout ce que je pouvais me souvenir ... J'ai essayé;)


Câble NULL-MODEM ou câble de bouclage externe? Si le plus tard, qu'en est-il de la pince?


juste soudé le TX et RX du port RS232 à une autre puis lisez-le de l'hyperterm sur une autre machine


Eh bien, mon code avait testé et travaille dans un cas de bouclavage externe et de l'affaire C code vs Hyperterm. Qu'en est-il d'utiliser sans bloquer mais attendre (500ms) lorsque vous écrivez et définissez FnDelay avant de lire, comme mon code? Si vous ne fonctionne toujours pas pour vous, je n'ai aucune idée aussi.


Désolé mais avez-vous essayé de filer la broche # 5 ensemble aussi, à part # 2- # 3 & # 3- # 2? Les sons n ° 5 sont nécessaires lors de l'affaire PC-PC.


Hummm. pas dans le câble de débogage. Les autres sont entièrement jumelés. J'ai utilisé les câbles qui sont venus avec la boîte que je lis les données de. Il y a quelque chose de louche! "Ressource temporairement indisponible" est ce que M. Erno dit à propos de Eagain, mais personne d'autre n'a le comité ouvert! Je l'ai ouvert, écrit à elle et ensuite ... Je ne peux pas en lire! La lecture pourrait-elle bloquer en quelque sorte ...


Vous vouliez probablement dire o_ndelay et pas o_nlyly



2
votes

Vous devez d'abord vérifier les paramètres de terminal série.

Utiliser la commande - sty -f / dev / ttyusb0 -a

vérifier que ctsrts est sélectionné comme -ctsrts et effectuez les autres paramètres requis avec utilitaire et que vous avez terminé.


0 commentaires