Code simple Réception RS232 pour VBNET 2008

cs_calvinethobbes Messages postés 6 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 27 novembre 2008 - 17 nov. 2008 à 02:54
cs_calvinethobbes Messages postés 6 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 27 novembre 2008 - 27 nov. 2008 à 14:33
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

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
17 nov. 2008 à 07:11
Salut
As-tu fait la simple recherche de "RS232" parmi les codes en ".Net uniquement" ?
Il y a des exemples
0
cs_calvinethobbes Messages postés 6 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 27 novembre 2008
17 nov. 2008 à 10:17
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..)
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
17 nov. 2008 à 11:45
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
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
17 nov. 2008 à 11:47
Bonjour,

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

http://nhen0039.chez-alice.fr/index.php
0

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

Posez votre question
cs_calvinethobbes Messages postés 6 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 27 novembre 2008
17 nov. 2008 à 15:51
OK. Je vais continuer à chercher.

Merci.
0
cs_calvinethobbes Messages postés 6 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 27 novembre 2008
18 nov. 2008 à 23:21
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.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
19 nov. 2008 à 09:49
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
0
cs_calvinethobbes Messages postés 6 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 27 novembre 2008
26 nov. 2008 à 01:18
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.
0
NHenry Messages postés 15114 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 4 mai 2024 159
27 nov. 2008 à 12:57
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
27 nov. 2008 à 14:14
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
0
cs_calvinethobbes Messages postés 6 Date d'inscription vendredi 30 novembre 2007 Statut Membre Dernière intervention 27 novembre 2008
27 nov. 2008 à 14:33
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.
0
Rejoignez-nous