Linux, ports série et pb de synchronisation (pour experts) - C++ - Programmation
Marsh Posté le 25-03-2003 à 09:33:22
Salut,
je pense que tes données sont bufferisées en écriture, c'est-à-dire que lorsque tu les envoie, elles sont simplement recopiées dans un buffer. Elles sont envoyées 'pour de vrai' un peu plus tard, par exemple après un timeout.
Un petit flush devrait te permettre de forcer leur envoi.
J'ai pas d'info plus précises sous la main, mais tu trouveras peut-etre des trucs intéressants sur ce site:
http://www.linuxdevices.com/articles/AT5727959130.html
Bon courage !
Marsh Posté le 25-03-2003 à 09:53:21
La piste la plus probable est celle du flush
Une autre piste à "creuser" est l'allocation des réssources I/O, IRQ, etc. Si tes ports partagent dynamiquement ces ressources, certaines tâches peuvent être considerer comme prioritaires; ou encore, un thread qui veut écrire le truc A mais ne peut pas car les ressurces sont occupées, plutard, tu lui démande écrire le truc B et il s'execute, c'est-à-dire que le truc A n'a pas été fait ...
Marsh Posté le 25-03-2003 à 11:10:16
et comment on fait un flush sur un port ? il me semblait que l action d un write vidait automatiquement les buffers ????
en tout cas merci de vos reponses
Marsh Posté le 25-03-2003 à 11:20:39
FFLUSH(3) Manuel du programmeur Linux FFLUSH(3) |
Marsh Posté le 25-03-2003 à 13:21:14
j utilise les fonctions de bas niveau, autrement dit je fais un write sur un descripteur de fichier et non sur un flux ...
bon c pas grave, de toute facon je ne pense pas que le pb soit la car d ecrire sur le 3eme perturbe parfois le port maitre associé.
Marsh Posté le 25-03-2003 à 13:50:44
FERROR(3) Manuel du programmeur Linux FERROR(3) |
Marsh Posté le 25-03-2003 à 13:55:51
xilebo a écrit : |
IRQ et I/O
EDIT: il y a beaucoup de choses qui accedent aux fichiers et autres ressources?
Marsh Posté le 25-03-2003 à 16:26:46
dans mon appli je n'ecris que sur le port
/dev/ttyS0 (mon bus CAN)
/dev/ttyS3 (la carte controleur TFT)
je n ecris jamais sur /dev/ttyS1 ( c pas a moi de le faire, c au driver)
Or si j ecris dans /dev/ttyS3 ca me perturbe /dev/ttyS1 et le driver me dit qu il y a des pertes de synchros(en gros des caracteres inutiles)
donc a mon avis c pas un pb de flush mais de dependance de port....
Marsh Posté le 25-03-2003 à 16:44:11
xilebo a écrit : dans mon appli je n'ecris que sur le port |
Quelle confiance as-tu dans ton driver? A priori tu écrits/lis sur 3 ports en utilisant le noyau pour le premier et le dernier, et driver spécifique pour le seconde, et c'est ce dernier qui te dit qu'il y a pertes de données, c'est-à-dire que le noyau gére mal tes ports!
Certes, tu peux essayer de regarder de côté de noyau pour savoir s'il y a une option spécifique à activer pour que ton drive se taise mais j'en doute que tu en trouves à moins que le driver a besoin d'un mode spécifique (synchrone/asynchrone) mais il faut commencer par vérifier la config' hardware ...
Marsh Posté le 25-03-2003 à 21:38:23
j ai le source du driver (driver ecrit par le constructeur de la dalle tactile que j utilise http://www.elotouch.com) et je ne vois pas d erreur dedans.
et je precise si j inverse /dev/ttyS3 avec /dev/ttyS2 , mon /dev/ttyS0 n'est pas "perturbé" ... par contre si j envoie des donnees dans /dev/ttyS2, ca met 5 sec SAUF si je lis ou j ecris dans /dev/ttyS0. C est vraiment bizarre
Et le pb , c que je ne peux pas mettre mes ports ttyS2 et ttyS3 sur d autres IRQ car c une carte additionnelle qui se configure par jumper et j ai peu de choix pour les IRQ (chui vert par contre le port paralle ne me sert , ca me bouffe un IRQ et je peux pas l enlever)
Marsh Posté le 24-03-2003 à 16:48:55
Salut,
Je developpe actuellement une application sur une carte PC104 ( PC embarqué, compatible x86) avec linux d installé dessus. Or sur cette carte il n y a que 2 ports serie (comme la plupart des PC) . J ai donc rajouté une carte d 'extension avec 2 ports supplémentaires.
Sachant que jai besoin de 3 ports série, j ai donc 3 Threads auxiliaires tournant sur chacun des ports. Le pb est que j'ai un pb de synchro. Explication :
Sur le port ttyS0 j ai un cable relié à un bus CAN (avec une interface CAN-RS232) qui dialogue dans les 2 sens.
Sur le port ttyS1, j ai un controleur série de dalle tactile , le driver dialogue dans les 2 sens pour la config (au demarrage de X) mais sinon ne fait que lire ce qu il y a sur le port.
Sur le port ttyS2 , je suis relié a une carte controleur d ecran TFT , je ne fait qu envoyer des trames (j ignore la reception meme si il y a des trames recues).
Le pb est que : si j envoie une trame dans ttyS2 , elle n est envoyée que 5 sec(ou carrement ignorée!!) apres SAUF si entre temps je recois ou j emets quelque chose dans ttyS0 (apparemment il y a une relation maitre-esclave entre port 0 et 2 , mais aussi port 1 et 3)
si j'inverse ttyS2 et ttyS3, cette fois ci ca ne fonctionne plus et ca fait planter le driver de la dalle tactile (toujours pb relation port 1 / port 3)
si par contre je debranche ttyS1 (la dalle tactile) et que je configure mon envoi vers le controleur dalle TFT sur le port ttyS1 (il ne reste plus que ttyS0 et ttyS1) ca marche nickel , c est instantané et pas de plantage
J ai evidemment loggué mes envois : ca marque bien que le write a été fait (sans retour d erreur) mais il est "vraiment envoyé" seulement 5 sec apres .
Je pense donc que les ports ttyS0/ttyS2 et ttyS1/ttyS3 sont dépendant l'un de l autre (relation maitre / esclave commme je le disais) mais je ne comprends pas trop la reaction.
Est ce que j ai quelque chose a configurer sur le port (genre un fcntl) ???
Ou alors c peine perdue, on ne peut pas utiliser 4 ports en meme temps ? (dans ce cas, faut me dire l interet d avoir 4 ports :-/ )
Merci de vos reponses