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

Lecture d'un port Serie, MSCOMM32.OCX et perte de trames (buffer ?)

7 réponses
Avatar
Pierremag
Bonjour,

Une application cr=E9=E9 en VB6 pour lire le port s=E9rie tourne
correctement et remplie parfaitement son role, jusqu'au jour ou nous
l'avons control=E9 de plus pr=E9s ...

Et la, surprise, nous nous aper=E7evons que nous perdons enormement de
donn=E9es.

Chaque trame envoy=E9e et lu sur le port s=E9rie fait pr=E9cisement 114
caracteres, et se termine par un CRLF.

Or, il semblerait que la lecture puis ecriture dans un fichier text se
fasse "=E0 la vol=E9e" sans traitement d'un buffer, ce qui expliquerait
la perte des trames surnumeraires ...

Nous avons tent=E9s differentes config, mais aucune ne r=E9cupere toute
les trames ...

Aujourd'hui nous tournons comme suit, =E0 l'exception de tout autre
parametres :

.Handshaking =3D 2
.RThreshold =3D 1
.RTSEnable =3D True
.Settings =3D "9600,n,8,1"
.SThreshold =3D 1

Pour une ecriture dans un fichier texte avec un "print;" (le ";" a son
importance !!!)

Et je me demande si la gestion des "Input" et "InputLen" ne serait pas
un plus ... (http://www.yes-tele.com/mscomm.html)

H=E9las, nous nous y perdons un peu ...

Si quelqu'un avait des billes pour nous faire avancer.

Merci d'avance a tous ceux qui voudrons bien se pencher sur ce
probleme.

Pierre

7 réponses

Avatar
Fred
Dans : news:,
Pierremag disait :
Bonjour,



Bonjour,

Une application créé en VB6 pour lire le port série tourne
correctement et remplie parfaitement son role, jusqu'au jour ou nous
l'avons controlé de plus prés ...




Pour ma part, j'ai utilisé avec succès ce genre de méthode.

RThreshold=1
InputLen=1
etc ...

Et dans la procédure événement OnComm, je réalise quelque chose du style
:

Select Case MSComm1.CommEvent
Case comEvReceive
char=MSComm1.Input
If char <> Chr(10) Then
Trame = Trame & char
Else
Print #fichier, Trame;
Trame = ""
End If

Cela oblige à avoir une variable globale [Trame]
À toi de voir si tu ouvres et fermes le fichier à chaque écriture.


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Pierremag a écrit :
Bonjour,

Une application créé en VB6 pour lire le port série tourne
correctement et remplie parfaitement son role, jusqu'au jour ou nous
l'avons controlé de plus prés ...

Et la, surprise, nous nous aperçevons que nous perdons enormement de
données.

Chaque trame envoyée et lu sur le port série fait précisement 114
caracteres, et se termine par un CRLF.

Or, il semblerait que la lecture puis ecriture dans un fichier text se
fasse "à la volée" sans traitement d'un buffer, ce qui expliquerait
la perte des trames surnumeraires ...





Bonjour,

Comme te l'a répondu Fred, à une variante près:


private tampon as string
private comptetampon as integer

Private Sub MSComm1_OnComm()
Dim a$

a$ = MSComm1.Input

If a$ <> Chr(13) Then
If a$ = Chr(10) Then
Else
comptetampon = comptetampon + 1
tampon = tampon & a$
'utiliser pour séparer les données d'une trame
If comptetampon = 1 Or comptetampon = 3 Or comptetampon = 5
Then
comptetampon = comptetampon + 1
tampon = tampon & " "
End If
If comptetampon = 6 Then
comptetampon = 0
End If
Text1.Text = tampon
End If

Else
'ecrit la ligne dans fichier texte (objet lever)
lever.writeline (tampon)
tampon = ""
Text1.Text = ""

End If

End Sub

A+

Christophe
Avatar
Fred
Dans : news:4320808c$0$17217$,
<pas-despam> @Bwanadoo.fr>" < disait :

Bonjour,



Bonsoir :-)

private tampon as string
private comptetampon as integer

Private Sub MSComm1_OnComm()
Dim a$

a$ = MSComm1.Input

If a$ <> Chr(13) Then
If a$ = Chr(10) Then
Else
comptetampon = comptetampon + 1
tampon = tampon & a$
'utiliser pour séparer les données d'une trame
If comptetampon = 1 Or comptetampon = 3 Or comptetampon > 5 Then
comptetampon = comptetampon + 1
tampon = tampon & " "
End If
If comptetampon = 6 Then
comptetampon = 0
End If
Text1.Text = tampon
End If

Else
'ecrit la ligne dans fichier texte (objet lever)
lever.writeline (tampon)
tampon = ""
Text1.Text = ""

End If

End Sub



Alors là, j'aimerais quelques explications :-)
Je ne vois absolument pas pourquoi tu insères un espace tous les deux
caractères !
Et encore moins pourquoi cette limite de 6 ?

Peux-tu développer un peu ?

Sinon j'en profite pour expliquer un petit point du programme que j'ai
posté.
Je teste le LF (qui vient après le CR). Donc le CR est ajouté dans
Trame.
Il se traduira par un saut de ligne dans le fichier texte (et un seul
car il y a un point-virgule).

--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Fred a écrit :


Alors là, j'aimerais quelques explications :-)
Je ne vois absolument pas pourquoi tu insères un espace tous les deux
caractères !
Et encore moins pourquoi cette limite de 6 ?

Peux-tu développer un peu ?

Sinon j'en profite pour expliquer un petit point du programme que j'ai
posté.
Je teste le LF (qui vient après le CR). Donc le CR est ajouté dans Trame.
Il se traduira par un saut de ligne dans le fichier texte (et un seul
car il y a un point-virgule).




Salut,

En fait, j'ai fait un copier/coller d'un code que j'ai écrit il y a
longtemps, donc j'ai pas trop regardé, la variante était dans le test de
Chr(13).
Pour les espaces insérés c'est pour rendre plus lisible le fichier texte
généré (dans mon cas il s'agit d'un mélange de code, de mesures, de date
et d'heure).
Si tu regardes bien, l'espace est inséré tous les caractères.
La méthode utilisée est débile je le reconnais mais je crois me souvenir
avoir fait ça pour le déboggage, et en bon feignant j'ai pas optimisé,
sachant que cette appli est à mon usage unique ...
J'ai même pas créé d'exe je l'utilise toujours dans l'IDE. (!)
Et même plus: j'utilise le FSO dans cette appli (là y'a Zouri qui va
s'énerver).

Bon bref j'accepte humblement de me faire traiter d'idiot sur ce coup là!
Ca prouve au moins qu'il y en a qui lise le code avec attention.

A+

Christophe
Avatar
Fred
"<pas-despam> @Bwanadoo.fr>" <"<pas-despam> a écrit dans le message de
news:4320a288$0$7829$

Salut,



Bonjour,

En fait, j'ai fait un copier/coller d'un code que j'ai écrit il y a
longtemps, donc j'ai pas trop regardé, la variante était dans le test


de
Chr(13).
Pour les espaces insérés c'est pour rendre plus lisible le fichier


texte
généré (dans mon cas il s'agit d'un mélange de code, de mesures, de


date
et d'heure).
Si tu regardes bien, l'espace est inséré tous les caractères.



Vu,

La méthode utilisée est débile je le reconnais mais je crois me


souvenir
avoir fait ça pour le déboggage, et en bon feignant j'ai pas


optimisé,
sachant que cette appli est à mon usage unique ...
J'ai même pas créé d'exe je l'utilise toujours dans l'IDE. (!)
Et même plus: j'utilise le FSO dans cette appli (là y'a Zouri qui va
s'énerver).



:-)

Bon bref j'accepte humblement de me faire traiter d'idiot sur ce coup


là!

Ce n'étais mon intention ! Je croyais avoir loupé quelque chose. Une
précision de Pierremag dans un post que je n'aurais pas vu passer par
exemple.

Ca prouve au moins qu'il y en a qui lise le code avec attention.



On a toujours à apprendre. Cette méthode de déclenchement d'événement à
chaque caractère me paraît la plus simple et la plus fiable. Dès qu'on
commence à lire les octets reçus par paquets (possible dans ce cas
puisque les paquets sont de longueur fixe), on est toujours susceptible
d'être mal calé si on prend la conversation en cours de route d'où
complication du programme. Avec nos façons de procéder, s'il y a erreur,
un seul paquet sera altéré.

À propos de la perte de trames évoquée par Pierremag, il faudrait
vérifier que la com n'est jamais fermée. Il y a effectivement des
buffers qui sont réinitialisés dans ce cas.


--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
> On a toujours à apprendre. Cette méthode de déclenchement d'événement à
chaque caractère me paraît la plus simple et la plus fiable. Dès qu'on
commence à lire les octets reçus par paquets (possible dans ce cas
puisque les paquets sont de longueur fixe), on est toujours susceptible
d'être mal calé si on prend la conversation en cours de route d'où
complication du programme. Avec nos façons de procéder, s'il y a erreur,
un seul paquet sera altéré.

À propos de la perte de trames évoquée par Pierremag, il faudrait
vérifier que la com n'est jamais fermée. Il y a effectivement des
buffers qui sont réinitialisés dans ce cas.




Salut,

La méthode caractère par caractère (RThreshold=1) me parait
effectivement la meilleure.
Concernant la longueur des paquets, je vois pas où il est préciser
qu'ils sont de longueur fixe, dans mon cas il ne le sont pas, la seule
certitude est la terminaison CR/LF.

Pour la verif comm ouvert je gère un on_error sur les setting (si le
port est déjà ouvert : erreur), mais dans mon cas Handshaking = 1 ou 0
il appartient à l'utilisateur d'établir la connection et de lancer le
comm depuis l'appareil de mesure, pour une conversation bidirectionnelle
j'ai jamais fait.
En fait la gestion d'un comm dépend beaucoup de l'appareil connecté et
de la notice constructeur qui va avec.

A+

Christophe
Avatar
Pierremag
Merci pour toutes ces infos.

Quelques unes ont été appliquées, et nous cherchons toujours.

La méthode caractere par caractere reste à tester, et j'ai bon espoir
...

Merci.

Pierre