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] Gestion du port COM1 en liason RS232 [Non suivi]


Sujet :

Turbo Pascal

  1. #1
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 2
    Par défaut [TP] Gestion du port COM1 en liason RS232
    Bonjour à tous et à toutes ....

    Voilà mon souci : j'ai besoin de récuperer les données qui arrivent au fil de l'eau par le COM 1 par le biais d'une RS 232 ....
    après , je les stockerai dans un fichier texte mais a priori , ca , je connais ....
    mon probleme concerne l'acquisition des donnees et la configuration du port COM ..
    J'ai déja recupéré un source mais ca ne fonctionne pas du tout ( ou peux etre que je n'arrive pas a le faire fonctionner...)
    Pour tester je relie 2 Pc par un cable RS232 , et j'active l'hyperteminal sur l'un qui envoies des characteres mais le probleme c'est que le prog qui est dans le 2eme Pc ne reçoit rien ....( si je met l'hyperteminal sur le 2eme Pc , la com fonctionne...)

    Quelqu'un aurait il dejà des infos sur ce type de programme ???

    Merci de votre aide et bonne journée ....


    je vous transmet le source recuperé :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    program com;
     
    uses dos,crt;
     
    const nbport = 0;       {**********************************************}
                            {* nbport = 0     pour    COM1                *}
                            {* nbport = 1     pour    COM2                *}
                            {**********************************************}
     
     
    procedure rs_init;
    {**********************************************************************}
    {* Initialise le port RS232C : 8 bits de donn‚es                      *}
    {*                             2 bits Stop                            *}
    {*                             Parit‚ Paire                           *}
    {*                             Vitesse … 2400 Bauds                   *}
    {*  Cette procedure doit ˆtre appel‚ une fois , avant de pouvoir      *}
    {*  utiliser la liaison s‚rie                                         *}
    {*  Entrée: AH = 0x00               				      *}
    {*                        DX = Numéro de l'interface série	      *}
    {*                                0x00 = COM1                  	      *}
    {*                                0x01 = COM2			      *}
    {*                        AL = Paramètres de configuration	      *}
    {*                                Bits 0-1: longueur du mot	      *}
    {*                                        10 = 7 bits		      *}
    {*                                        11 = 8 bits		      *}
    {*                                Bit 2: nombre de bits de stop	      *}
    {*                                        0 = 1 bit de stop	      *}
    {*                                        1 = 2 bits de stop	      *}
    {*                                Bit 3-4: contrôle de parité	      *}
    {*                                        00 = aucun		      *}
    {*                                        01 = impair		      *}
    {*                                        11 = pair		      *}
    {*                                Bit 5-7: vitesse de transmission    *}
    {*                                        000 = 110 bauds	      *}
    {*                                        001 = 150 bauds	      *}
    {*                                        010 = 300 bauds	      *}
    {*                                        011 = 600 bauds	      *}
    {*                                        100 = 1200 bauds	      *}
    {*                                        101 = 2400 bauds	      *}
    {*                                        110 = 4800 bauds	      *}
    {*                                        111 = 9600 bauds	      *}
    {*								      *}
    {**********************************************************************}
     
    var
       regs : registers;
    begin
         regs.ah:=0;
         regs.dx:=nbport;
         regs.al:=227;   //= 'E3' en hex et 11100011 en binaire :8 bits, pas de parité, 1 bits stop,9600bds
     
     
         intr($14,regs);
    {     writeln('R‚sultat initialisation ah=',regs.ah);}
    end;
     
    function rs_status:integer;
    {*********************************************************************}
    {* Cette fonction lit le statut du port s‚rie                        *}
    {*********************************************************************}
    var
       regs : registers;
    begin
         regs.ah:=3;
         regs.dx:=nbport;
         intr($14,regs);
         rs_status:=regs.ah;
    end;
     
    function rs_read:integer;
    {***********************************************************************}
    {* Lecture au vol de la RS232C , Si aucun caractˆre n'a ‚t‚ recu la    *}
    {* function renvoie -1                                                 *}
    {***********************************************************************}
    var
       regs : registers;
     
    begin
         if (rs_status and 1)=1 then
            begin
                 regs.ah:=2;
                 regs.dx:=nbport;
                 intr($14,regs);
    if (regs.ah and 128)=128 then begin
       writeln('Il y a eu erreur en lecture, AH=:',regs.ah);
       end else rs_read:=regs.al;
          end else begin
                          rs_read:=-1;
                      end;
    end;
     
    function rs_lecture : integer;
    {********************************************************************}
    {* Cette function attend q'un caractŠre soit recu sur le port s‚rie *}
    {********************************************************************}
    var
       aux : integer;
    begin
         repeat
               aux:=rs_read;
         until aux<>-1;
         rs_lecture:=aux;
    end;
     
    procedure rs_write(data : byte);
    {*******************************************************************}
    {* Cette proc‚dure permet d'emettre un caractŠre sur le port s‚rie *}
    {*******************************************************************}
    var
       regs : registers;
     
    begin
         regs.ah:=1;
         regs.dx:=nbport;
         regs.al:=data;
         intr($14,regs);
         if (regs.ah and 128)=128 then writeln('Erreur transmition : ',regs.ah);
    end;
     
    procedure test_lecture;
    {********************************************************************}
    {* Cette procedure permet de tester la fiabilit‚ de la liaison      *}
    {* PC - Robot , elle permet entre autre d'effectuer le r‚glage de   *}
    {* Vitesse de la RS232 du robot VECTOR                              *}
    {********************************************************************}
    var
       err,i,aux,cnt : integer;
     
    begin
         clrscr;
         rs_init;
         aux:=-1;
         err:=-1;
         cnt:=-1;
         repeat
               rs_init;
               i:=rs_lecture;
               if i<>aux+1 then err:=err+1;
               aux:=i;
               if i=255 then aux:=-1;
               inc(cnt);
         until keypressed or (cnt=1000);
         writeln;
         writeln('Il y a eu ',err,' erreurs sur 1000 ');
    end;
     
    procedure test_ecriture;
    {*******************************************************************}
    {* Permet de tester l'‚mission d'un caract‚re vers le robot VECTOR *}
    {*******************************************************************}
    var i,aux,j : integer;
        carac : char;
     
    begin
         clrscr;
         repeat
         repeat until keypressed;
         carac:=readkey;
         rs_init;
         rs_write(ord(carac));
         write(carac);
         until ((carac='Q') or (carac='q'));
    end;
     
    begin
         test_ecriture;
    end.

  2. #2
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Par défaut
    Salut,

    En survolant, il semble qu'il manque tout d'abord un rs_init dans le programme. Tu devrais essayer d'appeler rs_write plutôt que test_ecriture.
    Bon courage.

    Le programme donnerait donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    begin
      rs_init;
      rs_write;
    end.
    PS : il est à noter que les procédures de bas niveau ne devrait pas faire de writeln et qu'il serait préférable que tu fasses en sorte qu'il y ait un code d'erreur de renvoyé.

  3. #3
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 2
    Par défaut moui mais non...
    Ok merci mais ca ,ca ne m'avance pas du tout ....
    en effet , le rs_init est deja appelé ....(si si , regarde bien ) et de plus le rs_write necessite un caractere dans l'appel de procédure....

    j'avais deja essaye et ca ne fonctionne pas non plus ...

    je te remercie d'avoir utiliser un peu de ton temps pour me repondre...

  4. #4
    Membre éclairé
    Inscrit en
    Février 2005
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 53
    Par défaut
    Désolé pour l'init, en effet, j'avais mal lu (c'est surtout en lisant robot vector que j'ai tiqué).

    Tu devrais peut-être vérifier que ton port série est configuré de la même façon des deux côtés. Le fait d'utiliser l'hyperterminal entraine peut être l'utilisation d'un mode différent de celui que tu utilises dans ton programme. Le mieux serait probablement que tu utilises le programme des deux côtés (l'un en écriture et l'autre en lecture). Dans le doute regarde comment ton port série est configuré sous windows et indique les mêmes caractéristiques dans la configuration de ton programme et dans la fenêtre windows.

  5. #5
    Membre Expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Par défaut
    Sous quel OS développes-tu et avec quel compilateur ?
    Il faut savoir que sous "Dos" avec WIndows XP les communications séries risquent d'être très difficiles voire impossible...

    @++

  6. #6
    Membre Expert
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Par défaut
    Bonjour

    Je me suis déja amusé a tenter des connections RS232 en Pascal entre mon PC et un vieux 486 ... J'ai rencontré des problèmes similaires aux tiens.
    Je pense, de mon coté, que le problème venait d'une incompatibilité entre les 2 controleurs RS232. Le 486 contenait un 8250A et mon PC un 16550AF si je me souviens bien.
    J'avais ensuite testé mon programme entre 2 PC ayant le même contrôleur RS232 et la, miracle, ça a fonctionné

    Les différents types de contrôleurs : ici

    Peux tu nous dire quels chipset UART sont présents sur les 2 PC ?

    Bon courage

Discussions similaires

  1. Gestion du port COM en RS232
    Par bkhbkh dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 08/06/2007, 00h47
  2. Port COM1 sous XP
    Par xave dans le forum Windows XP
    Réponses: 6
    Dernier message: 06/02/2007, 10h40
  3. Gestion du port paralléle sous 2000
    Par kardex dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 05/01/2006, 19h47
  4. gestion des port !
    Par seal3 dans le forum Développement
    Réponses: 12
    Dernier message: 01/05/2005, 20h43
  5. Routines de gestion des ports sous Windows XP
    Par wiccanhelios dans le forum Windows
    Réponses: 2
    Dernier message: 14/11/2003, 08h02

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