DataReceived l'interuption ne fonctionne pas: Besoin d'aide
Aselophe
Messages postés4Date d'inscriptionlundi 2 juin 2008StatutMembreDernière intervention16 novembre 2008
-
16 nov. 2008 à 12:56
foufate
Messages postés10Date d'inscriptiondimanche 20 février 2011StatutMembreDernière intervention 7 juin 2011
-
14 mars 2011 à 11:26
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.
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)
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 16 nov. 2008 à 13:05
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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 16 nov. 2008 à 13:09
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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 16 nov. 2008 à 14: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
taouale2
Messages postés24Date d'inscriptionjeudi 4 novembre 2004StatutMembreDernière intervention 4 février 2010 24 févr. 2009 à 18:59
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.