je voudrais savoir comment écrire et lire sur un port série. J'ai vu partout que c'était simple avec read et write ....................mais non!!!
J'arrive à ouvrir le port mais je n'arrive rien a envoyer ou à lire sur le port série....
N'auriez vous pas la syntaxe pour effectuer ces opérations ???
numFichier=open(port,O_RDWR|O_NONBLOCK);
if(numFichier>0)
{
printf("OK\n");
do
{
printf("\nMENU :\n1) Emettre 'a'\n2) Recevoir\n3) Quitter\n:");
scanf("%i",&choix);
//#########################################################
if (choix==1)
{
printf("\nGO.....\n");
write(numFichier,buf,sizeof(buf));
printf("\nEcriture faites\n");
}
//#########################################################
else if (choix==2) // Recevoir
{
i=-1;
boucle=0;
while(i<=0 && boucle<=1000) // Effectue 1000 lecture max
{
boucle++;
i=read(numFichier,&texte,10);
printf("Nombre d'octet lu : %i\n", i);
}
}
//########################################################
else if (choix==3) // Quitter
key=1;
else printf("Mauvaise commande\n");
}
while(key==0);
close(numFichier);
}
else printf("ERREUR\n");
i=ioperm(port,1,0); // Demande permission de fermer le port
printf("Fermeture du programme\n");
# exemple d'implémentation
Posté par Mathias Bavay (site web personnel) . Évalué à 3.
Tu peux télécharger un soft que j'avais fait il y a quelques temps pour un appareil connecté sur le port série: http://mathias.bavay.free.fr/software/gm4lin/(...)
J'avais essayé d'écrire la partie de gestion du port série (dans les fichiers "serial.c" et "serial.h") de la façon la plus propre possible afin de pouvoir facilement le conserver comme exemple d'implémentation (car ce genre d'exemple manque cruellement).
Mathias
[^] # Re: exemple d'implémentation
Posté par Edouard Gomez (site web personnel) . Évalué à 3.
strftime(iso_time, (size_t)20, "%Y-%m-%d-%H:%M:%S", localtime(&timing);
devrait etre:
strftime(iso_time, (size_t)20, "%Y-%m-%dT%H:%M:%S", localtime(&timing);
Notes le T qui separe la partie YYYY-MM-JJ et l'heure:min:sec.
C'est decris dans le standard ISO 8601, dont une reference est faite dans un document du w3c par exemple:
http://www.w3.org/TR/NOTE-datetime(...)
Juste une remarque Out Of Topic en passant, désolé du dérangement.
# Ahum
Posté par Ph Husson (site web personnel) . Évalué à 2.
les if() elseif() dans le cas la c'est franchement pas super et ca aide pas à la visibilité (par contre les //#### c'est bien)
switch(choix) {
case 1:
blah blah;
break;
.
.
.
default:
MECHANT;
break
}
Apres tu fais un if sur la valeur de retour du open:
ca peut être égal à 0 (bon faut le faire expres mais pour un démon c'est possible)
Plutot que printf("ERREUR\n"); faire perror("open serial port");
Le ioperm je doute fortement qu'on l'utilise comme ca(et meme remarque pour le open sauf que la tu teste meme pas la valeur de retour).
ioperm c'est pour accéder à une plage d'IO directe,
De ce que je vois port (cf le open) c'est une chaine de caractere, donc ca doit pas être joli à voir
et finalement
Apres avec les read et write il se passe quoi?
Ca plante?
Ca bloque?
PS:Je passe à côté du scanf pour lequel tu ne vérifie pas la valeur de retour (pour être sur qu'on a recu un entier)
[^] # ......
Posté par angsthase . Évalué à 1.
scanf
Comment voir si c'est bien un entier que l'on recoit ???
Quel fonction, algo ???
if else => switch
je vais le faire
ioperm
Je l'utilisais pour communiquer avec le port parallele avec inb et outb aussi.
Mais c'était juste une démo!
perror
j'utilise pas je ne vois pas l'interet pour mes petit programme. Mais c'est vrai que si mes programme doivent ce developper, il faudrais mieux que je fasse tout dans les regles de l'art.....
open ????
Je teste pas la sortie?????
Alors quel test faut -il faire ???
READ
La mon programme est aléatoire. Des fois il plante, des fois il reste bloquer sur le read.
WRITE
Tout ce passe bien mais je n'ai pas les moyen de verifier si il a bien envoyer les données.
INFO
Pour info, j'utilise un module à la sortie du port qui boucle.
C'est à dire qu'il s'envoie lui-même les données....
Je te remercie déjà pour l'attention que tu me porte. En attendant ta prochaine réponse( :-) ) je vais changer mon programme.
Merci
[^] # Re: ......
Posté par Ph Husson (site web personnel) . Évalué à 2.
Ca renvoie le nombre de champs remplit
Donc if (scanf(blahblah)!=1)
probleme;
Pour le ioperm faut bien nettoyer quand même :)
pour le perror t'as raison
pour le open le problème c'est que la valeur de retour peut être égale à 0, donc il faut mettre if(fd>=0) au lieu de if(fd>0)
Mais bon pour un programme normal en général ca passe
Les réglages du port série sont bons? (tu peux faire en ioctl en C ou stty en console)
# How to
Posté par Christophe Mutricy . Évalué à 2.
Il y a un example de code donc après tu as plus qu'à adapter.
hth,
--
Xtophe
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.