DataReceived l'interuption ne fonctionne pas: Besoin d'aide

Signaler
Messages postés
4
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
16 novembre 2008
-
Messages postés
10
Date d'inscription
dimanche 20 février 2011
Statut
Membre
Dernière intervention
7 juin 2011
-
Bonjour a tous

J'ai un petit probleme avec la fonction DataReceived. Interuption a la reception d'un byte ne fonctionne pas.
J'ai pourtant cherché sur plusieur site et livre mes j'ai rien trouvé.
J'ai un pic qui m'envoye un byte sur le port COM RS232.
Si je met "instance.ReadByte" dans un timer ceci fonctionne correctement.
Mes si je prend la fonction interuption port com

"Private
Sub RS232_DataReceived(
ByVal sender
As
Object,
ByVal e
As System.IO.Ports.SerialDataReceivedEventArgs)
Handles RS232.DataReceived"

Le programme ne vas pas dans interuption.

Programme fait sur "Microsoft Visual Basic 2008 Expresse"

Je souhaiterai SVP vottre aide si vous trouvé mon erreur.

Merci de vottre aide !

Telecharger mon Programme sur : http://dhinni88.free.fr/RS232.zip

Ou voici mon code:

Imports

System.IO.Ports
Public

Class Form

Dim instance
As
New SerialPort
 

Private
Sub Form1_Load(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
MyBase.Load
instance.Open()

End
Sub

Private
Sub Button1_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles Quitter.Click
instance.Close()

Close()

End
Sub

Private
Sub Button2_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles Button2.Click
instance.Write(TextBox1.Text)

End
Sub

Private
Sub Timer1_Tick(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles Timer1.Tick
 

End
Sub

Private
Sub RS232_DataReceived(
ByVal sender
As
Object,
ByVal e
As System.IO.Ports.SerialDataReceivedEventArgs)
Handles RS232.DataReceived
Label1.Text = Convert.ToChar(instance.ReadByte)

Label2.Text = (

"Interupte en fonction")

End
Sub
End

Class

8 réponses

Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Pourquoi poster sous VB6, puisque tu es en VB2008 ????

Si j'en crois ton code, ton objet RS232 s'appelle Instance (pas futé comme nom, mais c'est pas le sujet)

Ton évènement DataReceived ne peut pas se déclenché puisqu'il n'est pas branché sur ton objet Instance. Il est branché sur un autre objet qui s'appelle RS232 : ...Handles
RS232.DataReceived

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Oupps, ripage de bouton dsl

Donc pour continuer, si je comprend bien tu as un objet RS232 sur ton écran je présume connecté à un port série sur lequel tu as un évènement DataReceive.

Mais dans ton code, tu déclare un second objet, Instance en l'occurrence, branché lui aussi sur un port série je présume, sauf que dans le code que tu nous montre il n'est même pas configuré.

A mon avis je pense que tu te mélance les pinceaux et que l'objet Instance n'a pas lieu d'être, il faut que tu travaille sur l'objet RS232

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

J'ai  mis sur VB6 Car il y avait pas pour VB2008

Je suis debutant sur Visual basic ses bien possible que je me mélange les pinceaux .


Je suis desoler pour les nom que j'ai copier collé sur l'aide de l'aide microsoft .

Mes si j'ai bien compris l'erreur se touve a cette ligne.

PrivateSub RS232_DataReceived(ByVal
sender AsObject, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived

je les modifié comme suite

PrivateSub instance_DataReceived(ByVal
sender AsObject, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived

Mes cela ne marche pas.

Si cela ne te derange pas je voudrai savoir si tu pourrai m'aidé un peut plus.

Merci encore pour ton aide.
Messages postés
4
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
16 novembre 2008

Merci pour ton aide j'ai reussi a faire fonctionner interuption

Mes reste que j'ai un souci maintenent pour afficher ma valeur sur le Label1.Text & Label2.Text

Pour vous je pense que l'erreur se voit a vus d'oeil mes moi je patoge dans une flaque

Code:


Imports System.IO.Ports




Public








Class

Form



Private





Sub

Form1_Load(


ByVal

sender


As

System.Object,


ByVal

e


As

System.EventArgs)


Handles





MyBase

.LoadRS232.Open()



End





Sub








Private





Sub

Button1_Click(


ByVal

sender


As

System.Object,


ByVal

e


As

System.EventArgs)


Handles

Quitter.ClickRS232.Close()

Close()



End





Sub








Private





Sub

Button2_Click(


ByVal

sender


As

System.Object,


ByVal

e


As

System.EventArgs)


Handles

Button2.ClickRS232.Write(TextBox1.Text)



End





Sub








Private





Sub

RS232_DataReceived(


ByVal

sender


As





Object

,


ByVal

e


As

System.IO.Ports.SerialDataReceivedEventArgs)


Handles

RS232.DataReceivedLabel2.Text = (



"Interupte en fonction"

)Label1.Text = Convert.ToChar(RS232.ReadByte)

 



End





SubEnd







Class
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Ceratinement que tu dois avoir un message d'erreur sur une histoire de thread.

Je vais essayer de faire simple.

La fonction DataReceive ne s'execute pas, en réalité dans le processus principal de ton logiciel, celui de ton écran, en fait elle s'execute dans son propre processus indépendant. Elle ne peut donc pas ainsi acceder directement aux objets du processus principal, notamment les controles de ton écran.

Il faut mettre en place un mécanisme appelé délégué (delegate en anglais) pour que ta fonction marche. En gros, ta fonction DataReceive va appeler par un mécanisme particulier, une seconde fonction en lui passant les données, et cette seconde fonction qui va se charger de faire la mise à jour des labels. Ca va doner le code suivant :

Imports System.IO.Ports
Public Class Form

        Private Delegate Sub _Affiche_reception(ByVal donnee As String)

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles
MyBase.Load
                RS232.Open()
        End Sub

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles
Quitter.Click
                RS232.Close()
                Close()
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles
Button2.Click
                RS232.Write(TextBox1.Text)
        End Sub

        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

End Class

JE t'invite à regarder cette source, qui est une initiation à l'utilisation du port série avec .Net --> http://www.vbfrance.com/codes/UTILISATION-PORT-COM-VS2005_42181.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
4
Date d'inscription
lundi 2 juin 2008
Statut
Membre
Dernière intervention
16 novembre 2008

Un grand Merci a toi , Tu est genial

J'aurai pue encore cherche longtemp .

Ceci fonctionne super bien . et ca me fait comprendre ces fonction de base que je connaissé pas.

Merci et bonne journée a toi
Messages postés
24
Date d'inscription
jeudi 4 novembre 2004
Statut
Membre
Dernière intervention
4 février 2010

Bonsoir,

Merci Casy pour cette aide, je tournais un peu en rond aussi à cause de ces histoires de thread.
J'aurais voulu esquiver ce concept, mais je commence à voir le bien fondé de la méthode donc je vais m'y mettre finalement.
Pour info, j'ai lu sur un autre post (en C#) que la méthode invoke est très pratique pour des cas simples, mais a ses limites (bloquage du thread le temps de l'exécution, et ne permet pas de retourner de valeur).
Le concept asynchrone (begininvoke ...) est plus performant.

Bonne soirée et merci encore
Messages postés
10
Date d'inscription
dimanche 20 février 2011
Statut
Membre
Dernière intervention
7 juin 2011

Avec les délégués sa marche de merveille