Serial port vb2008/10

jpatriciarno Messages postés 4 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 13 novembre 2010 - 10 nov. 2010 à 10:50
jpatriciarno Messages postés 4 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 13 novembre 2010 - 13 nov. 2010 à 11:55
bonjour à vous tous ,
Y a t-il quelqu'un pour m'aider sur l'utulisation du composant SERIAL PORT en vb 2008 /10 en particulier sur la réponse (SERIALPORT.READ) ?
Mon application est sur le principe MODBUS RTU
j'envoi une trame de 8 octets sur mon automate et il me répond (réponse 8 octets).
mon probleme: pas de synchro entre la demande et la recption
1 ouverture application (port com open)
2 envoi 1er emission
3 recetpion réponse (buffer tout est à zero)j'attend la réponse de la 1er emission
4 envoi 2eme emission
5 recetpion réponse (buffer 1er emission)j'attend la réponse de la 2eme emission

et ainsi de suite
j'ai tout essayé :thread ,delegate, timeout,temporisé... pas de solution à mon probleme
merci d'avance pour votre aide

7 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
10 nov. 2010 à 12:38
Bonjour,

Utilisant souvent ce protocole, je suis en mesure, je pense, de t'aider.

Pourrais-tu montrer le code traitant la réception de la réponse de l'esclave ?
Car tu dois mal t'y prendre, je pense.

Mon site
0
jpatriciarno Messages postés 4 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 13 novembre 2010
10 nov. 2010 à 13:43
bonjour NHenry,
voici le code simple sans rien utilser(thread..)
'RECEPTION DES OCTETS
Public trame(8) As Byte
Private Sub calculreceptrame()
SerialPort1.Read(trame, 0, 8)
End Sub
'AFFICHAGE DE LA TRAME DE RECEPTION
For ii As Integer = 0 To 8 'nb_octet
ListBox1.Items.Add(Val(trame(ii)))
Next

'AFFICHAGE (dans ce cas c'est une lecture d'un mot)
val1 = Val(trame(4))
val2 = Val(trame(5))
val1 = val1 * 256
valtot = val1 + val2
TextBox1.Text = Val(valtot)
Merci pour ta reponse
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
10 nov. 2010 à 14:06
Bonjour,

Donc, ton problème est de faire en sorte d'afficher la trame reçue quand elle est reçue et pas de manière aléatoire ?

Si c'est bien ça, il faut revoir ton driver de COM.

Ce que j'ai fais sur un de mes projets :
J'ai un thread qui est chargé exclusivement de gérer la liaison.
Quand on veut envoyer une demande, on la met dans un buffer d'émission (Queue(Of ClsTrame), ClsTrame étant une classe regroupant les caractéristiques de la trame, chez toi, ça peut être Byte() )
Ensuite, le thread va lire le buffer et envoyer la demande
Il attend soit la réponse complète, soit le TimeOut
Si il y a une réponse cohérente (CRC+numéro d'esclave+Fonction), il mets la réponse dans un buffer de sortie (déclaré de même que précédemment)

Ensuite, une autre fonction va vérifier si il y a quelque chose en sortie pour le traiter selon les besoins.

Comme ça, pas de problème de transfert, et tu peux même gérer plusieurs esclaves facilement.

J'espère avoir été clair.

Mon site
0
jpatriciarno Messages postés 4 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 13 novembre 2010
10 nov. 2010 à 15:46
bonjour,
c'est clair,enfin je crois.j'utlise pour l'envoi comme pour la réception 2 thread ?
Merci de ton aide.
0

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

Posez votre question
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
10 nov. 2010 à 19:41
Bonjour,

Le traitement de l'envoi et de la réponse (niveau port COM), je l'ai fait dans le même thread.

Mon site
0
Utilisateur anonyme
13 nov. 2010 à 01:27
Bonjour,
Pour compléter l'explication de NHenry, tu peux te servir de ce sujet comme exemple de code (le dernier post en bas).
Le principe est de créer un thread dès que des données sont disponibles, de lui passer le port en paramètre, de lire les données, de lui envoyer des données en retour, et fermer le thread juste après (ou pas).
Je pense qu'en l'adaptant un peu tu arrivera à t'en sortir.
A bientôt.
0
jpatriciarno Messages postés 4 Date d'inscription lundi 6 novembre 2006 Statut Membre Dernière intervention 13 novembre 2010
13 nov. 2010 à 11:55
bonjour,
merci de ton aide Banana,je fais des essais avec thread, BackgroundWorker ..et aussi ton example.a bientot.
0
Rejoignez-nous