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

port série RS232

10 réponses
Avatar
jeorme
Bonjour à tous.
Je désespère avec mon port série , je fais un form avec un timer toutes les
6 secondes qui me lit le mscomm.input et me l'affiche dans un textbox . Mon
problème est que en pas à pas ça marche mais en normal il me lit rien.

Help me please.


Merci

10 réponses

Avatar
Christian Hubert-Hugoud
Un bout de code serait bienvenu...

Christian

"jeorme" a écrit dans le message de news:
%23lkZ%
Bonjour à tous.
Je désespère avec mon port série , je fais un form avec un timer toutes
les
6 secondes qui me lit le mscomm.input et me l'affiche dans un textbox .
Mon
problème est que en pas à pas ça marche mais en normal il me lit rien.

Help me please.


Merci




Avatar
jeorme
voici mon exemple qui marche en pas à pas

j'ai un form avec un timer et un mscomm et un textbox multiligne


Private Sub Form_Load()

MSComm1.CommPort = 1
MSComm1.Handshaking = comNone
MSComm1.RThreshold = 10
MSComm1.InputLen = 0
MSComm1.DTREnable = True
MSComm1.RTSEnable = True
MSComm1.Settings = "4800,e,7,2"
MSComm1.SThreshold = 0


Timer.Interval = 6000
Timer.Enabled = True

End Sub


Private Sub Timer_Timer()

Timer.Enabled = False

MSComm1.PortOpen = True

MSComm1.Break = True

buffer$ = MSComm1.Input
'Text1.Text = Text1.Text & vbCrLf & buffer

MSComm1.PortOpen = False

Timer.Interval = 6000
Timer.Enabled = True

End Sub

Ca marche bien en pas à pas mais pas en mode normal.




"Christian Hubert-Hugoud" a écrit dans le message
de news: #
Un bout de code serait bienvenu...

Christian

"jeorme" a écrit dans le message de news:
%23lkZ%
> Bonjour à tous.
> Je désespère avec mon port série , je fais un form avec un timer toutes
> les
> 6 secondes qui me lit le mscomm.input et me l'affiche dans un textbox .
> Mon
> problème est que en pas à pas ça marche mais en normal il me lit rien.
>
> Help me please.
>
>
> Merci
>
>




Avatar
Il te faut mettre une pause de 0.25 s entre chaque ligne.

"jeorme" a écrit dans le message de news:

voici mon exemple qui marche en pas à pas

j'ai un form avec un timer et un mscomm et un textbox multiligne


Private Sub Form_Load()

MSComm1.CommPort = 1
MSComm1.Handshaking = comNone
MSComm1.RThreshold = 10
MSComm1.InputLen = 0
MSComm1.DTREnable = True
MSComm1.RTSEnable = True
MSComm1.Settings = "4800,e,7,2"
MSComm1.SThreshold = 0


Timer.Interval = 6000
Timer.Enabled = True

End Sub


Private Sub Timer_Timer()

Timer.Enabled = False

MSComm1.PortOpen = True

MSComm1.Break = True

buffer$ = MSComm1.Input
'Text1.Text = Text1.Text & vbCrLf & buffer

MSComm1.PortOpen = False

Timer.Interval = 6000
Timer.Enabled = True

End Sub

Ca marche bien en pas à pas mais pas en mode normal.




"Christian Hubert-Hugoud" a écrit dans le message
de news: #
Un bout de code serait bienvenu...

Christian

"jeorme" a écrit dans le message de news:
%23lkZ%
> Bonjour à tous.
> Je désespère avec mon port série , je fais un form avec un timer toutes
> les
> 6 secondes qui me lit le mscomm.input et me l'affiche dans un textbox .
> Mon
> problème est que en pas à pas ça marche mais en normal il me lit rien.
>
> Help me please.
>
>
> Merci
>
>








Avatar
Christian Hubert-Hugoud
Bonjour,

J'ai regardé dans l'aide pour retrouver le sens de SThreshold.

Intuitivement, je chercherais par là.

D'autre part, en pas à pas il est probable que la routine prend plus de 6".
Ce serait bien de mettre au niveau de debug un suivi de chaque action, pour
voir si elle a lieu. Entre autres choses, l'utilisation du break me semble
hasardeuse. Enfin, tu n'as pas besoin de redéfinit l'interval à chaque fois.
Bref voila comment je l'écrrais...pour voir :

Private Sub Form_Load()

with MSComm1
.CommPort = 1
.Handshaking = comNone
.InputLen = 0
.DTREnable = True
.RTSEnable = True
.Settings = "4800,e,7,2"
end with


Timer.Interval = 6000
Timer.Enabled = True

End Sub

Private Sub Timer_Timer()

Timer.Enabled = False

with MSComm1
.PortOpen = True
doevents

Text1.Text = Text1.Text & vbCrLf & .Input

.PortOpen = False
end with

Timer.Enabled = True

End Sub



"jeorme" a écrit dans le message de news:

voici mon exemple qui marche en pas à pas

j'ai un form avec un timer et un mscomm et un textbox multiligne


Private Sub Form_Load()

MSComm1.CommPort = 1
MSComm1.Handshaking = comNone
MSComm1.RThreshold = 10
MSComm1.InputLen = 0
MSComm1.DTREnable = True
MSComm1.RTSEnable = True
MSComm1.Settings = "4800,e,7,2"
MSComm1.SThreshold = 0


Timer.Interval = 6000
Timer.Enabled = True

End Sub


Private Sub Timer_Timer()

Timer.Enabled = False

MSComm1.PortOpen = True

MSComm1.Break = True

buffer$ = MSComm1.Input
'Text1.Text = Text1.Text & vbCrLf & buffer

MSComm1.PortOpen = False

Timer.Interval = 6000
Timer.Enabled = True

End Sub

Ca marche bien en pas à pas mais pas en mode normal.




"Christian Hubert-Hugoud" a écrit dans le message
de news: #
Un bout de code serait bienvenu...

Christian

"jeorme" a écrit dans le message de news:
%23lkZ%
> Bonjour à tous.
> Je désespère avec mon port série , je fais un form avec un timer toutes
> les
> 6 secondes qui me lit le mscomm.input et me l'affiche dans un textbox .
> Mon
> problème est que en pas à pas ça marche mais en normal il me lit rien.
>
> Help me please.
>
>
> Merci
>
>








Avatar
Fred
Dans le messge : ,
jeorme disait :
voici mon exemple qui marche en pas à pas

j'ai un form avec un timer et un mscomm et un textbox multiligne


Private Sub Form_Load()

MSComm1.CommPort = 1
MSComm1.Handshaking = comNone
MSComm1.RThreshold = 10
MSComm1.InputLen = 0
MSComm1.DTREnable = True
MSComm1.RTSEnable = True
MSComm1.Settings = "4800,e,7,2"
MSComm1.SThreshold = 0


Timer.Interval = 6000
Timer.Enabled = True

End Sub


Private Sub Timer_Timer()

Timer.Enabled = False

MSComm1.PortOpen = True

MSComm1.Break = True

buffer$ = MSComm1.Input
'Text1.Text = Text1.Text & vbCrLf & buffer

MSComm1.PortOpen = False

Timer.Interval = 6000
Timer.Enabled = True

End Sub

Ca marche bien en pas à pas mais pas en mode normal.



Bonjour,
C'est normal, en mode pas à pas, le buffer a le temps de se remplir.
En run, tu ouvres, tu lis et tu fermes. A moins que ton PC soit
trèèèèèès lent, je doute que beaucoup de caractères soient arrivés sur
la ligne entre-temps ;-)

Autre chose : le Rthreshold sert à paramétrer le seuil (en nombre de
caractères) où l'événement On_Comm (que tu n'utilises pas) se déclenche.
Peux-tu expliciter davantage ce que tu cherches à faire ? A mon avis,
l'utilisation d'un timer n'est pas adéquate ici.

Je pense que le port série dans ton cas devrait toutjours être ouvert.
Essaie ainsi et cela devrait mieux fonctionner.

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
jeorme
Merci à tous pour vos infos.
Je pense que Fred à raison c'est à dire que le PC est trop rapide. Je ne
comprends comment marche le OnComm.
En fait je veux lire un comparateur toutes les 6 secondes et remplir un
fichier. LE mieux serai même à chaque changement de valeur du comparateur
mais bon toutes les 6 secondes ça le fera.

Merci d'avance pour vos idées.
PS: je pense que le OnComm doit être mieux approprié mais je ne sais pas
faire !
PS2: si j'ouvre en permance je peux quand même le lire avec mscomm.input ?



"Fred" a écrit dans le message de news:
#6LPG$
Dans le messge : ,
jeorme disait :
> voici mon exemple qui marche en pas à pas
>
> j'ai un form avec un timer et un mscomm et un textbox multiligne
>
>
> Private Sub Form_Load()
>
> MSComm1.CommPort = 1
> MSComm1.Handshaking = comNone
> MSComm1.RThreshold = 10
> MSComm1.InputLen = 0
> MSComm1.DTREnable = True
> MSComm1.RTSEnable = True
> MSComm1.Settings = "4800,e,7,2"
> MSComm1.SThreshold = 0
>
>
> Timer.Interval = 6000
> Timer.Enabled = True
>
> End Sub
>
>
> Private Sub Timer_Timer()
>
> Timer.Enabled = False
>
> MSComm1.PortOpen = True
>
> MSComm1.Break = True
>
> buffer$ = MSComm1.Input
> 'Text1.Text = Text1.Text & vbCrLf & buffer
>
> MSComm1.PortOpen = False
>
> Timer.Interval = 6000
> Timer.Enabled = True
>
> End Sub
>
> Ca marche bien en pas à pas mais pas en mode normal.

Bonjour,
C'est normal, en mode pas à pas, le buffer a le temps de se remplir.
En run, tu ouvres, tu lis et tu fermes. A moins que ton PC soit
trèèèèèès lent, je doute que beaucoup de caractères soient arrivés sur
la ligne entre-temps ;-)

Autre chose : le Rthreshold sert à paramétrer le seuil (en nombre de
caractères) où l'événement On_Comm (que tu n'utilises pas) se déclenche.
Peux-tu expliciter davantage ce que tu cherches à faire ? A mon avis,
l'utilisation d'un timer n'est pas adéquate ici.

Je pense que le port série dans ton cas devrait toutjours être ouvert.
Essaie ainsi et cela devrait mieux fonctionner.

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT



Avatar
Fred
Dans le messge : ,
jeorme disait :
Merci à tous pour vos infos.
Je pense que Fred à raison c'est à dire que le PC est trop rapide. Je
ne comprends comment marche le OnComm.
En fait je veux lire un comparateur toutes les 6 secondes et remplir
un fichier. LE mieux serai même à chaque changement de valeur du
comparateur mais bon toutes les 6 secondes ça le fera.

Merci d'avance pour vos idées.
PS: je pense que le OnComm doit être mieux approprié mais je ne sais
pas faire !
PS2: si j'ouvre en permance je peux quand même le lire avec
mscomm.input ?



Bonjour,
Essayons de faire exactement ce que tu veux dans ce cas. A savoir,
stocker uniquement les changements de valeurs dans un fichier si j'ai
bien saisi.
Il faudrait cependant que tu précises un certain nombre de choses.
J'ai vu que dans ton code, tu stocke les données reçues dans un textbox.
Il s'agit donc de données envoyées en ASCII. De quelle manière les
différentes valeurs sont-elles séparées ? (virgule, point-virgule, saut
de ligne)
Si tu peux me donner ces éléments je pourrais t'écrire une petite trame
de programme faisant appel à l'On_Comm en t'expliquant quelques
principes de base. Comme je le pensais, dans ton cas, il faut absolument
laisser le port ouvert. L'utilisation de la procédure On_Comm n'est pas
indispensable mais puisqu'elle existe ... ;-)


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
jeorme
En fait mes données sont stockées par un saut de ligne (j'ai fait le test en
pas à pas en écrivant dans un fichier val.txt.

Merci

"Fred" a écrit dans le message de news:

Dans le messge : ,
jeorme disait :
> Merci à tous pour vos infos.
> Je pense que Fred à raison c'est à dire que le PC est trop rapide. Je
> ne comprends comment marche le OnComm.
> En fait je veux lire un comparateur toutes les 6 secondes et remplir
> un fichier. LE mieux serai même à chaque changement de valeur du
> comparateur mais bon toutes les 6 secondes ça le fera.
>
> Merci d'avance pour vos idées.
> PS: je pense que le OnComm doit être mieux approprié mais je ne sais
> pas faire !
> PS2: si j'ouvre en permance je peux quand même le lire avec
> mscomm.input ?

Bonjour,
Essayons de faire exactement ce que tu veux dans ce cas. A savoir,
stocker uniquement les changements de valeurs dans un fichier si j'ai
bien saisi.
Il faudrait cependant que tu précises un certain nombre de choses.
J'ai vu que dans ton code, tu stocke les données reçues dans un textbox.
Il s'agit donc de données envoyées en ASCII. De quelle manière les
différentes valeurs sont-elles séparées ? (virgule, point-virgule, saut
de ligne)
Si tu peux me donner ces éléments je pourrais t'écrire une petite trame
de programme faisant appel à l'On_Comm en t'expliquant quelques
principes de base. Comme je le pensais, dans ton cas, il faut absolument
laisser le port ouvert. L'utilisation de la procédure On_Comm n'est pas
indispensable mais puisqu'elle existe ... ;-)


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT



Avatar
jeorme
désolé mais ça marche pas quand je lis mon RS232 ça commence toujours par un
? puis ma valeur. ça c'est OK mais il ne m'écrit jamais rien dans le fichier
et le OnComm ne se déclenche pas à chaque valeur.
"Fred" a écrit dans le message de news:

Dans le messge : ,
jeorme disait :
> Merci à tous pour vos infos.
> Je pense que Fred à raison c'est à dire que le PC est trop rapide. Je
> ne comprends comment marche le OnComm.
> En fait je veux lire un comparateur toutes les 6 secondes et remplir
> un fichier. LE mieux serai même à chaque changement de valeur du
> comparateur mais bon toutes les 6 secondes ça le fera.
>
> Merci d'avance pour vos idées.
> PS: je pense que le OnComm doit être mieux approprié mais je ne sais
> pas faire !
> PS2: si j'ouvre en permance je peux quand même le lire avec
> mscomm.input ?

Re,
Bon, j'ai écrit un bout de code (en PJ) avec mes souvenirs, mais je n'ai
pas VB6 (ni de cable RS) pour tester donc il faudra peut-être quelques
petits aménagements.

J'ai donc supposé que les valeurs lues sont entières et séparées par un
CR (chr(13)).
Tu noteras qu'on lit les caractères un à un et qu'on les cumule avant
d'en avoir assez pour effectuer le traitement.
A toi de réintroduire ceci dans ton code. Je suppose que tu vas appeler
[Initialisations] dans le Form_Load et [FinDeProgramme] Dans le
Form_Unload.

Si mes suppositions ne sont pas exactes et que tu ne t'en tires pas,
reviens ici.


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT



Avatar
Fred
Dans le messge : ,
jeorme disait :

désolé mais ça marche pas quand je lis mon RS232 ça commence toujours
par un ? puis ma valeur. ça c'est OK mais il ne m'écrit jamais rien
dans le fichier et le OnComm ne se déclenche pas à chaque valeur.



Le OnComm ne se déclenche pas à chaque valeur, mais à chaque
*caractère*.
Si la valeur est : "?12345", il y aura 6 appels + 1 ou 2 pour le saut de
ligne.
Comment sais-tu qu'il ne se déclenche pas ? Incrémente un compteur
(déclaré en global) et affiche le dans la procédure FinDeProgramme.
Surtout pas de Pas à Pas dans ce cas. Juste pour vérifier.
(Incrémente ce compteur avant le Select Case)

Une chose est sûre, si chacune des valeurs commence par un point
d'interrogation, il va falloir l'enlever avant de tenter une conversion.
Une conversion vers quoi d'ailleurs ? entier, réel ? Cela ne peut
effectivement pas fonctionner tel quel.
Tu parles d'un saut de ligne : quel caractère reçois-tu ? un CR
(chr(13)) un LF (chr(10)) les deux ?

Il faut être précis, on ne peut pas deviner ce que ton équipement te
renvoie.

Tu peux nous le faire savoir avec les modifications suivantes.

Modifie la partie traitement (Case ComEvReceive) avec ceci :

Case ComEvReceive
b = Asc(MSComm1.Input)
Put #1,, b

Déclare b en début de procédure OnComm de la manière suivante :
Dim b As Byte

Et modifie le mode d'ouverture du fichier ainsi :
Open "fichier.log" For Binary As #1

Poste ensuite ton fichier ici. On saura exactement de quoi il retourne.
Si tu fais plusieurs essais, renomme le fichier à chaque fois avant de
lancer le programme.

Eventuellement, poste l'intégralité de ton code (en PJ en changeant
l'extension en .txt)


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT