Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Questions sur le port COM1

10 réponses
Avatar
Jean-Michel
Bonjour,

Je me pose deux trois petites question ...
Je me demande comment ne pas louper des données qui rentre dans le port com1
Il faut faire une boucle qui en permanance fasse DonneeEntrant=DonneeEntrant
+ COM1.input ?
Mais si on fait la boucle en permanence, comment on peut faire autre chose
du programme ?

En fait je voudrais surveiller le port COM1, que n'importe où dans le
programme, dés qu'il y a qqchose qui rentre dans le COM1, ca coupe le prog
et que ca execute une procedure.
Si il y a "A" qui rentre ca execute la procedure A
Si il y a "B" .........

Et ceci n'importe quand dans le prog!
Merci de me donner si possible dans exemple ce prog pour mes questions !

Merci d'avance pour vos reponses !

Jean-Michel

10 réponses

Avatar
ng
Bonjour,
Il suffirait de placer la boucle dans un timer :

Soit comme ca :

Au début du programme faire timer1.enabled=true

Sub timer1_timer()
timer1.enabledúlse
do
'boucle
DonneeEntrant=DonneeEntrant & COM1.input
loop
end sub

ou définir un interval petit pour le timer

Sub timer1_timer()
DonneeEntrant=DonneeEntrant & COM1.input
end sub

Nicolas.


"Jean-Michel" a écrit dans le
message de news:
Bonjour,

Je me pose deux trois petites question ...
Je me demande comment ne pas louper des données qui rentre dans le port


com1
Il faut faire une boucle qui en permanance fasse


DonneeEntrant=DonneeEntrant
+ COM1.input ?
Mais si on fait la boucle en permanence, comment on peut faire autre chose
du programme ?

En fait je voudrais surveiller le port COM1, que n'importe où dans le
programme, dés qu'il y a qqchose qui rentre dans le COM1, ca coupe le prog
et que ca execute une procedure.
Si il y a "A" qui rentre ca execute la procedure A
Si il y a "B" .........

Et ceci n'importe quand dans le prog!
Merci de me donner si possible dans exemple ce prog pour mes questions !

Merci d'avance pour vos reponses !

Jean-Michel




Avatar
Cégé
Bonjour

Un timer t'évite une boucle.
Toujours dangereuse dans un système comme Windows.
Surtout que les accès au hard (COM1) ont une forte priorité.

Je trouve que la solution d'un timer court (genre 50mS) qui purge
régulièrement le buffer RS232 est la meilleure.
Sans boucle à l'intérieur.
Si le timer est trop court, il va ralentir la machine.

Une boucle peut être agrémentée d'un "doevent" mais on prend le risque de
"ré-entrance" (l'horreur avec un port com).

La meilleure solution est d'utiliser les évènements du port com. Celui-ci
déclenche un évènement (comme un clic souris) lorsqu'il a reçu un ou
plusieurs caractères par exemple (nb caractères programmables). Très
pratique pour détecter l'arrivée d'un caractère de synchronisation (comme
"D" dans ton exemple). Pas d'encombrement des ressources -de ralentissement
machine- quand la ligne RS232 ne "parle" pas.
N'oublie pas les contrôles de flux (matériels et logiciels). Qui peuvent
être très puissants et qui permettent des communications robustes. Voir
l'exemple de microsoft VBTerm. Très didactique quoique lourd. Quasi tous les
cas sont traités dans ce code.

-- Christian

"Jean-Michel" a écrit dans le
message news:
ng,

Merci beaucoup pour ta reponse !

Donc avec ce que tu me dit, la boucle qui est dans le Sub timer1.timer()


va
tourner en permanance pendant que le programme tourne ?
Et donc dans la boucle, je peux rajouter if COM1.input = "D" Then Danger
EndIf ?
Ca veut dire que je ne vais jamais louper l'arriver de la lettre D pendant
tout le programme ?

Merci encore

Jean-Michel




"ng" a écrit dans le message news:
#
> Bonjour,
> Il suffirait de placer la boucle dans un timer :
>
> Soit comme ca :
>
> Au début du programme faire timer1.enabled=true
>
> Sub timer1_timer()
> timer1.enabledúlse
> do
> 'boucle
> DonneeEntrant=DonneeEntrant & COM1.input
> loop
> end sub
>
> ou définir un interval petit pour le timer
>
> Sub timer1_timer()
> DonneeEntrant=DonneeEntrant & COM1.input
> end sub
>
> Nicolas.
>
>
> "Jean-Michel" a écrit dans le
> message de news:
> > Bonjour,
> >
> > Je me pose deux trois petites question ...
> > Je me demande comment ne pas louper des données qui rentre dans le


port
> com1
> > Il faut faire une boucle qui en permanance fasse
> DonneeEntrant=DonneeEntrant
> > + COM1.input ?
> > Mais si on fait la boucle en permanence, comment on peut faire autre
chose
> > du programme ?
> >
> > En fait je voudrais surveiller le port COM1, que n'importe où dans le
> > programme, dés qu'il y a qqchose qui rentre dans le COM1, ca coupe le
prog
> > et que ca execute une procedure.
> > Si il y a "A" qui rentre ca execute la procedure A
> > Si il y a "B" .........
> >
> > Et ceci n'importe quand dans le prog!
> > Merci de me donner si possible dans exemple ce prog pour mes questions


!
> >
> > Merci d'avance pour vos reponses !
> >
> > Jean-Michel
> >
> >
>
>




Avatar
Jean-Michel
ng,

Merci beaucoup pour ta reponse !

Donc avec ce que tu me dit, la boucle qui est dans le Sub timer1.timer() va
tourner en permanance pendant que le programme tourne ?
Et donc dans la boucle, je peux rajouter if COM1.input = "D" Then Danger
EndIf ?
Ca veut dire que je ne vais jamais louper l'arriver de la lettre D pendant
tout le programme ?

Merci encore

Jean-Michel




"ng" a écrit dans le message news:
#
Bonjour,
Il suffirait de placer la boucle dans un timer :

Soit comme ca :

Au début du programme faire timer1.enabled=true

Sub timer1_timer()
timer1.enabledúlse
do
'boucle
DonneeEntrant=DonneeEntrant & COM1.input
loop
end sub

ou définir un interval petit pour le timer

Sub timer1_timer()
DonneeEntrant=DonneeEntrant & COM1.input
end sub

Nicolas.


"Jean-Michel" a écrit dans le
message de news:
> Bonjour,
>
> Je me pose deux trois petites question ...
> Je me demande comment ne pas louper des données qui rentre dans le port
com1
> Il faut faire une boucle qui en permanance fasse
DonneeEntrant=DonneeEntrant
> + COM1.input ?
> Mais si on fait la boucle en permanence, comment on peut faire autre


chose
> du programme ?
>
> En fait je voudrais surveiller le port COM1, que n'importe où dans le
> programme, dés qu'il y a qqchose qui rentre dans le COM1, ca coupe le


prog
> et que ca execute une procedure.
> Si il y a "A" qui rentre ca execute la procedure A
> Si il y a "B" .........
>
> Et ceci n'importe quand dans le prog!
> Merci de me donner si possible dans exemple ce prog pour mes questions !
>
> Merci d'avance pour vos reponses !
>
> Jean-Michel
>
>




Avatar
Jean-Michel
J'ai fait le test et ca ne rentre jamais dans le Sub timer1_timer()
Pourtant j'ai bien mis au debut de from_load la ligne timer1.enable
J'ai essayer de mettre de msgbox mais rien a y faire, le programme ne rentre
jamais dedans !

Merci d'avance pour la reponse !

Jean-Michel

"ng" a écrit dans le message news:
#
Bonjour,
Il suffirait de placer la boucle dans un timer :

Soit comme ca :

Au début du programme faire timer1.enabled=true

Sub timer1_timer()
timer1.enabledúlse
do
'boucle
DonneeEntrant=DonneeEntrant & COM1.input
loop
end sub

ou définir un interval petit pour le timer

Sub timer1_timer()
DonneeEntrant=DonneeEntrant & COM1.input
end sub

Nicolas.


"Jean-Michel" a écrit dans le
message de news:
> Bonjour,
>
> Je me pose deux trois petites question ...
> Je me demande comment ne pas louper des données qui rentre dans le port
com1
> Il faut faire une boucle qui en permanance fasse
DonneeEntrant=DonneeEntrant
> + COM1.input ?
> Mais si on fait la boucle en permanence, comment on peut faire autre


chose
> du programme ?
>
> En fait je voudrais surveiller le port COM1, que n'importe où dans le
> programme, dés qu'il y a qqchose qui rentre dans le COM1, ca coupe le


prog
> et que ca execute une procedure.
> Si il y a "A" qui rentre ca execute la procedure A
> Si il y a "B" .........
>
> Et ceci n'importe quand dans le prog!
> Merci de me donner si possible dans exemple ce prog pour mes questions !
>
> Merci d'avance pour vos reponses !
>
> Jean-Michel
>
>




Avatar
Cégé
Si tu utilise le contrôle MSCOMM
(Dans mon cas : Projet/Composant/Microsoft Com Control 6.0).
Double clic sur le bouton correspondant (dans mon cas représente un
téléphone).

Private Sub MSComm1_OnComm()
end sub

Cet évènement sera appelé *par le port de communication* en fontion de
propriétés fixées (par exemple à la réception de chaque caractère).
Dans cette procédure, on teste une propriété du port com pour connaitre la
nature de l'évènement (.CommEvent de mémoire). Par exemple réception (ca
peut être des erreurs, la réception de signaux de controle, l'émission de
caractère, etc.).
On peut également lire le buffer de réception du port com (.input) afin de
le tester ou de le cumuler avec le buffer de ton application.

Je ne me souviens pas du détail. Le controle est documenté (un peu confus
mais c'est du microsoft : un bit = 2 tonnes de documentation :).
Faire F1 dans la forme avec le ComPort (bouton "téléphone") sélectionné.
Suivre les exemples.

Attention à bien assimiler les propriétés de ce composant. Ce sont elles qui
vont déterminer QUAND OnComm() est appelée.

Ca marche très bien.

-- Christian


"Jean-Michel" a écrit dans le
message news:
Merci Cégé pour ta réponse !

Donc tu me conseille de vider le buffer toutes les 50ms, ok !
Je n'arrive pas a trouver la fonction qui permet de lire toutes les info
recu pendant ces 50ms.
Donc je n'arrive pas a lire ce que le buffer a retenu durant ces 50ms...

Et je voudrai savoir, apparement tu as trouver une solution qui permet de


ne
pas verifier en permanence le port pour verifier si il y a pas de D, mais
plutot que si il y a un D qui arrive, ca arrete tout et ca lance une
procedure.
Peux tu m'en parler ?

Merci beaucoup de ton aide !

Jean-Michel

"Cégé" a écrit dans le message news:
bnnvlv$4pj$
> Bonjour
>
> Un timer t'évite une boucle.
> Toujours dangereuse dans un système comme Windows.
> Surtout que les accès au hard (COM1) ont une forte priorité.
>
> Je trouve que la solution d'un timer court (genre 50mS) qui purge
> régulièrement le buffer RS232 est la meilleure.
> Sans boucle à l'intérieur.
> Si le timer est trop court, il va ralentir la machine.
>
> Une boucle peut être agrémentée d'un "doevent" mais on prend le risque


de
> "ré-entrance" (l'horreur avec un port com).
>
> La meilleure solution est d'utiliser les évènements du port com.


Celui-ci
> déclenche un évènement (comme un clic souris) lorsqu'il a reçu un ou
> plusieurs caractères par exemple (nb caractères programmables). Très
> pratique pour détecter l'arrivée d'un caractère de synchronisation


(comme
> "D" dans ton exemple). Pas d'encombrement des ressources -de
ralentissement
> machine- quand la ligne RS232 ne "parle" pas.
> N'oublie pas les contrôles de flux (matériels et logiciels). Qui peuvent
> être très puissants et qui permettent des communications robustes. Voir
> l'exemple de microsoft VBTerm. Très didactique quoique lourd. Quasi tous
les
> cas sont traités dans ce code.
>
> -- Christian
>
> "Jean-Michel" a écrit dans le
> message news:
> > ng,
> >
> > Merci beaucoup pour ta reponse !
> >
> > Donc avec ce que tu me dit, la boucle qui est dans le Sub


timer1.timer()
> va
> > tourner en permanance pendant que le programme tourne ?
> > Et donc dans la boucle, je peux rajouter if COM1.input = "D" Then


Danger
> > EndIf ?
> > Ca veut dire que je ne vais jamais louper l'arriver de la lettre D
pendant
> > tout le programme ?
> >
> > Merci encore
> >
> > Jean-Michel
> >
> >
> >
> >
> > "ng" a écrit dans le message news:
> > #
> > > Bonjour,
> > > Il suffirait de placer la boucle dans un timer :
> > >
> > > Soit comme ca :
> > >
> > > Au début du programme faire timer1.enabled=true
> > >
> > > Sub timer1_timer()
> > > timer1.enabledúlse
> > > do
> > > 'boucle
> > > DonneeEntrant=DonneeEntrant & COM1.input
> > > loop
> > > end sub
> > >
> > > ou définir un interval petit pour le timer
> > >
> > > Sub timer1_timer()
> > > DonneeEntrant=DonneeEntrant & COM1.input
> > > end sub
> > >
> > > Nicolas.
> > >
> > >
> > > "Jean-Michel" a écrit dans


le
> > > message de news:
> > > > Bonjour,
> > > >
> > > > Je me pose deux trois petites question ...
> > > > Je me demande comment ne pas louper des données qui rentre dans le
> port
> > > com1
> > > > Il faut faire une boucle qui en permanance fasse
> > > DonneeEntrant=DonneeEntrant
> > > > + COM1.input ?
> > > > Mais si on fait la boucle en permanence, comment on peut faire


autre
> > chose
> > > > du programme ?
> > > >
> > > > En fait je voudrais surveiller le port COM1, que n'importe où dans
le
> > > > programme, dés qu'il y a qqchose qui rentre dans le COM1, ca coupe
le
> > prog
> > > > et que ca execute une procedure.
> > > > Si il y a "A" qui rentre ca execute la procedure A
> > > > Si il y a "B" .........
> > > >
> > > > Et ceci n'importe quand dans le prog!
> > > > Merci de me donner si possible dans exemple ce prog pour mes
questions
> !
> > > >
> > > > Merci d'avance pour vos reponses !
> > > >
> > > > Jean-Michel
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
Jean-Michel
Merci Cégé pour ta réponse !

Donc tu me conseille de vider le buffer toutes les 50ms, ok !
Je n'arrive pas a trouver la fonction qui permet de lire toutes les info
recu pendant ces 50ms.
Donc je n'arrive pas a lire ce que le buffer a retenu durant ces 50ms...

Et je voudrai savoir, apparement tu as trouver une solution qui permet de ne
pas verifier en permanence le port pour verifier si il y a pas de D, mais
plutot que si il y a un D qui arrive, ca arrete tout et ca lance une
procedure.
Peux tu m'en parler ?

Merci beaucoup de ton aide !

Jean-Michel

"Cégé" a écrit dans le message news:
bnnvlv$4pj$
Bonjour

Un timer t'évite une boucle.
Toujours dangereuse dans un système comme Windows.
Surtout que les accès au hard (COM1) ont une forte priorité.

Je trouve que la solution d'un timer court (genre 50mS) qui purge
régulièrement le buffer RS232 est la meilleure.
Sans boucle à l'intérieur.
Si le timer est trop court, il va ralentir la machine.

Une boucle peut être agrémentée d'un "doevent" mais on prend le risque de
"ré-entrance" (l'horreur avec un port com).

La meilleure solution est d'utiliser les évènements du port com. Celui-ci
déclenche un évènement (comme un clic souris) lorsqu'il a reçu un ou
plusieurs caractères par exemple (nb caractères programmables). Très
pratique pour détecter l'arrivée d'un caractère de synchronisation (comme
"D" dans ton exemple). Pas d'encombrement des ressources -de


ralentissement
machine- quand la ligne RS232 ne "parle" pas.
N'oublie pas les contrôles de flux (matériels et logiciels). Qui peuvent
être très puissants et qui permettent des communications robustes. Voir
l'exemple de microsoft VBTerm. Très didactique quoique lourd. Quasi tous


les
cas sont traités dans ce code.

-- Christian

"Jean-Michel" a écrit dans le
message news:
> ng,
>
> Merci beaucoup pour ta reponse !
>
> Donc avec ce que tu me dit, la boucle qui est dans le Sub timer1.timer()
va
> tourner en permanance pendant que le programme tourne ?
> Et donc dans la boucle, je peux rajouter if COM1.input = "D" Then Danger
> EndIf ?
> Ca veut dire que je ne vais jamais louper l'arriver de la lettre D


pendant
> tout le programme ?
>
> Merci encore
>
> Jean-Michel
>
>
>
>
> "ng" a écrit dans le message news:
> #
> > Bonjour,
> > Il suffirait de placer la boucle dans un timer :
> >
> > Soit comme ca :
> >
> > Au début du programme faire timer1.enabled=true
> >
> > Sub timer1_timer()
> > timer1.enabledúlse
> > do
> > 'boucle
> > DonneeEntrant=DonneeEntrant & COM1.input
> > loop
> > end sub
> >
> > ou définir un interval petit pour le timer
> >
> > Sub timer1_timer()
> > DonneeEntrant=DonneeEntrant & COM1.input
> > end sub
> >
> > Nicolas.
> >
> >
> > "Jean-Michel" a écrit dans le
> > message de news:
> > > Bonjour,
> > >
> > > Je me pose deux trois petites question ...
> > > Je me demande comment ne pas louper des données qui rentre dans le
port
> > com1
> > > Il faut faire une boucle qui en permanance fasse
> > DonneeEntrant=DonneeEntrant
> > > + COM1.input ?
> > > Mais si on fait la boucle en permanence, comment on peut faire autre
> chose
> > > du programme ?
> > >
> > > En fait je voudrais surveiller le port COM1, que n'importe où dans


le
> > > programme, dés qu'il y a qqchose qui rentre dans le COM1, ca coupe


le
> prog
> > > et que ca execute une procedure.
> > > Si il y a "A" qui rentre ca execute la procedure A
> > > Si il y a "B" .........
> > >
> > > Et ceci n'importe quand dans le prog!
> > > Merci de me donner si possible dans exemple ce prog pour mes


questions
!
> > >
> > > Merci d'avance pour vos reponses !
> > >
> > > Jean-Michel
> > >
> > >
> >
> >
>
>




Avatar
Jean-Michel
Merci encore pour ta reponse Cégé,

Donc avec ta methode, on a plus besoin de 'timer' ?
Et donc tu me dit que le OnComm se lance quand il y qqchose qui arrive dans
le port COM ?
Et c'est ensuite dans la procedure qu'on essaye de detecter le type de
donnée, et le type de donnée est dans la variable COM1.CommEvent ?
Et on peut lire le buffer sur .input ?
Ou sont les propriété a regler pour dire QUAND la procedure OnComm se met en
route ?

Merci beaucoup

Jean-Michel



"Cégé" a écrit dans le message news:
bno2mc$6j8$
Si tu utilise le contrôle MSCOMM
(Dans mon cas : Projet/Composant/Microsoft Com Control 6.0).
Double clic sur le bouton correspondant (dans mon cas représente un
téléphone).

Private Sub MSComm1_OnComm()
end sub

Cet évènement sera appelé *par le port de communication* en fontion de
propriétés fixées (par exemple à la réception de chaque caractère).
Dans cette procédure, on teste une propriété du port com pour connaitre la
nature de l'évènement (.CommEvent de mémoire). Par exemple réception (ca
peut être des erreurs, la réception de signaux de controle, l'émission de
caractère, etc.).
On peut également lire le buffer de réception du port com (.input) afin de
le tester ou de le cumuler avec le buffer de ton application.

Je ne me souviens pas du détail. Le controle est documenté (un peu confus
mais c'est du microsoft : un bit = 2 tonnes de documentation :).
Faire F1 dans la forme avec le ComPort (bouton "téléphone") sélectionné.
Suivre les exemples.

Attention à bien assimiler les propriétés de ce composant. Ce sont elles


qui
vont déterminer QUAND OnComm() est appelée.

Ca marche très bien.

-- Christian


"Jean-Michel" a écrit dans le
message news:
> Merci Cégé pour ta réponse !
>
> Donc tu me conseille de vider le buffer toutes les 50ms, ok !
> Je n'arrive pas a trouver la fonction qui permet de lire toutes les info
> recu pendant ces 50ms.
> Donc je n'arrive pas a lire ce que le buffer a retenu durant ces 50ms...
>
> Et je voudrai savoir, apparement tu as trouver une solution qui permet


de
ne
> pas verifier en permanence le port pour verifier si il y a pas de D,


mais
> plutot que si il y a un D qui arrive, ca arrete tout et ca lance une
> procedure.
> Peux tu m'en parler ?
>
> Merci beaucoup de ton aide !
>
> Jean-Michel
>
> "Cégé" a écrit dans le message news:
> bnnvlv$4pj$
> > Bonjour
> >
> > Un timer t'évite une boucle.
> > Toujours dangereuse dans un système comme Windows.
> > Surtout que les accès au hard (COM1) ont une forte priorité.
> >
> > Je trouve que la solution d'un timer court (genre 50mS) qui purge
> > régulièrement le buffer RS232 est la meilleure.
> > Sans boucle à l'intérieur.
> > Si le timer est trop court, il va ralentir la machine.
> >
> > Une boucle peut être agrémentée d'un "doevent" mais on prend le risque
de
> > "ré-entrance" (l'horreur avec un port com).
> >
> > La meilleure solution est d'utiliser les évènements du port com.
Celui-ci
> > déclenche un évènement (comme un clic souris) lorsqu'il a reçu un ou
> > plusieurs caractères par exemple (nb caractères programmables). Très
> > pratique pour détecter l'arrivée d'un caractère de synchronisation
(comme
> > "D" dans ton exemple). Pas d'encombrement des ressources -de
> ralentissement
> > machine- quand la ligne RS232 ne "parle" pas.
> > N'oublie pas les contrôles de flux (matériels et logiciels). Qui


peuvent
> > être très puissants et qui permettent des communications robustes.


Voir
> > l'exemple de microsoft VBTerm. Très didactique quoique lourd. Quasi


tous
> les
> > cas sont traités dans ce code.
> >
> > -- Christian
> >
> > "Jean-Michel" a écrit dans le
> > message news:
> > > ng,
> > >
> > > Merci beaucoup pour ta reponse !
> > >
> > > Donc avec ce que tu me dit, la boucle qui est dans le Sub
timer1.timer()
> > va
> > > tourner en permanance pendant que le programme tourne ?
> > > Et donc dans la boucle, je peux rajouter if COM1.input = "D" Then
Danger
> > > EndIf ?
> > > Ca veut dire que je ne vais jamais louper l'arriver de la lettre D
> pendant
> > > tout le programme ?
> > >
> > > Merci encore
> > >
> > > Jean-Michel
> > >
> > >
> > >
> > >
> > > "ng" a écrit dans le message news:
> > > #
> > > > Bonjour,
> > > > Il suffirait de placer la boucle dans un timer :
> > > >
> > > > Soit comme ca :
> > > >
> > > > Au début du programme faire timer1.enabled=true
> > > >
> > > > Sub timer1_timer()
> > > > timer1.enabledúlse
> > > > do
> > > > 'boucle
> > > > DonneeEntrant=DonneeEntrant & COM1.input
> > > > loop
> > > > end sub
> > > >
> > > > ou définir un interval petit pour le timer
> > > >
> > > > Sub timer1_timer()
> > > > DonneeEntrant=DonneeEntrant & COM1.input
> > > > end sub
> > > >
> > > > Nicolas.
> > > >
> > > >
> > > > "Jean-Michel" a écrit dans
le
> > > > message de news:
> > > > > Bonjour,
> > > > >
> > > > > Je me pose deux trois petites question ...
> > > > > Je me demande comment ne pas louper des données qui rentre dans


le
> > port
> > > > com1
> > > > > Il faut faire une boucle qui en permanance fasse
> > > > DonneeEntrant=DonneeEntrant
> > > > > + COM1.input ?
> > > > > Mais si on fait la boucle en permanence, comment on peut faire
autre
> > > chose
> > > > > du programme ?
> > > > >
> > > > > En fait je voudrais surveiller le port COM1, que n'importe où


dans
> le
> > > > > programme, dés qu'il y a qqchose qui rentre dans le COM1, ca


coupe
> le
> > > prog
> > > > > et que ca execute une procedure.
> > > > > Si il y a "A" qui rentre ca execute la procedure A
> > > > > Si il y a "B" .........
> > > > >
> > > > > Et ceci n'importe quand dans le prog!
> > > > > Merci de me donner si possible dans exemple ce prog pour mes
> questions
> > !
> > > > >
> > > > > Merci d'avance pour vos reponses !
> > > > >
> > > > > Jean-Michel
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
Cégé
Clic droit sur le contrôle ou bien dans la fenêtre de propriétés du projet
sous VB6.
Ne pas confondre le InBufferSize (capacité du buffer de réception ) et le
RThreshold (seuil de déclenchement de OnComm)...
Attention aussi : le buffer se vide dès la lecture (lecture de Input), par
exemple

MaChaine = MSComm.Input '** vidage du buffer, suivi de
MaChaine = MSComm.Input '** vide ou caractères suivants...


Voir l'aide.
Piège : ne pas faire trop de chose dans OnComm() : risque d'être dépassé par
les évènement si débit rapide + forte densité d'informations.
(essayé à 115Kb/s avec des remontées d'1Mo)

-- Christian

"Jean-Michel" a écrit dans le
message news:
Merci encore pour ta reponse Cégé,

Donc avec ta methode, on a plus besoin de 'timer' ?
Et donc tu me dit que le OnComm se lance quand il y qqchose qui arrive


dans
le port COM ?
Et c'est ensuite dans la procedure qu'on essaye de detecter le type de
donnée, et le type de donnée est dans la variable COM1.CommEvent ?
Et on peut lire le buffer sur .input ?
Ou sont les propriété a regler pour dire QUAND la procedure OnComm se met


en
route ?

Merci beaucoup

Jean-Michel



"Cégé" a écrit dans le message news:
bno2mc$6j8$
> Si tu utilise le contrôle MSCOMM
> (Dans mon cas : Projet/Composant/Microsoft Com Control 6.0).
> Double clic sur le bouton correspondant (dans mon cas représente un
> téléphone).
>
> Private Sub MSComm1_OnComm()
> end sub
>
> Cet évènement sera appelé *par le port de communication* en fontion de
> propriétés fixées (par exemple à la réception de chaque caractère).
> Dans cette procédure, on teste une propriété du port com pour connaitre


la
> nature de l'évènement (.CommEvent de mémoire). Par exemple réception (ca
> peut être des erreurs, la réception de signaux de controle, l'émission


de
> caractère, etc.).
> On peut également lire le buffer de réception du port com (.input) afin


de
> le tester ou de le cumuler avec le buffer de ton application.
>
> Je ne me souviens pas du détail. Le controle est documenté (un peu


confus
> mais c'est du microsoft : un bit = 2 tonnes de documentation :).
> Faire F1 dans la forme avec le ComPort (bouton "téléphone") sélectionné.
> Suivre les exemples.
>
> Attention à bien assimiler les propriétés de ce composant. Ce sont elles
qui
> vont déterminer QUAND OnComm() est appelée.
>
> Ca marche très bien.
>
> -- Christian
>
>
> "Jean-Michel" a écrit dans le
> message news:
> > Merci Cégé pour ta réponse !
> >
> > Donc tu me conseille de vider le buffer toutes les 50ms, ok !
> > Je n'arrive pas a trouver la fonction qui permet de lire toutes les


info
> > recu pendant ces 50ms.
> > Donc je n'arrive pas a lire ce que le buffer a retenu durant ces


50ms...
> >
> > Et je voudrai savoir, apparement tu as trouver une solution qui permet
de
> ne
> > pas verifier en permanence le port pour verifier si il y a pas de D,
mais
> > plutot que si il y a un D qui arrive, ca arrete tout et ca lance une
> > procedure.
> > Peux tu m'en parler ?
> >
> > Merci beaucoup de ton aide !
> >
> > Jean-Michel
> >
> > "Cégé" a écrit dans le message news:
> > bnnvlv$4pj$
> > > Bonjour
> > >
> > > Un timer t'évite une boucle.
> > > Toujours dangereuse dans un système comme Windows.
> > > Surtout que les accès au hard (COM1) ont une forte priorité.
> > >
> > > Je trouve que la solution d'un timer court (genre 50mS) qui purge
> > > régulièrement le buffer RS232 est la meilleure.
> > > Sans boucle à l'intérieur.
> > > Si le timer est trop court, il va ralentir la machine.
> > >
> > > Une boucle peut être agrémentée d'un "doevent" mais on prend le


risque
> de
> > > "ré-entrance" (l'horreur avec un port com).
> > >
> > > La meilleure solution est d'utiliser les évènements du port com.
> Celui-ci
> > > déclenche un évènement (comme un clic souris) lorsqu'il a reçu un ou
> > > plusieurs caractères par exemple (nb caractères programmables). Très
> > > pratique pour détecter l'arrivée d'un caractère de synchronisation
> (comme
> > > "D" dans ton exemple). Pas d'encombrement des ressources -de
> > ralentissement
> > > machine- quand la ligne RS232 ne "parle" pas.
> > > N'oublie pas les contrôles de flux (matériels et logiciels). Qui
peuvent
> > > être très puissants et qui permettent des communications robustes.
Voir
> > > l'exemple de microsoft VBTerm. Très didactique quoique lourd. Quasi
tous
> > les
> > > cas sont traités dans ce code.
> > >
> > > -- Christian
> > >
> > > "Jean-Michel" a écrit dans


le
> > > message news:
> > > > ng,
> > > >
> > > > Merci beaucoup pour ta reponse !
> > > >
> > > > Donc avec ce que tu me dit, la boucle qui est dans le Sub
> timer1.timer()
> > > va
> > > > tourner en permanance pendant que le programme tourne ?
> > > > Et donc dans la boucle, je peux rajouter if COM1.input = "D" Then
> Danger
> > > > EndIf ?
> > > > Ca veut dire que je ne vais jamais louper l'arriver de la lettre D
> > pendant
> > > > tout le programme ?
> > > >
> > > > Merci encore
> > > >
> > > > Jean-Michel
> > > >
> > > >
> > > >
> > > >
> > > > "ng" a écrit dans le message news:
> > > > #
> > > > > Bonjour,
> > > > > Il suffirait de placer la boucle dans un timer :
> > > > >
> > > > > Soit comme ca :
> > > > >
> > > > > Au début du programme faire timer1.enabled=true
> > > > >
> > > > > Sub timer1_timer()
> > > > > timer1.enabledúlse
> > > > > do
> > > > > 'boucle
> > > > > DonneeEntrant=DonneeEntrant & COM1.input
> > > > > loop
> > > > > end sub
> > > > >
> > > > > ou définir un interval petit pour le timer
> > > > >
> > > > > Sub timer1_timer()
> > > > > DonneeEntrant=DonneeEntrant & COM1.input
> > > > > end sub
> > > > >
> > > > > Nicolas.
> > > > >
> > > > >
> > > > > "Jean-Michel" a écrit


dans
> le
> > > > > message de news:
> > > > > > Bonjour,
> > > > > >
> > > > > > Je me pose deux trois petites question ...
> > > > > > Je me demande comment ne pas louper des données qui rentre


dans
le
> > > port
> > > > > com1
> > > > > > Il faut faire une boucle qui en permanance fasse
> > > > > DonneeEntrant=DonneeEntrant
> > > > > > + COM1.input ?
> > > > > > Mais si on fait la boucle en permanence, comment on peut faire
> autre
> > > > chose
> > > > > > du programme ?
> > > > > >
> > > > > > En fait je voudrais surveiller le port COM1, que n'importe où
dans
> > le
> > > > > > programme, dés qu'il y a qqchose qui rentre dans le COM1, ca
coupe
> > le
> > > > prog
> > > > > > et que ca execute une procedure.
> > > > > > Si il y a "A" qui rentre ca execute la procedure A
> > > > > > Si il y a "B" .........
> > > > > >
> > > > > > Et ceci n'importe quand dans le prog!
> > > > > > Merci de me donner si possible dans exemple ce prog pour mes
> > questions
> > > !
> > > > > >
> > > > > > Merci d'avance pour vos reponses !
> > > > > >
> > > > > > Jean-Michel
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
Jean-Michel
Merci pour tout
Je te souhaite une bonne jouréne et a bientot !!

Jean-Michel

"Cégé" a écrit dans le message news:
bnofc1$fj5$
Clic droit sur le contrôle ou bien dans la fenêtre de propriétés du projet
sous VB6.
Ne pas confondre le InBufferSize (capacité du buffer de réception ) et le
RThreshold (seuil de déclenchement de OnComm)...
Attention aussi : le buffer se vide dès la lecture (lecture de Input), par
exemple

MaChaine = MSComm.Input '** vidage du buffer, suivi de
MaChaine = MSComm.Input '** vide ou caractères suivants...


Voir l'aide.
Piège : ne pas faire trop de chose dans OnComm() : risque d'être dépassé


par
les évènement si débit rapide + forte densité d'informations.
(essayé à 115Kb/s avec des remontées d'1Mo)

-- Christian

"Jean-Michel" a écrit dans le
message news:
> Merci encore pour ta reponse Cégé,
>
> Donc avec ta methode, on a plus besoin de 'timer' ?
> Et donc tu me dit que le OnComm se lance quand il y qqchose qui arrive
dans
> le port COM ?
> Et c'est ensuite dans la procedure qu'on essaye de detecter le type de
> donnée, et le type de donnée est dans la variable COM1.CommEvent ?
> Et on peut lire le buffer sur .input ?
> Ou sont les propriété a regler pour dire QUAND la procedure OnComm se


met
en
> route ?
>
> Merci beaucoup
>
> Jean-Michel
>
>
>
> "Cégé" a écrit dans le message news:
> bno2mc$6j8$
> > Si tu utilise le contrôle MSCOMM
> > (Dans mon cas : Projet/Composant/Microsoft Com Control 6.0).
> > Double clic sur le bouton correspondant (dans mon cas représente un
> > téléphone).
> >
> > Private Sub MSComm1_OnComm()
> > end sub
> >
> > Cet évènement sera appelé *par le port de communication* en fontion de
> > propriétés fixées (par exemple à la réception de chaque caractère).
> > Dans cette procédure, on teste une propriété du port com pour


connaitre
la
> > nature de l'évènement (.CommEvent de mémoire). Par exemple réception


(ca
> > peut être des erreurs, la réception de signaux de controle, l'émission
de
> > caractère, etc.).
> > On peut également lire le buffer de réception du port com (.input)


afin
de
> > le tester ou de le cumuler avec le buffer de ton application.
> >
> > Je ne me souviens pas du détail. Le controle est documenté (un peu
confus
> > mais c'est du microsoft : un bit = 2 tonnes de documentation :).
> > Faire F1 dans la forme avec le ComPort (bouton "téléphone")


sélectionné.
> > Suivre les exemples.
> >
> > Attention à bien assimiler les propriétés de ce composant. Ce sont


elles
> qui
> > vont déterminer QUAND OnComm() est appelée.
> >
> > Ca marche très bien.
> >
> > -- Christian
> >
> >
> > "Jean-Michel" a écrit dans le
> > message news:
> > > Merci Cégé pour ta réponse !
> > >
> > > Donc tu me conseille de vider le buffer toutes les 50ms, ok !
> > > Je n'arrive pas a trouver la fonction qui permet de lire toutes les
info
> > > recu pendant ces 50ms.
> > > Donc je n'arrive pas a lire ce que le buffer a retenu durant ces
50ms...
> > >
> > > Et je voudrai savoir, apparement tu as trouver une solution qui


permet
> de
> > ne
> > > pas verifier en permanence le port pour verifier si il y a pas de D,
> mais
> > > plutot que si il y a un D qui arrive, ca arrete tout et ca lance une
> > > procedure.
> > > Peux tu m'en parler ?
> > >
> > > Merci beaucoup de ton aide !
> > >
> > > Jean-Michel
> > >
> > > "Cégé" a écrit dans le message news:
> > > bnnvlv$4pj$
> > > > Bonjour
> > > >
> > > > Un timer t'évite une boucle.
> > > > Toujours dangereuse dans un système comme Windows.
> > > > Surtout que les accès au hard (COM1) ont une forte priorité.
> > > >
> > > > Je trouve que la solution d'un timer court (genre 50mS) qui purge
> > > > régulièrement le buffer RS232 est la meilleure.
> > > > Sans boucle à l'intérieur.
> > > > Si le timer est trop court, il va ralentir la machine.
> > > >
> > > > Une boucle peut être agrémentée d'un "doevent" mais on prend le
risque
> > de
> > > > "ré-entrance" (l'horreur avec un port com).
> > > >
> > > > La meilleure solution est d'utiliser les évènements du port com.
> > Celui-ci
> > > > déclenche un évènement (comme un clic souris) lorsqu'il a reçu un


ou
> > > > plusieurs caractères par exemple (nb caractères programmables).


Très
> > > > pratique pour détecter l'arrivée d'un caractère de synchronisation
> > (comme
> > > > "D" dans ton exemple). Pas d'encombrement des ressources -de
> > > ralentissement
> > > > machine- quand la ligne RS232 ne "parle" pas.
> > > > N'oublie pas les contrôles de flux (matériels et logiciels). Qui
> peuvent
> > > > être très puissants et qui permettent des communications robustes.
> Voir
> > > > l'exemple de microsoft VBTerm. Très didactique quoique lourd.


Quasi
> tous
> > > les
> > > > cas sont traités dans ce code.
> > > >
> > > > -- Christian
> > > >
> > > > "Jean-Michel" a écrit dans
le
> > > > message news:
> > > > > ng,
> > > > >
> > > > > Merci beaucoup pour ta reponse !
> > > > >
> > > > > Donc avec ce que tu me dit, la boucle qui est dans le Sub
> > timer1.timer()
> > > > va
> > > > > tourner en permanance pendant que le programme tourne ?
> > > > > Et donc dans la boucle, je peux rajouter if COM1.input = "D"


Then
> > Danger
> > > > > EndIf ?
> > > > > Ca veut dire que je ne vais jamais louper l'arriver de la lettre


D
> > > pendant
> > > > > tout le programme ?
> > > > >
> > > > > Merci encore
> > > > >
> > > > > Jean-Michel
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > "ng" a écrit dans le message news:
> > > > > #
> > > > > > Bonjour,
> > > > > > Il suffirait de placer la boucle dans un timer :
> > > > > >
> > > > > > Soit comme ca :
> > > > > >
> > > > > > Au début du programme faire timer1.enabled=true
> > > > > >
> > > > > > Sub timer1_timer()
> > > > > > timer1.enabledúlse
> > > > > > do
> > > > > > 'boucle
> > > > > > DonneeEntrant=DonneeEntrant & COM1.input
> > > > > > loop
> > > > > > end sub
> > > > > >
> > > > > > ou définir un interval petit pour le timer
> > > > > >
> > > > > > Sub timer1_timer()
> > > > > > DonneeEntrant=DonneeEntrant & COM1.input
> > > > > > end sub
> > > > > >
> > > > > > Nicolas.
> > > > > >
> > > > > >
> > > > > > "Jean-Michel" a écrit
dans
> > le
> > > > > > message de news:
> > > > > > > Bonjour,
> > > > > > >
> > > > > > > Je me pose deux trois petites question ...
> > > > > > > Je me demande comment ne pas louper des données qui rentre
dans
> le
> > > > port
> > > > > > com1
> > > > > > > Il faut faire une boucle qui en permanance fasse
> > > > > > DonneeEntrant=DonneeEntrant
> > > > > > > + COM1.input ?
> > > > > > > Mais si on fait la boucle en permanence, comment on peut


faire
> > autre
> > > > > chose
> > > > > > > du programme ?
> > > > > > >
> > > > > > > En fait je voudrais surveiller le port COM1, que n'importe



> dans
> > > le
> > > > > > > programme, dés qu'il y a qqchose qui rentre dans le COM1, ca
> coupe
> > > le
> > > > > prog
> > > > > > > et que ca execute une procedure.
> > > > > > > Si il y a "A" qui rentre ca execute la procedure A
> > > > > > > Si il y a "B" .........
> > > > > > >
> > > > > > > Et ceci n'importe quand dans le prog!
> > > > > > > Merci de me donner si possible dans exemple ce prog pour mes
> > > questions
> > > > !
> > > > > > >
> > > > > > > Merci d'avance pour vos reponses !
> > > > > > >
> > > > > > > Jean-Michel
> > > > > > >
> > > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>




Avatar
Benoit
Pourquoi n'utilisez vous pas la fonction (event) de MSComm32 : OnCom (si mes
souvenirs sont bons).
Benoit
Bonjour,

Je me pose deux trois petites question ...
Je me demande comment ne pas louper des données qui rentre dans le port


com1
Il faut faire une boucle qui en permanance fasse


DonneeEntrant=DonneeEntrant
+ COM1.input ?
Mais si on fait la boucle en permanence, comment on peut faire autre chose
du programme ?

En fait je voudrais surveiller le port COM1, que n'importe où dans le
programme, dés qu'il y a qqchose qui rentre dans le COM1, ca coupe le prog
et que ca execute une procedure.
Si il y a "A" qui rentre ca execute la procedure A
Si il y a "B" .........

Et ceci n'importe quand dans le prog!
Merci de me donner si possible dans exemple ce prog pour mes questions !

Merci d'avance pour vos reponses !

Jean-Michel