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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
fabien.morin@gmail.com wrote in message
<1165767656.740658.41470@j44g2000cwa.googlegroups.com>:
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.
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.
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.
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.
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.
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.
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.
fabien.morin@gmail.com :
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.
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.
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 :-) )
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 :-) )
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 :-) )
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à.
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à.
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à.