2011-01-06 4 views
0

J'essaie de lire les données binaires d'un périphérique série dans c sur linux. Le problème est que, parfois, il y a des caractères dans le tampon interne du pilote, mais l'interrogation (avec select (2)) revient indiquant que le périphérique n'est pas prêt à être lu.uart buffer n'est pas lu

J'ai lu et relu l'homme de Termios et tous les hommes liés et cherché sur Internet. Je crois que j'ai mis tous les drapeaux correctement (à savoir VTIME, VMIN) et ICANON unset. J'ai essayé d'utiliser la fonction "tcmakeraw", mais cela n'a pas résolu le problème.

Avez-vous des idées sur ce que je devrais faire?

Amitiés & Merci à l'avance Yannay

+3

Fixez le code ... – BlueDog

+1

Rappelez-vous de remplir à nouveau 'readfds' avant * chaque appel à' select() '? – caf

+0

Quel type de port série? (c'est-à-dire un vrai 16550, un clone 16550, un convertisseur USB, bluetooth, irda, ...) –

Répondre

0

Qu'est-ce qui se passe quand vous lisez directement (et non par C) /dev/ttyS0 (ou équiv) après avoir setserial vos paramètres. Êtes-vous en mesure d'obtenir les données nécessaires en dehors du select()?

+0

Les seuls indicateurs qui sont définis sont: CREAD, CLOACL, CS8, NL0, CR0, TAB0, BS0, VT0, FF0. le débit en bauds est réglé correctement. VMIN = 1, VTIME = 0. Cependant, le problème n'est pas résolu/j'essaie de lire sans sélection. il suffit de lire et aucun octet n'est renvoyé. – yannay

1

Vous devriez nous indiquer le code. Je commencerais par utiliser cfmakeraw sur le port série. Une fois que vous avez des choses fonctionnant en mode brut, vous pouvez faire des modifications et voir comment cela fonctionne. Voici une liste des questions ou des choses que vous pouvez vérifier:

  • après avoir modifié l'attribut, en utilisant par exemple cfmakeraw, appelez-vous tcsetattr (...) à appliquer votre changement? Comment prouver que des données sont toujours présentes dans le tampon de réception du pilote?

  • vérifiez-vous votre appel système pour les erreurs?

  • Quel est le résultat de stracing votre programme?

Modifier en fonction de vos commentaires: Votre protocole "garantie" .... => vérifier votre hypothèse! Non cochée, cristal clair garantie sont un bon coandidate pour "erreur impossible"

Fondamentalement: soit select is broken, ou votre pilote série. Raison pour laquelle le pilote série est cassé est un fifo matériel n'étant pas assez complet pour déclencher une interruption, ou perdre une interruption.

+0

1. oui. 2. c'est compliqué. le protocole que j'utilise garantit un ACK après chaque message. Parfois, je ne reçois pas l'accusé de réception à moins que plus de données soient envoyées à partir de l'appareil. Je suis 100% ce n'est pas le problème. 3. Bien sûr. 4. Je vais essayer si tout échoue ... – yannay