Forum Programmation.c lecture d'un port

Posté par  .
Étiquettes : aucune
0
11
mai
2005
Salut à tous

Je voudrais pouvoir lire le port série ( J'ai relier 2 PC ensemble, l'un envoie l'autre réceptionne).

Je ne comprends pas comment faire la lecture du port série.
Lorsque il lis, le PC reste bloquer sur fread(....); et fini, plus rien.
Je lis de cette façon :

char buffer[128];
j=fread(buffer, 1, 1, fp);

J'écris comme ça :
i=fwrite( &car, 1, 1, fp);
Et fp :
fp=fopen("/dev/ttyS0","w+");


J'ai encore une autre question :
Comment fonctionne le protocole de communication pour le port série ?
Quand sais t-il qu'il doit lire?
Qui efface le buffer ( de 1 octet je crois) du port ?
Comment sais t-il qu'il y a quelque chose de nouveau sur le port ?

Toutes ces questions sont sans réponses pour moi!
J'espère que ce n'est pas votre cas :-).

Merci à tous
  • # RS232

    Posté par  . Évalué à 5.

    Salut,

    Un port serie, ca se lit pas "comme ca", il faut le configurer pour savoir comment le lire.

    Fait une recherche sur RS232, tu devrais trouver pleins de choses. Deja sur le fonctionnement du port serie, et ensuite sur la maniere de le programmer sous linux.

    Sinon, pour tout ce qui touche a la prog systeme, je conseille vivement le livre "la programmation systeme en C sous linux" de christophe blaess.
    Un exellent livre, bien ecrit, precis, chaque exemple illustré avec un code source. une reference je trouve.

    Il y a bien sur une partie consacré au RS232
    • [^] # Re: RS232

      Posté par  (site Web personnel) . Évalué à 3.

      Il y a bien sur une partie consacré au RS232


      J'ai dû la zapper.

      C'est un excellent livre, je confirme. Et il pue pas la traduction à dix mètres.
  • # Port série

    Posté par  . Évalué à 9.

    Tout d'abord, merci d'avoir fait un effort sur l'orthographe.

    Pour le port série, il n'y a pas de « protocole » à proprement parler. Renseigne-toi un peu sur le fonctionnement d'une ligne série d'une manière générale et tu verras que c'est très simple.

    Pour résumer, disons que le port maintient au repos sa ligne de transmission à l'état 1 (5V), ce qui lui permet éventuellement de détecter une rupture de câble. Ensuite, au moment de transmettre, le port série commence par émettre un « bit de start », c'est-à-dire un bit toujours à 0, pour indiquer qu'il commence la transmission d'un octet, puis il transmet les bits de l'octet proprement dit, en commençant par le bit de poids faible. Enfin, selon les configurations, il émet généralement un bit de parité (l'équivalent d'un checksum sur un seul bit) pour savoir rapidement si l'octet transmis l'a été sans erreur. Enfin, toujours optionellement, un voire deux bits de stop.

    En outre, le port série est en général équipé de lignes RTS et CTS (man stty) pour Request To Send et Clear To Send. Tu peux demander à ton port série d'écouter ces lignes ou non. Par défaut, elles sont prise en compte. Cela sert à l'équipement terminal de transmission de données (typiquement le modem que tu lui mets au cul), pour pouvoir donner le feu vert au port lorsqu'il a établi la communication et qu'il est prêt à transmettre.

    Evidement, tout cela est géré électroniquement. Même au niveau de l'assembleur, on ne voit que les ports I/O de l'interface et l'on reçoit l'octet tout fait.

    C'est extrêmement simple, robuste, et cela n'a rien à voir par exemple avec le fonctionnement du bus USB, qui s'apparente plus à une sorte d'Ethernet, et dont les spécifications occupent un classeur de dix centimètres d'épaisseur. A l'époque du DOS, la plupart des programmes écrits en assembleur pilotait directement le port avec appels I/O plutôt que de passer par un pilote dédié, tellement c'était trivial.

    Tapes « RS232 » (voire même RS232C) dans Google, qui décidément fait beaucoup pour toi :-), pour obtenir plus d'infos.


    Pour ton problème, vérifie déjà le type de câble que tu utilises pour relier tes ports série. Il faut que ce soit un NULL-MODEM (soit un câble série croisé). Ensuite, vérifie que les ports soient réglés à la même vitesse de chaque coté.
  • # read the source

    Posté par  (site Web personnel) . Évalué à 2.

    http://sourceforge.net/projects/monitor-68hc08/(...)
    toutes les fonctions serie sont dans rs232.c

    y a un truc a lire dans le README pour comprendre pourquoi je boucle a l infini dans ma pause, au lieu d utiliser un usleep(1000) ... c est du au scheduler du 2.4 ... je pense qu avec un 2.6, on pourrais remettre usleep. Pas le temps de tester tout de suite.
    • [^] # Re

      Posté par  . Évalué à 1.

      Je vous remercies de vos commentaire !
      Très intérressant!

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.