Lecture Port RS232 en VB net

Signaler
-
 Utilisateur anonyme -
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

Si quelqu'un pourrait m'aider. Merci

33 réponses


Bonjour,
Ta difficulté est a l'enregistrement du txt ou à la réception/envoi sur la RS?

Tu peux déjà nous montrer le code qui gère le "DataReceived" (ainsi que les subs annexes) du SerialPort pour savoir comment tu procèdes.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
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


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Tiens, les [del] ne marchent pas... tu supprimeras les lignes avec [del]


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Merci beaucoup je ne peux pas tester tout de suite car je suis en entreprise et l'automate est pris mais je vous tiens au courant.

Merci encore.

Bonjour acive,

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é

De quelle autre sub s'agit-il ?

Bonjour banana,
Oui mais pour l'instant vool n'est pas devant son PC d'après ce que j'ai compris.

d'après le code qu'il a fait je l'avais compris comme ça, d'ailleurs il devrait en avoir des erreurs d'affichées...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
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


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Salut acive

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.

Ensuite plus loin je refais cette demande :
RS232.Write("*ESR?" + Chr(10))                                                                          
                            Affiche_reception()

Mais c'est pareil que la commande précédente.
Ensuite je fais cette demande :
RS232.Write("*LRN?" + Chr(10))                                                                          
                            Affiche_reception()

Mais c'est pareil.
Et quand je fais cette demande :
RS232.Write("*STB?" + Chr(10))                                                                          
                            Affiche_reception()


La j'ai les trois réponses des trois demandes précédentes qui s'affichent.

Donc je ne comprend pas pourquoi les réponses ne s'affichent pas tout de suite.

Si vous pouvez m'aider s'il vous plait.

Re:
Comme tu peux l'imaginer je n'ai pas le même automate que toi la à portée de main, et ma boule de cristal n'a plus de piles...

Toi et toi seul, accompagné de la doc du "machin" peux savoir ce que tu dois lui envoyer et recevoir au retour.

Une idée:
Si à chaque commande tu lui envois un "*STB?" ?
Du genre:
 RS232.Write("*ESR?" & Chr(10) & "*STB?" & Chr(10))



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
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?

Oui,
dans la toute première ligne de ton code tu mets:
imports system.io


Et puis tu fais:
 Dim dir As New DirectoryInfo("C:\chemin")
        ComboBox1.DataSource = dir.GetFiles("*.*")


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique

Dim dir As New DirectoryInfo("C:\chemin")
ComboBox1.DataSource = dir.GetFiles("*.txt")


Pardon

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
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?

Dès qu'il recoit quelque chose tout se passe ici:
 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


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Merci beaucoup pour votre aide
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



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique