IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Turbo Pascal Discussion :

[TP] port série rs232


Sujet :

Turbo Pascal

  1. #21
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    Salut Cyb!
    J'ai regardé le programme de démo; On va s'en servir comme base, c'est mieux, et plus rapide! Première étape: je doit simplifier au maximum ce prog pour que ce soit bien clair. Cela veut dire que j'enlève toutes les fonctions qui ne nous servent pas pour l'EMISSION, et j'automatise ces fonctions restantes. Après on remettra les fonctions utlisateurs quand la transmission sera au point...

    ENLEVE('1 - Envoi d''une chaine de test vers le COM',NumCom,'.');
    ENLEVE('2 - Lecture du COM',NumCom,'.');
    GARDE('3 - Envoi vers le COM',Numcom,'.');
    ENLEVE('4 - Changement de port.');
    ENLEVE('5 - Configuration du port COM',NumCom,'.');
    GARDE('ESC pour terminer');

    La configuration du port COM se fait à l'initialisation du programme, avec les valeurs imposées par défaut...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    begin clrscr;
     
      NumCom:=1;  { PORT COM [1..4]     }
      br:=1200;   { 1200..115200 bauds  }
      p:='A';     { PARITE: [P,I,A,M,S] }
      ws:=8;      { NBR OF BITS [7,8]   }
      sb:=2;      { NBR BIT STOP [1,2]  }
      bs:=10000;  { TAILLE DU BUFFER    }
      OpenCom(Numcom,br,p,ws,sb,bs);
     
      window(1,1,80,25); clrscr;
      writeln('Utilise le COM',Numcom,' à ',br,' Bauds');
      writeln('Parité "',p,'" ',ws,' Bits de données, ',sb, ' bit de stop');
      writeln('Buffer de ',bs, ' octets');
      writeln('Entrer le texte à envoyer vers le minitel (Esc pour finir).');
     
      TestErreur;
     
      { Boucle d'EMISSION d'un byte, juqu'à la touche Echap }
     
                   REPEAT
                   car:=readkey; if(car<>#27)then ComOutChar(NumCom,car);
                   UNTIL car=#27;
     
     
      if Cominready(numcom)then writeln('Caractère à lire.')  { test l'état du buffer }
                           else writeln('Buffer vide.');
      CloseCom(NumCom);                                       { Ferme le port }
      end.
    Voilà la première modif de la procédure principle du program (MAIN) est finie, simplifiée et optimisée juste pour l'émission de données à partir du clavier. Si tu me suis toujours, maintenant on va s'occuper d'intégrer la gestion du fichier source, pour remplacer les données clavier par les données du disque...

  2. #22
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    J'ai testé le programme xport21 mais il lui faut le port com 3 alors que moi je n'ai que 2 port com. N'ayant pas les sources, il ne mène nulle part !

    Juste pour tester tes ports com le programme DEMOCOM.PAS va très bien, il faut simplement l'ouvrir 2 fois, 1 fois pour l'expédition et une fois pour la réception.

  3. #23
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    :o Je n'ai pas 2 ports COM de libres, j'en ai qu'un! Tanpis, laisse tomber, je vais faire autrement, c'est toi qui va tester les programmes (t'en fait pas, je t'explique tout en détails, et n'hésite surtout pas à me poser des questions si tu comprend pas quelques chose, ok?
    Etudie le nouveau programme simplifié de l'emission . Remplace dans le programme original, la procédure principale par le code que j'ai écris ci-dessus, ça te donnera alors un nouveau prog que tu sauvegardes avec un nom différent, on va dire Tx_COM.PAS! Ce prog est à tester! Je compte sur toi! A+

  4. #24
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    :

    Je n'ai pas bien saisi cette partie, elle se trouve avant le programme principal, n'est ni un procédure, ni une fonction, ni des variables...

    ENLEVE('1 - Envoi d''une chaine de test vers le COM',NumCom,'.');
    ENLEVE('2 - Lecture du COM',NumCom,'.');
    GARDE('3 - Envoi vers le COM',Numcom,'.');
    ENLEVE('4 - Changement de port.');
    ENLEVE('5 - Configuration du port COM',NumCom,'.');
    GARDE('ESC pour terminer');


    Pourrais-tu m'expliquer, STP ? merci !

  5. #25
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    oui bien sûr, je t'explique: C'est le menu qu'a fait l'auteur pour les touches de commande, et c'est une info pour dire ce qui j'ai enlevé ou garder de ces fonctions... D'ailleurs, y a que ce que j'ai mis la fenêtre code qui est valable... Tout le reste ne sont que des explications. Tu fais un Copier/Coller de ce nouveau code, pour le remplacer dans l'original, et tu le sauvegardes avec un nouveau nom! A toute!

  6. #26
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    La procédure d'initialisation du port COM est terminée. Souvient-toi bien de la liste (méthode de programmation), qui est la base de notre programme d'émission...

    Donc, maintenant le 1) est fini... Et on passe au 2) et 3). La procédure d'ouverture d'un fichier et de copie va être simple; On a besoin d'un nom de fichier en paramètre, le programme nous donnera ensuite sa taille en octets (fsize). On gère la position réel du fichier (fpos) en accumulant le nombre d'octets réellement lus (nread); Voici un exemple de l'utilisation Blockread (émission):

    { --------------------------------------------------------------- }
    PROCEDURE Tx_FILE(nom_f:STRING);

    VAR f : FILE;
    nread : INTEGER;
    fsize : LONGINT;
    fpos : LONGINT;

    BEGIN fsize:=-1;
    {$i-} Assign(f, nom_f); SetfAttr(f, 32); Reset(f, 1);
    {$i+} If(ioresult<>0)then exit;
    {$i-} fsize:=filesize(f); fpos:=0;

    REPEAT
    seek(f, fpos);
    BlockRead(f, buffer, bufsize, nread);
    fpos:=fpos+nread;

    { <- 4) l'émission du Buffer est appellée ici -> }
    UNTIL(fpos>=fsize)or(nread<>bufsize)or(doserror<>0);
    Close(f); END;


    Le fichier est ouvert, puis débité par blocs de 64kb, jusqu'à la fin du fichier. La gestion des erreurs est minimale...
    Mais dans l'unité ComLib, nous diposons de deux buffers!
    J'ai pas tout de suite trouvé, mais en me penchant sur le code de l'unité. je pense à un buffer pour COM1, et un autre pour COM2 (Rx/Tx). . .
    Au début je pensais à un double-buffer! A+

  7. #27
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 25
    Points : 9
    Points
    9
    Par défaut

    Un petit problème se pose dans la procédure
    "PROCEDURE Tx_FILE(nom_f:STRING); " :

    Il y a un passage de paramètre par valeur : ...(nom_f:STRING);
    ainsi qu'une variable locale à la procédure : nom_f:STRING;

    Lorsque je compile le programme, il y a le message d'erreur suivant :
    "Error 4 : Duplicate identifier (nom_f).

    Il faudrait modifier une de ces deux variables.

  8. #28
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    Salut CYB!
    Le seul code valable pour ton prog sera dans les cadres intitulés "code"..! Tout le reste sont des explications. J'ai reédité le message pour le coriger!

    4) TRANSMISSION

    POUR L'INSTANT, Je simplifie en utilisant qu'un seul buffer:

    1 -> charge un buffer à partir du fichier
    2 -> Envoi ce buffer sur le port COM Tx
    3 -> Test de la fin d'émission du buffer
    4 -> Vidange du buffer (suivant la méthode)
    5 -> Goto 1


    Pour envoyer les données, ya la commande d'envoi octet par octet:
    -> ComOutChar(NumCom,car);
    C'est celle qu'utilise le programme DEMOCOM (et dont on est sûr qu'elle fonctionne). L'auteur a aussi prévu une commande d'envoi par bloc, logiquement plus rapide:
    -> ComOutStr(NumCom,StBuffer);
    Mais je ne vais pas utiliser cette commande pour l'instant, je l'essaierai plus tard: Je veux d'abord faire un prog qui marche, et ensuite, j'optimiserai le code de la transmission!

    REMARQUES

    Il faudra aussi penser à une méthode pour transférer le nom du fichier, ses attributs et date de création... Sinon, le transfert du fichier sera incomplet! Ca presse pas, on verra tout ça plus tard...

    Il faut que je trouve une souris USB pour libérer un port COM! Bientôt, je détaille la procédure de reception, d'écriture des données sur le disque dur... Ensuite on passera à l'optmisation... A+

  9. #29
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    EMET v0.1 - Ya un décalage d'une trame dans le buffer par rapport à la taille du fichier. Faudrait que le prog en tienne compte pour éviter des erreurs. Ce problème vient de la taille minimale du buffer.
    Les attributs du fichier ne sont pas encore transférer, dommage.
    Et pour les noms de fichiers, seul le format 8.3 est supporté... A+

  10. #30
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 25
    Points : 9
    Points
    9
    Par défaut


    Salut LaGuimb,

    Super, génial, mais y a un truc que je ne comprends pas :

    Pourrais-tu m'expliquer a quoi servent les fonctions de convertion de type ? (les fonctions : vall, stt, chtoby, upst, hex)


  11. #31
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Salut à tous,

    Je pars en vacances ce soir, alors bonne fêtes de fin d'année et meilleurs voeux à tous !



    Attention au mal de crâne le 1er janvier !

  12. #32
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    Salut Cyb!
    Apparemment tu débutes, je vais t'expliquer en gros les fonctions que j'ai rajouté. J'utilisent souvent ces fonctions "standarts", je les mets dofis dans mes progs! Elles permettent la conversion de type, pour pouvoir utiliser une variable d'un certain type dans pratiquement toutes les fonctions: Par exemple, la fonction READKEY qui attend l'appui d'une touche et retourne un caractère: J'utilise la fonction CHTOBY pour obtenir le code BYTE de la touche. Avec x:=chtoby(readkey), la touche ECHAP retourne 27 (un type BYTE) au lieu de #27 (type CHAR).

    function UPST - Transforme une chaîne de caractère (STRING) en masjuscle. Cette fonction se sert de UPCH de l'unité système Crt.

    function CHTOBY - Convertit un caractère (CHAR) en nombre (BYTE) de 0 à 255. Cette fonction ressemble à ORD.

    function VALL - Convertit une chaîne de caractère (STRING) qui représente un nombre, en nombre (LONGINT). Voir dans l'aide du compilateur Pascal, les fonctions VAL et STR de Turbo Pascal.

    function STT - Inverse de VALL. Convertit un nombre (LONGINT) en chaîne de caractère (STRING).

    function HEX - Transforme un nombre de 0 à 255 (BYTE) en chaîne de caractère spéciale (STRING2) de 2 caractères. Cette chîne représentant la valeur HEXA du nombre. Exemple: hex(32) retourne '20';


    Voilà pour les explications de l'utilité des fonctions
    Sinon, je voulais te demandé si tu as pu faire quelque chose d'intéressant pour l'instant, ou attend-tu que je termine ce prog pour l'essayer? A+

  13. #33
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut Sur mon site!
    Salut à tous!
    Voici le programme compilé et ses sources que vous
    pouvez télécharger sur mon site:

    http://ljus.free.fr/dat/emet.exe
    http://ljus.free.fr/dat/emet.pas
    http://ljus.free.fr/dat/comlib.pas

    L'unité COMLIB ne fonctionne pas avec des fichiers de
    taille inférieure ou égale a 10 octets!

    Les attributs du fichier ne sont toujours pas transféres.
    Ce sera necessaire de programmer cette fonction.

    BONNES VACANCES & BONNES FÊTES A TOUS!

  14. #34
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Salut LaGuimb,

    Comme tu t'en est rendu compte, je suis débutant dans le développement.

    N'ayant pas la possibilité de tester le prog chez moi, je le testerai au boulot à mon retour de vacances le 6 janvier.

    Joyeux Noël et A+

    CYB33

  15. #35
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    Salut Cyb33!

    PROGRAMME D'EMISSION

    En chechant de la doc, j'ai trouvé le moyen d'envoyer un fichier avec une commande du DOS:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MODE COM2:9600,N,8,1
    TYPE namefile.ext>COM2
    C'est le top pour simplifier les programmes!!! On verra plus tard...
    Pour le moment, je termine ce que j'ai commencé!

    Rappels: En programmation les nombres sont codés en Hexa:
    - 6 Bytes, type REAL (pas utilisé dans ces progs)
    - 4 Bytes, type LONGINT (appellé aussi DWORD)
    - 2 Bytes, type WORD (0..65535)
    - 1 Byte, type BYTE (ou CHAR) = 1 octet (0..255)


    LE TRANSFERT DES ATTRIBUTS:
    C'est à nous à définir l'ordre de transfert:
    1) En premier le nom du fichier qui est au format "8.3". Avec le point, ça fait 12 caractères à transférer.
    2) Puis, la date et l'heure, sauvegardées dans la variable "fdate", un LONGINT équivaut à 4 Bytes.
    3) L'attribut d'accès est sauvegardée dans la variable "fattr". Un WORD équivaut à 2 Bytes .
    4) Et pour finir, la taille du fichier, sauvegardée dans la variable "fsize" équivaut à 4 Bytes.
    -> 12+4+2+4=22 octets).


    Pour envoyer les nombres au port COM, j'utilise une convertion de type LONGINT vers CHAR. La méthode utilise un enregistrement (Record) pour décomposer un LONGINT en 2 WORD (longrec), puis un autre pour décomposer un WORD en 2 BYTE (wordrec)...

    http://ljus.free.fr/dat/emet02.exe
    http://ljus.free.fr/dat/emet02.pas

  16. #36
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    IMPORTANT
    Le DOS n'est pas multi-tâche, il n'est pas possible d'éxécuter les deux programmmes simultanément (à moins d'en faire un résident, ... Il faudra utiliser deux ordinateurs, même pour les tests! Le Dos n'est pas capable de lire et d'écrire sur un disque en même temps, il utilise des buffers en temps partagé!


    PROGRAMME DE RECEPTION

    1) Ouverture et la configuration du port.
    2) Une boucle d'attente est mise en place.
    3) Les attributs du fichier sont reconstitués.
    4) Les attributs vont permettrent de détecter des erreurs.
    5) Après ces tests, le programme copie les données du port.
    6) A la fin de la reception, le fichier est cloturé, son attribut d'accès est rectifié comme le fichier original.
    7) Après la reception d'un fichier, le programme se met en attente d'un autre fichier -> Retour au 2).
    8) Touche Echap -> Fermeture du programme.


    Le nom du fichier est recrée en cumulant les 12 premiers caractères. Pour les autres attributs (des nombres), il sagit d'une convertion de type 4 CHAR vers LONGINT...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    FUNCTION Rx_LONG:LONGINT;
    var output:Longint;
    BEGIN
    Output:=chtoby(ComInChar(NumCom));
    inc( Output ,chtoby(ComInChar(NumCom))*$FF);
    inc( Output ,chtoby(ComInChar(NumCom))*$FFFF);
    inc( Output ,chtoby(ComInChar(NumCom))*$FFFFFF);
    Rx_LONG:=output;
    END;
    http://ljus.free.fr/dat/recep1.exe
    http://ljus.free.fr/dat/recep1.pas

    Il faut que je fasse un test de transfert avant d'aller plus loin...
    A+

  17. #37
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    Les programmes sont maintenant fonctionnels (en théorie) -> Je confirme dès que j'ai fait les tests. Pour revenir aux commandes du DOS, il est facile de faire un programme pour automatiser ces commandes... Cette solution peut remplacer l'unité COMLIB!
    Pour faire un choix, il faut que je teste les 2 solutions, et le protocol de transmission...
    J'ai fait un test de transmission avec deux PC, mais l'un des deux fonctionnait sous WindowsXP alors que l'autre était sous 98. Je crois bien qu' XP bloque l'utilisation des ports..! En tous les cas, je n'ai pas réussi à le faire fonctionner. Pour la suite, j'attendrais ton avis. J'ai changé de language de programmation (delphi) pour continuer un autre projet.. A+

  18. #38
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Salut à tous,

    De retour parmis vous après ces 2 semaines de repos !

    Meilleurs voeux et bonne année à tous.

  19. #39
    Membre du Club
    Inscrit en
    Octobre 2002
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 62
    Points : 61
    Points
    61
    Par défaut
    Salut et Bonne année!

    Ya du nouveau! Je programme maintenant avec delphi, et c'est pour windows, alors adieu le dos! J'ai trouvé des composants pour utiliser les ports en accès direct, même sous XP!
    Autrement je n'ai pas pu tester mon prog avec TP, car j'avais deux PC, un avec 98, mais l'autre avec XP... Si tu veux te remettre dans le bain ,je te conseil de relire les messages précédents si tu ne l'as pas déjà fait! a+

  20. #40
    Futur Membre du Club
    Inscrit en
    Novembre 2002
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Salut,

    Je n'ai pas réussi à faire fonctionner ton prog ! Voici ce qu'il me donne lorsque je lance l'exe...

    EMET.PAS - Laguimb - 12/02
    Usage EMET [filename.ext] [NumCom:1/2]

    Erreur: Besoin d'un fichier en parametre
    Presser une touche...


    Et lorsque je paramètre un nom de fichier avec son emplacement je n'arrive plus à compiler le prog, l'erreur 89 vient sur la procédure Tx_FILE.

    :trouve: Sinon pour ma part j'ai réussi à modifier le programme "DEMOCOM" et le faire fonctionner, donc pour moi le cas est résolu !

    Merci pour ta précieuse aide et bonne chance pour Delphi !

    Pour ma part mon stage en TP arrive à échéance et je vais commencer à étudier Access et VB .....

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Erreur de configuration du port COM, pour communication RS232 (en C)
    Par Storm_Ennairo dans le forum Bibliothèques, systèmes et outils
    Réponses: 0
    Dernier message: 24/02/2012, 15h43
  2. Erreur de configuration du port COM, pour communication RS232
    Par Storm_Ennairo dans le forum Réseau
    Réponses: 0
    Dernier message: 23/02/2012, 15h01
  3. Réponses: 3
    Dernier message: 19/05/2010, 09h12
  4. Communiquer sur port COM avec MSCOMM (RS232) et VISCA (caméra sony)
    Par Chekov dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/03/2008, 20h44
  5. [TP] Gestion du port COM1 en liason RS232
    Par jarc26 dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 01/03/2005, 13h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo