OVH Cloud OVH Cloud

MsComm er RThresold

2 réponses
Avatar
Jacquelin Hardy
Bonjour groupe,

j'ai écrit un logiciel où je dois lire 2 ports de communication, un pour
un GPS et un pour un AIS.
Le GPS transmet à 4800 bauds. Il émet approx. 300 caractères par seconde.

Ma première question : est-ce préférable de déclencher un ComEvReceive à
chaque caractère reçu en placant 0 dans le RThresold, ou bien de placer
un nombre comme 100, 200 ou 300 dans le RThresold.

J'ai aussi un timer pour procéder le data du GPS. Je l'ai placé à 1
seconde. C'est-à-dire qu'à chaque seconde je "processe" le GPS data que
j'ai placé dans un double buffer à chaque ComEvReceive. Est-ce que cette
seconde est OK? Devrais procéder le data plus souvent ?

Le 2e port reçoit du data d'un AIS, un appareil qui transmet à 38400
bauds des phrases de texte encapsuléees en 6 bits. Selon le traffic
maritime, il peut transmettre jusqu'à 2500 caractères par seconde.

Même question ici que pour le port GPS ; utiliser le RThresold pour
déclencher un ComEvReceive ou y aller à chaque caractère. Aussi, est-ce
préférable de processer le data plusieurs fois par seconde, ou une fois
par seconde est suffisante.

Actuellement, mes Thresold sont à 0. Mes timers à 1 seconde. Lorsqu'il
y a beaucoup de traffic maritime, donc d'émissions de data par les
navires, mes buffers semblent "jammer". J'affiche l'heure locale à
chaque seconde et celle -ci s'update seulement au 5, 10 ou même 15
secondes parfois.

Est-ce qu'un DoEvents dans les routines de data processing arrangerait
les choses ? Le CPU a d'autres choses à faire pendant ses "temps libre";
afficher les navires sur une carte vectorielle en temps réel, leur cap,
vitesse, position, etc..

Merci

Jacquelin Hardy

2 réponses

Avatar
Jean-marc
"Jacquelin Hardy" a écrit dans le message de news:

Bonjour groupe,



Hello,

j'ai écrit un logiciel où je dois lire 2 ports de communication, un pour
un GPS et un pour un AIS.
Le GPS transmet à 4800 bauds. Il émet approx. 300 caractères par seconde.

Ma première question : est-ce préférable de déclencher un ComEvReceive à
chaque caractère reçu en placant 0 dans le RThresold, ou bien de placer un
nombre comme 100, 200 ou 300 dans le RThresold.



Personellement, j'aime bien RThreshold à 0, et je gère "à la main" ce qui
arrive.

J'ai aussi un timer pour procéder le data du GPS. Je l'ai placé à 1
seconde. C'est-à-dire qu'à chaque seconde je "processe" le GPS data que
j'ai placé dans un double buffer à chaque ComEvReceive. Est-ce que cette
seconde est OK? Devrais procéder le data plus souvent ?



Une seconde est plus que suffisante, En une seconde, un navire ou autre
objet sur l'eau ne vas pas faire plus d'une dizaine de mètre. Compte tenu
de l'imprécision du GPS, pour moi une seconde est plus q'assez.


Le 2e port reçoit du data d'un AIS, un appareil qui transmet à 38400 bauds
des phrases de texte encapsuléees en 6 bits. Selon le traffic maritime, il
peut transmettre jusqu'à 2500 caractères par seconde.

Même question ici que pour le port GPS ; utiliser le RThresold pour
déclencher un ComEvReceive ou y aller à chaque caractère.



Idem, je laisserais à 0 et j'appelerais une procédure perso quand
j'ai une trame complète.

Aussi, est-ce préférable de processer le data plusieurs fois par seconde,
ou une fois par seconde est suffisante.



Ca dépend de ce que tu fais avec ces données. Même sans savoir exactement
ce que fait ton appli, je dirais qu'une fois par seconde est un bon rythme.

Actuellement, mes Thresold sont à 0. Mes timers à 1 seconde. Lorsqu'il y a
beaucoup de traffic maritime, donc d'émissions de data par les navires,
mes buffers semblent "jammer". J'affiche l'heure locale à chaque seconde
et celle -ci s'update seulement au 5, 10 ou même 15 secondes parfois.

Est-ce qu'un DoEvents dans les routines de data processing arrangerait les
choses ?



Oui, un DoEvents arrangera très bien les choses!

Le CPU a d'autres choses à faire pendant ses "temps libre"; afficher les
navires sur une carte vectorielle en temps réel, leur cap, vitesse,
position, etc..




Une question quand même: si tu mets RThreshold à 0, tu controles en temps
réel (caractère par caractère) ce que tu reçois. Je suppose que tu peux
savoir à tout moment (lors de la réception d'un caractère) si tu as reçu
une trame d'information complète? Si oui, pourquoi un Timer? Ne serait il
pas plus efficace de processer de manière systèmatique dès que tu as un
jeu de données complet? Ceci s'applique à GPS et à AIS.

Un truc du genre:

Sub Comm_evReceive

stocke nouveau caractère dans buffer
Est ce caractère de fin de trame?
Si oui
Call Process_data (Buffer)
Fin si
End Sub

Evidemment, cela suppose que tu peux savoir, lors de la
réception d'un caractère, que tu as assez d'info (ce que j'ai
appelé une trame) pour faire un processing intelligent.

Sur les GPS que j'employais, il y a avait des caractères spéciaux
qui signalaient le début et la fin d'émission d'une "trame" d'info.

Une autre solution avec un autre matériel était de mesurer la taille
de la trame car un jeu de donnée (une trame d'info) avait toujours la
même taille.

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
Jacquelin Hardy
Jean-Marc,

je te remercie bien pour tes réponses.

Jacquelin

Jean-marc a écrit :
"Jacquelin Hardy" a écrit dans le message de news:

Bonjour groupe,



Hello,

j'ai écrit un logiciel où je dois lire 2 ports de communication, un pour
un GPS et un pour un AIS.
Le GPS transmet à 4800 bauds. Il émet approx. 300 caractères par seconde.

Ma première question : est-ce préférable de déclencher un ComEvReceive à
chaque caractère reçu en placant 0 dans le RThresold, ou bien de placer un
nombre comme 100, 200 ou 300 dans le RThresold.



Personellement, j'aime bien RThreshold à 0, et je gère "à la main" ce qui
arrive.

J'ai aussi un timer pour procéder le data du GPS. Je l'ai placé à 1
seconde. C'est-à-dire qu'à chaque seconde je "processe" le GPS data que
j'ai placé dans un double buffer à chaque ComEvReceive. Est-ce que cette
seconde est OK? Devrais procéder le data plus souvent ?



Une seconde est plus que suffisante, En une seconde, un navire ou autre
objet sur l'eau ne vas pas faire plus d'une dizaine de mètre. Compte tenu
de l'imprécision du GPS, pour moi une seconde est plus q'assez.


Le 2e port reçoit du data d'un AIS, un appareil qui transmet à 38400 bauds
des phrases de texte encapsuléees en 6 bits. Selon le traffic maritime, il
peut transmettre jusqu'à 2500 caractères par seconde.

Même question ici que pour le port GPS ; utiliser le RThresold pour
déclencher un ComEvReceive ou y aller à chaque caractère.



Idem, je laisserais à 0 et j'appelerais une procédure perso quand
j'ai une trame complète.

Aussi, est-ce préférable de processer le data plusieurs fois par seconde,
ou une fois par seconde est suffisante.



Ca dépend de ce que tu fais avec ces données. Même sans savoir exactement
ce que fait ton appli, je dirais qu'une fois par seconde est un bon rythme.

Actuellement, mes Thresold sont à 0. Mes timers à 1 seconde. Lorsqu'il y a
beaucoup de traffic maritime, donc d'émissions de data par les navires,
mes buffers semblent "jammer". J'affiche l'heure locale à chaque seconde
et celle -ci s'update seulement au 5, 10 ou même 15 secondes parfois.

Est-ce qu'un DoEvents dans les routines de data processing arrangerait les
choses ?



Oui, un DoEvents arrangera très bien les choses!

Le CPU a d'autres choses à faire pendant ses "temps libre"; afficher les
navires sur une carte vectorielle en temps réel, leur cap, vitesse,
position, etc..




Une question quand même: si tu mets RThreshold à 0, tu controles en temps
réel (caractère par caractère) ce que tu reçois. Je suppose que tu peux
savoir à tout moment (lors de la réception d'un caractère) si tu as reçu
une trame d'information complète? Si oui, pourquoi un Timer? Ne serait il
pas plus efficace de processer de manière systèmatique dès que tu as un
jeu de données complet? Ceci s'applique à GPS et à AIS.

Un truc du genre:

Sub Comm_evReceive

stocke nouveau caractère dans buffer
Est ce caractère de fin de trame?
Si oui
Call Process_data (Buffer)
Fin si
End Sub

Evidemment, cela suppose que tu peux savoir, lors de la
réception d'un caractère, que tu as assez d'info (ce que j'ai
appelé une trame) pour faire un processing intelligent.

Sur les GPS que j'employais, il y a avait des caractères spéciaux
qui signalaient le début et la fin d'émission d'une "trame" d'info.

Une autre solution avec un autre matériel était de mesurer la taille
de la trame car un jeu de donnée (une trame d'info) avait toujours la
même taille.