Code simple Réception RS232 pour VBNET 2008

Signaler
Messages postés
6
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
27 novembre 2008
-
Messages postés
6
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
27 novembre 2008
-
Bonjour à tous
Je viens de downloader VB net 2008. Pas simple à première vue compte tenu que je n'ai pas programmé depuis des années.. Je trouve que l'information Microsoft n'est pas à la hauteur.
J'ai réalisé par ailleurs un appareil de mesure avec un micro contrôleur et j'ai 5 Octets à récupérer en série asynchrone toutes les quelques dizaines de millisecondes. Je peux programmer le contrôleur comme je veux en assembleur. Ca c'est dans mes cordes.
Par contre, dans la forêt d'informations disponibles, je suis incapable de trouver le bout de code qui me permettrait de récupérer l'info tranquillement en RS232. Je n'ai pas bien compris les quelques références au sujet sur ce forum. Elles semblent inadaptées à VBNET 2008.
Si quelqu'un pouvait m'aider ? C'est un projet urgent, je ne m'en sors pas et je suis las des explications incompréhensibles (pour moi seul peut être) de l'aide Microsoft.
Merci.

11 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
74
Salut
As-tu fait la simple recherche de "RS232" parmi les codes en ".Net uniquement" ?
Il y a des exemples
Messages postés
6
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
27 novembre 2008

Merci de répondre.
En fait, dans l'aide VBnet, il n'y a aucune entrée sur RS232 ni sur serial sauf serialisation, serialportname et serial number. Rien d'utile.
Si je vais chercher sur le net, je trouve des bouts de code en visual C ou en VB6 ou même en VB net 2005 qui, une fois transposés donne des erreurs de syntaxe.  Je trouve aussi des bouts de code qui posent problème au dire de leurs auteurs, donc pas très utiles. Peut-être ne vais-je pas chercher là où il faut ?

Je n'ai pas trouvé non plus comment configurer le port ( Baud, parity, stop bit, etc..)
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Fait une recherche ici, sur le site avec RS232 et en cochant uniquement les codes .Net. Il y en a au moins une qui pourra te servir, et les autres aussi surrement

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
14781
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 avril 2021
154
Bonjour,

En .NET 2+ : System.IO.Ports.SerialPort, ensuite à toi de bosser.

http://nhen0039.chez-alice.fr/index.php
Messages postés
6
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
27 novembre 2008

OK. Je vais continuer à chercher.

Merci.
Messages postés
6
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
27 novembre 2008

Bonjour.
Bon! J'ai travaillé un peu. J'ai trouvé comment paramétrer le port série. Et j'ai le bout de code ci-dessous. Tout se passe bien tant que je n'envoie pas de signal. Dès que j'envoie un signal sur le port série, ça se plante. Donc la réception fonctionne. C'est une bonne nouvelle. Mais je n'arrive pas à récupérer les infos à cause d'une erreur que je ne comprends pas. Je suppose que cela doit être très stupide mais je ne vois pas où est le problème. Pour le moment, il n'y a qu'un formulaire dans le projet.

Private
Sub SerialPort_DataReceived(
ByVal sender
As
Object,
ByVal e
As System.IO.Ports.SerialDataReceivedEventArgs)
Handles SerialPort1.DataReceived

Dim chaine
As
String =
""

Dim nb
As
Integer = SerialPort1.BytesToRead

Dim toget(nb)
As
Byte

Dim i
As
IntegerSerialPort1.Read(toget, 0, nb - 1)

For i = 0
To nb - 1chaine = chaine + Chr(toget(i))

'3 octets transferes a la fois.

Next

Me.TextBox1.Text = chaine
' genere une erreur : Operation inter-threads non valide :

'le(controle) 'TextBox1' a fait l'objet d'un acces a partir d'un thread autre que celui

' sur lequel il a ete cree.

End
Sub

Merci.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
C'est pas vraiment stupide, ton erreur est due à un mécanisme pas évident à comprendre.

En gros, la fonction DataReceive ne s'execute pas dans le même processus que le reste du programme, elle ne peut donc pas acceder directement aux composants de ton écran.

Regarde ce sujet, j'y ai donner la solution, il y a quelques jours (ma 3eme réponse) : http://www.vbfrance.com/forum/sujet-DATARECEIVED-INTERUPTION-NE-FONCTIONNE-PAS-BESOIN-AIDE_1229433.aspx

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
6
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
27 novembre 2008

Salut.
Juste pour te dire que je travaille toujours sur le truc. J'essaye de comprendre mais pour le moment c'est assez obscur. Les infos sur Delegate parlent de passage d'une fonction au lieu de valeurs ou d'adresses. Ca, je peux comprendre. Mais j''ai du mal à admettre qu'il faille faire un truc aussi compliqué dans un langage évolué pour retrouver des données ou accéder à des objets.
En fait je peux récupérer les données dans des variables même sans delegate, mais impossible d'accéder à la propriété text des textboxes ou labels alors que l'on peut facilement accéder aux propriétés telles que backcolor. Dingue !
Pour le  moment j'ai réussi à faire mes graphiques avec ou sans delegate. Je peux manipuler les gains et les offsets de mon graphique avec des numericupdown. Mais toujours impossible d'afficher les valeurs numériques dans les textboxes, du moins si j'envoie des données sur le port série; sinon pas de problème. Pas très génant pour mon application mais très énervant et toujours incompréhensible (pour moi s'entend).

Cependant, dans le code suivant donné sur le lien que tu m'as proposé :
 Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
                Me.Invoke(New _Affiche_reception(AddressOf Affiche_reception), RS232.ReadExisting)
        End Sub

        Private Sub Affiche_reception(ByVal donnee As String)
                Label1.Text = "Interuption en fonction"
                Label2.Text = donnee      'On affiche les données à l'écran
        End Sub

Peut-on sans rien changer à la ligne Me.Invoke ...... utiliser la ligne suivante :
Private Sub Affiche_reception(ByVal octet1 As Byte, ByVal octet2 As Byte, ByVal octet3 As Byte). J'ai en effet une erreur de nombre de données
  
Le constructeur utilise le nom de la routine précédé de _. Est-ce utile ou juste une habitude ?

Merci encore si tu as un peu de temps à me consacrer.
Messages postés
14781
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
12 avril 2021
154
Bonjour,

"Le constructeur utilise le nom de la routine précédé de _. Est-ce utile ou juste une habitude ?"
Ce n'est pas le constructeur, mais le gestionnaire d'évènement. Il s'agit de faciliter le repérage du nom de l'objet et du nom de l'évènement.
Si tu parle de "Me.Invoke(New _Affiche_reception(AddressOf Affiche_reception), RS232.ReadExisting)", c'est ton Delegate qui est nommé de cette manière, et non un constructeur, ce nom est libre, mais doit quand même rester compréhensible (pour la relectutre du prog par un autre dev).
Cette ligne créé une instance d'un Delegate.

Si tu change la signature du gestionnaire d'evenement (prarmètres), tu DOIS adapter ton Delegate (ou en faire un nouveau), et si besoin modifier son appel, donc dans ton cas, il faudra changer la ligne de l'Invoke.

"J'ai en effet une erreur de nombre de données", Quelles erreurs ?

http://nhen0039.chez-alice.fr/index.php
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Ah zut, ma réponse n'était pas passé hier soir. Gros soucis de serveur ???????

Je disais la même chose.

Effectivement si tu modifie la routine Affiche_reception, il faudra modifi l'appel de l'invoke en concordance.

Private Sub Affiche_Reception(p1 as byte, p2 as byte, p3 as byte) ====> Me.Invoke(New _Affiche_Reception(AddressOf Affiche_Reception), p1, p2,p3)

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
6
Date d'inscription
vendredi 30 novembre 2007
Statut
Membre
Dernière intervention
27 novembre 2008

En gros, mon système fonctionne, même sans la procédure Invoke etc.... Je ne peux pas encore afficher la valeur numérique mais le graphe suffit pour l'instant. Je vais donc utiliser ces dernières informations dans la prochaine version.
Je te remercie infiniment.