Probleme affichage textbox

drx7 Messages postés 16 Date d'inscription dimanche 27 mai 2007 Statut Membre Dernière intervention 8 juin 2009 - 19 mars 2009 à 21:21
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 - 10 mai 2009 à 10:37
bonjour voici mon problème:


j'écoute le port série et j'affiche les données dans une textbox

Code :
///////////////////////////////////////////////////////////////////////////

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{

octet1 = serialPort1.ReadByte();
Texte = (char)octet1;
Console.WriteLine(Texte);
terminale.Text = terminale.Text + Texte;
}
////////////////////////////////////////////////////////////////////////////

1er cas de figure


j'envoie sur le port série le caractère "a" toute les 1ms cela marche parfaitement.


2eme cas de figure


j'envoie sur le port série la chaine "aaaaaa" toute les 1ms et la je me
rend très vite compte que la textbox bug,je lit bien les donné mais
elle s'affiche de façon aléatoire, j'affiche aussi bien un coup "aaaa"
comme la fois suivante "aa" pk?


merci d'avance

6 réponses

cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
19 mars 2009 à 21:27
Simplement dû au fonctionnement même du port série.

L'évènement est déclenché au premier caractère reçu. Le temps que le système donne la main à ton code pour traiter l'évènement, un certains nombres de caractères supplémentaires ont pu être reçu.
Le délai entre le déclenchement de l'évènement et le traitement étant variable, le délai de réception étant lui aussi variable, tu peux aussi bien recevoir, un coup 2 caractères, le coup suivant 5, .....

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
drx7 Messages postés 16 Date d'inscription dimanche 27 mai 2007 Statut Membre Dernière intervention 8 juin 2009
19 mars 2009 à 21:34
ok

y 'a t'il un moyen pour résoudre le probleme?

merci
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
19 mars 2009 à 21:56
Soit tu connais le nombre précis de caractères que tu dois recevoir à chaque envoie, dans ce cas tu peux définir la propriété ReceiveBytesThreshold pour dire à partir de combien de caractères reçus, il faut déclenché l'évènement.

Autre méthode, sur déclenchement de l'évènement, tu lis la propriété BytesToRead pour savoir combien de caractères sont en attente de lecture, et tu ne fais le traitement que lors que tu as tout reçu.

Ces 2 méthodes nécessitent une parfaite synchronisation de la réception. En effet si tu attend 10 caractères, et que par malheurs un des caractères de cet envoie a été lu lors de la lecture précédente ou s'est perdu en route, tu ne recevra que 9 caractères. Dans le premier cas, ton évènement ne se déclenchera pas. Il ne se déclenchera que lors de la réception du 1er caractère de l'envoie suivant. De même si tu ne traite tes données que lorsque le buffer de reception contient 10 caractères.
Un moyen de relativement contourné le problème est, par exemple, si ce que tu reçois est reçu suite à l'envoie d'un code ou d'une commande à l'appareil branché à l'autre bout du cable RS232, c'est de vider le buffer de reception avant l'envoie de la commande. Comme ça, si l'autre appareil n'émet pas en permanance, ce que tu aura dans le buffer devrait correspondre uniquement aux données demandées.

Bref en gros ça dépent énormememnt de ton utilsation et de ton besoin.

Une autre méthode, plus lourde, consiste à lire systématiquement tout ce qui est reçu et stocker ça dans une variable locale statique comme par exemple un buffer circulaire.
Et c'est une autre tache complètement indépendante de la réception qui vient faire le traitement des données reçus dans cette variable.
Mais c'est plus complexe à mettre en oeuvre, surtout dans le cas d'un buffer circulaire à double entrée comme je faisais en VB6 pour des réceptions à débits élevés et continus. Cela necessite aussi généralement que les données reçues soient formatées pour pouvoir les identifiées dans le buffer (début et fin), le but étant que le buffer puisse stocké plusieurs envois complets en attente de traitement.
Cele necessite d'avoir un protocole de transmission.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
Denis666666 Messages postés 2 Date d'inscription mercredi 6 mai 2009 Statut Membre Dernière intervention 13 mai 2009
7 mai 2009 à 16:58
Salut à tous, salut Casy.

Tu parles de parles de differentes méthodes pour ce probleme en VB. Aurais tu, s'il te plait, quelques codes à proposer pour vider le buffer ou ce genre de choses? J'ai beau chercher je ne trouve rien et je n'ai pas un très bon niveau en prog.... 

Un grand merci d'avance a quiquonque pourrait me donner un petit coup de pouce
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
drx7 Messages postés 16 Date d'inscription dimanche 27 mai 2007 Statut Membre Dernière intervention 8 juin 2009
9 mai 2009 à 23:32
private



void
serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
recu = serialPort1.ReadExisting();
recu2 = recu2 + recu;
terminale.Text = recu2;
}



impossible is nothing!
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
10 mai 2009 à 10:37
J'avais pas vu qu'il y avait des réponses par ici.

Pour faire simple, on va s'arrete sur les 2 cas les plus courrants
- Reception à la demande : La reception se fait site à l'envoie d'une commande. Dans ce cas il suffit de vider le buffer de reception juste avant l'envoie de la commande. Le vidage se fait simplement en lisant le contenu du buffer mais sans le traiter puisqu'il ne nous interesse pas.

- Reception continue : L'appareil distant envoie en permanance des données sans qu'il y est besoin d'emettre une commande. Dans ce cas il n'est pas possible de vider le buffer puisqu'il se rempli tout seul. Dans ce cas, le mieux est d'avoir une tache dont le seul but est de lire le buffer et de stocker ça dans un autre buffer plus grand comme par exemple un tableau qui pourra stocker plusieurs reception successives en attente de traitement. Pour le traitement des données, on ne s'occupera pas de la reception, on viendra simplement lire ces données dans le tableau.
LE principe du buffer circulaire à double index étant bien adapté dans ce cas.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
0
Rejoignez-nous