Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

lire les donnees du port série avec inb()

6 réponses
Avatar
fabien.morin
Bonjour tout le monde
Je bosse sur un petit robot qui tourne sous linux, et je dois lire les
donn=E9es qui arrivent sur le port s=E9rie.
Alors j'ai bien pens=E9 =E0 un truc du style fp =3D
fopen("/dev/ttySO","r");
et utiliser fread apr=E8s, mais on m'a dit que =E7a n'=E9tait pas
terrible,
puisque =E7a utilisait un tampon, et que c'=E9tait mieux d'utiliser les
fonctions inb() avec ioperm().

Alors j'ai bien essay=E9, avec un truc tr=E8s simple du style :

#include <stdio.h>
#include <sys/io.h>

int main (){

char temp;

ioperm(0x3f8,8,1);
do
{
temp=3Dinb(0x3f8);
printf("%d",temp);
}
while(1);

return 0;
}

mais =E7a affiche toujours la m=EAme chose =E0 l'=E9cran (en l'ocurence
-4).
Pour tester, j'ai branch=E9 une souris sur le port s=E9rie, et j'ai beau
la
bouger cliquer, ... =E7a change pas, j'ai toujours du -4 !

Quelqu'un pourrais t'il m'=E9clairer un peut sur le sujet

6 réponses

Avatar
Nicolas George
wrote in message
:
Alors j'ai bien pensé à un truc du style fp > fopen("/dev/ttySO","r");
et utiliser fread après, mais on m'a dit que ça n'était pas
terrible,
puisque ça utilisait un tampon,


Jusque là, ce n'est pas faux.

et que c'était mieux d'utiliser les
fonctions inb() avec ioperm().


Et là, ça devient une bêtise, non-portable, peu pratique, incompabible avec
nombre de matériels, etc.

Pour éviter les problèmes liés à fopen/fread, utiliser open/read, et
termios, tout simplement.

Avatar
fabien.morin
Et là, ça devient une bêtise, non-portable, peu pratique, incompabi ble avec
nombre de matériels, etc.


Ouais, mais le problème n'est pas la portabilité puisque le programme
tournera sur un Robot (unque au monde puisqu'on le fabrique) avec un
processeur peut puissant, donc si une fonction peut me faire gagner un
poil de ressource, je dois absolument l'utiliser.
(De plus on m'impose plus ou moins d'utiliser le inb() )

peux tu me dire qu'apportent open (read et write) par raport à fopen
(et les autres) j'ai le man que pour fopen.

Avatar
Marwan Burelle
On 10 Dec 2006 08:52:04 -0800
wrote:

peux tu me dire qu'apportent open (read et write) par raport à fopen
(et les autres) j'ai le man que pour fopen.


Pour faire simple, fopen utilise open(2) et lui rajoute une
interface "évoluée" avec buffer.

En principe open et ses copains sont les appels standards les plus
proches du système.



--
Ferengi Rule of Acquisition #139:
Wives serve, brothers inherit.
-- ST:DS9, "Necessary Evil"

Avatar
lhabert
:

ioperm(0x3f8,8,1);


Quand on fait un appel système, il faut toujours vérifier si il a réussi ou
non. La convention générale est qu'une valeur de retour de -1 signifie un
echec, et autre chose, un succès, et ioperm ne déroge pas à cette règle. En
cas d'echec, on regarde le contenu de la « variable » « errno », pour
trouver sa cause (en fait, on peut utiliser la fonction « perror » pour ça).
Bref, il remplacer ton appel à ioperm par :

if (ioperm(0x3f8,8,1)==-1) {
perror("echec ioperm");
exit(1);
}

Si ton ioperm échoue, ça explique que ce qui suit ne marche pas.

Avatar
fabien.morin
if (ioperm(0x3f8,8,1)==-1) {
perror("echec ioperm");
exit(1);
}



oui bien sur, d'ailleur mon fichier resemble a ce que tu viens
d'écrire, c'était juste pour soulager un peut les news parce que je
pensait que ça n'était pas essentiel pour comprendre le problème.
Mais tu as raison, dans mon programme, je le met.

ba merci à tous, je ne vais pas utiliser inb alors (j'aurais bien
aimé pourtant !) open m'a l'air très bien (je vais expliquer ça au
chef :-) )

Avatar
Julien
Le Sun, 10 Dec 2006 08:20:56 -0800, fabien.morin a écrit :

Bonjour tout le monde


Bonjour,


Quelqu'un pourrais t'il m'éclairer un peut sur le sujet



Il me semble qu'il est nécessaire que ce soit root qui
éxécute les fonction ioperm() et consorts. N'hésite pas à utiliser une
fonction comme perror() pour afficher les messages d'erreurs explicitant
les echecs des appels auc fonctions.

Plus généralement, l'application construite me parait plutôt correcte dans
les grandes lignes. Après, peut-être que les arguments ne sont pas
exactement ceux-là.