Bonjour, je suis étudiant en GEII et je suis actuellement en stage.
J'ai un problème dans mon programme.
Mon programme permet de lire et écrire sur un port série RS232 et de lire et d'enregistrer dans des fichiers .txt.
Quand je clique sur le bouton démarrer, mon programme lit les données à envoyer dans le fichier txt et les envoie.
Il envoie des commandes et sur certaines de mes commandes, l'automate me renvoie des données.
Mon problème c'est que mon programme va traiter ces données quand tout mon programme sera fini c'est à dire quand il sera sorti du SUB.
Mais moi j'ai besoin que mon programme traite les données recu et les écrivent dans un textbox pendant que le SUB est exécuté.
Mon code est long je le posterai sur demande. Merci
Ma difficulté est à la réception des données sur le port RS232 et au traitement de ces données.
Public Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
Dim donnee As String = RS232.ReadExisting
Me.Invoke(New _Affiche_reception(AddressOf Affiche_reception), donnee)
'Me.Invoke(New _Affiche_reception(AddressOf Affiche_reception), RS232.ReadExisting)
'RS232.Read(donnee, 0, 0)
End Sub
Public Sub Affiche_reception(ByVal donnee As String)
msgrecu.Text += donnee
End Sub
Ces deux SUB me permettent de lire et d'afficher sur le port RS232.
Mon problème est qu'il faudrait que ces deux SUB fonctionnent pendant que un autre SUB est exécuté
Alors tout d'abord, tu es nouveau et je te souhaite la bienvenue parmi nous.
Un petit détail très important, quand tu mets du code sur le forum s'il te plait, utilise les balises de code VB, la troisième icone en partant de droite, tu verras pourquoi quand je vais poster mon code.
J'ai rectifié quelques ligne sur ton code, tu as la bonne technique mais le mauvais procédé regarde:
Public 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), donnee)
Me.Invoke(New EventHandler(AddressOf Affiche_reception))
End Sub
'Public Sub Affiche_reception(ByVal donnee As String)
Public Sub Affiche_reception()
Dim donnee As String = RS232.ReadExisting
msgrecu.Text &= donnee
End Sub
Ta technique ne fonctionnera que si Option Strict est désactivé. Ta sub Affiche_reception n'a pas la bonne signature
Je pense que _Affiche_reception dans le code de vool fait appel à un délégué qui n'est pas montré. Si tel est le cas, le code est fonctionnel.
Par contre ce que je n'ai pas compris c'est ceci :
Ces deux SUB me permettent de lire et d'afficher sur le port RS232.
Mon problème est qu'il faudrait que ces deux SUB fonctionnent pendant que un autre SUB est exécuté
Bonjour, j'ai pu tester ce que vous m'avez conseillé pour résoudre mon problème.
Mon problème est à moitié résolu, car mon programme lit les données sur le port série mais il m'affiche plusieurs données d'un coup à un certain moment.
Voici mon programme :
Imports System
Imports System.Threading
Imports System.ComponentModel
Imports System.IO.Ports
Imports System.IO
Imports System.IO.File
Public Class Form1
Public Sub pause(ByVal seconde As Integer) Thread.Sleep(seconde)
End Sub
Private Delegate Sub _Affiche_reception()
Dim type_mesure As String = ""
Dim val_mesure As String = ""
Dim testbon As Byte = 0
Dim nbrtest As Byte = 0
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Button2.Enabled = True
Button1.Enabled = False
RS232.Open()
RS232.Write("REM" + Chr(10))
pause(500)
RS232.Write("SRQ" + Chr(10))
pause(500)
RS232.Write("*IDN?" + Chr(10))
Affiche_reception()
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
If cmdtxt.Text "" Or numserie.Text "" Then
MsgBox("Entrez un nom de fichier et un numéro de série")
Exit Sub
ElseIf Exists("C:\Users\valentin\Desktop\stage\Fichier_commande" + cmdtxt.Text + ".Txt") Then
Else
MsgBox("Le fichier n'existe pas, veuillez saisir un nom de fichier existant")
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Button1.Enabled = True
Button2.Enabled = False
RS232.Write("GTL" + Chr(10))
RS232.Close()
Me.Close()
End Sub
'Bouton démarré
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If RS232.IsOpen Then
Dim nbr_ligne As Integer = 0
Dim ligne As String
Dim sr As New StreamReader("C:\Users\valentin\Desktop\stage\Fichier_commande" + cmdtxt.Text + ".Txt")
Dim path As String = "C:\Users\valentin\Desktop\stage\Fichier_commande" + cmdtxt.Text + "Résultat.Txt"
Dim sw As StreamWriter
Try
If File.Exists(path) = False Then
sw = File.CreateText(path)
sw.Flush()
sw.Close()
End If
Catch ex As Exception
End Try
sw = File.AppendText(path)
sw.WriteLine(numserie.Text)
While sr.Peek <> -1
nbr_ligne += 1
ligne = sr.ReadLine()
Select Case nbr_ligne
Case 1
RS232.Write("CONF:FILT " & ligne + Chr(10))
pause(500)
RS232.Write("*ESR?" + Chr(10))
Affiche_reception()
If msgrecu.Text "#H10" Or msgrecu.Text "#H90" Then
MsgBox("Erreur de dialogue de type 2")
Exit Sub
ElseIf msgrecu.Text "#H20" Or msgrecu.Text "#HA0" Then
MsgBox("Erreur de dialogue de type 1")
Exit Sub
End If
pause(500)
RS232.Write("QUIT" + Chr(10))
pause(500)
Case Else
nbrtest += 1
If ligne "MEG" Or ligne "RIG" Then
If ligne = "MEG" Then
nbr_ligne += 1
ligne = sr.ReadLine()
RS232.Write("MEG" + Chr(10))
pause(500)
Dim MEGstring As String = ligne
Dim MEGarray() As String = Split(MEGstring, "/")
RS232.Write("MEG:Par 1:" + MEGarray(0) + ":CBHLIM " + MEGarray(1) + ":LLIM " + MEGarray(2) + ":HTIM " + MEGarray(3) + ":RTIM " + MEGarray(4) + ":FTIM " + MEGarray(5) + Chr(10))
pause(500)
type_mesure += "/MEG"
ElseIf ligne = "RIG" Then
nbr_ligne += 1
ligne = sr.ReadLine()
RS232.Write("HIP" + Chr(10))
pause(500)
Dim HIPstring As String = ligne
Dim HIParray() As String = Split(HIPstring, "/")
RS232.Write("HIP:Par 1:" + HIParray(0) + ":HTIM " + HIParray(1) + ":RTIM " + HIParray(2) + ":FTIM " + HIParray(3) + ":CBHLIM " + HIParray(4) + ":LLIM " + HIParray(5) + ":DET " + HIParray(6) + ":IDE " + HIParray(7) + ":RDET " + HIParray(8) + ":IMRA " + HIParray(9) + ":IDERA " + HIParray(10) + Chr(10))
pause(500)
type_mesure += "/RIG"
End If
RS232.Write("*ESR?" + Chr(10))
Affiche_reception()
If msgrecu.Text "H10" Or msgrecu.Text "H90" Then
MsgBox("Erreur de dialogue de type 2")
Exit Sub
ElseIf msgrecu.Text "H20" Or msgrecu.Text "HA0" Then
MsgBox("Erreur de dialogue de type 1")
Exit Sub
End If
pause(500)
RS232.Write("*LRN?" + Chr(10))
Affiche_reception()
pause(500)
RS232.Write("MEAS" + Chr(10))
Affiche_reception()
pause(500)
RS232.Write("STOP" + Chr(10))
pause(500)
RS232.Write("*STB?" + Chr(10))
Affiche_reception()
pause(500)
If msgrecu.Text = "H3" Then
MsgBox("Boucle de sécurité ouverte")
Exit Sub
ElseIf msgrecu.Text = "H2" Then
MsgBox("Erreur, tension incorrecte")
Exit Sub
ElseIf msgrecu.Text = "H1" Then
MsgBox("Test mauvais")
Exit Sub
Else msgrecu.Text = "H9" Then
RS232.Write("MEAS?" + Chr(10))
Affiche_reception()
testbon += 1
val_mesure += "/" + msgrecu.Text
RS232.Write("STOP" + Chr(10))
pause(500)
RS232.Write("QUIT" + Chr(10))
pause(500)
RS232.Write("*CLS" + Chr(10))
pause(500)
End If
Else
MsgBox("Erreur d'écriture")
End If
End Select
End While
If nbrtest = testbon Then
sw.WriteLine("Résultat : test bon")
Voyant.BackColor = Color.LightSeaGreen
Else
sw.WriteLine("Résultat : test mauvais")
Voyant.BackColor = Color.Red
End If
sw.WriteLine(type_mesure)
sw.WriteLine(val_mesure)
sw.Flush()
sw.Close()
sr.Close()
type_mesure = ""
val_mesure = ""
MsgBox("Fin du fichier")
Else
MsgBox("Cliquez sur le bouton connecter")
Exit Sub
End If
nbrtest testbon 0
Demande.Show()
Me.Visible = False
End Sub
Public Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
Me.Invoke(New EventHandler(AddressOf Affiche_reception))
End Sub
Public Sub Affiche_reception()
Dim donnee As String = RS232.ReadExisting
msgrecu.Text &= donnee
End Sub
Ton automate, à la suite de chaque instruction, t'envoi surement un caractère de validation (généralement un Chr(13))
Il faut filtrer par exemple:
'Tu mets donnee en tant que variable publique et:
donnee &= RS232.ReadExisting
msgrecu.Text &= donnee
If donnee.Contains(Chr(13)) Then
Dim Str As String = donnee.ToCharArray(0, (InStr(donnee, Chr(13), CompareMethod.Text) - 1))
donnee.Remove(0, (InStr(donnee, Chr(13), CompareMethod.Text)))
ListBox1.Items.Add(Str)
End If
J'ai pas trop compris ta réponse mais normalement mon automate me répond avec le caractère Xon après un envoi de commande mais il ne s'affiche pas donc il ne doit pas se lire.
Sinon pour détailler mon problème :
RS232.Write("*ESR?" + Chr(10))
Affiche_reception(
Quand j'envoi une commande de ce genre la, l'automate me renvoi quelque chose.
Mais ca ne s'écrit pas tout de suite dans mon msgrecu.
Non mais c'est pas grave merci encore vous m'avez aidé à résoudre le plus gros de mon problème merci encore.
Juste une question comme sa : Est ce que c'est possible d'afficher dans un combobox la liste des noms de tout les fichier .txt existant à un chemin précis?
Une dernière question si vous pouvez me répondre : Comment je peux dire à mon programme d'attendre que l'automate envoi un caractère spécial pour continuer?
Public Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
Me.Invoke(New EventHandler(AddressOf Affiche_reception))
End Sub
'Public Sub Affiche_reception(ByVal donnee As String)
Public Sub Affiche_reception()
donnee &= RS232.ReadExisting
if donnee.contains (ChrSpécial) then
end if
End Sub
En faite le problème est que je peux pas y faire dans le
Public Sub Affiche_reception()
parce que c'est quand je clique sur mon bouton démarrer, à un moment mon programme doit attendre que l'automate envoi le caractère Z pour continuer. Je ne sait pas comment dire à mon programme d'attendre.
Alors...
Juste après class Formx tu déclares une variable
Public Class Form1
Dim ZorroEstArrive As Boolean
En suite tu regardes si tu as un "Z"
Public Sub Affiche_reception()
donnee = RS232.ReadExisting
if donnee.contains (ChrSpécial) then
ZorroEstArrive = true
else
ZorroEstArrive = false
end if
'Après tu sais si ton programme doit continuer ou pas
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
if ZorroEstArrive = false then exit sub
'Blablabla
end sub