IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Problème liaison série RS232


Sujet :

VB.NET

  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Par défaut Problème liaison série RS232
    Bonjour à tous, voilà je suis en train de développer une application en VB.Net qui communique via une liaison RS232.

    J'ai réalisé tout le développement sur mon PC en utilisant un cordon RS232 vers COM (je n'ai que des ports USB sur mon latop) et tout fonctionne parfaitement.

    Lorsque je porte mon application sur un autre ordinateur sur lequel il y a physiquement des vrais ports COM mon application qui est censée afficher des données depuis la liaison série dans un datagrid répond extrêmement bizarrement... si par contre j'utilise l'adaptateur USB/COM sur ce même PC tout fonctionne parfaitement et les données sont rafraîchies très rapidement dans mon datagrid.

    En gros quand j'utilise le port COM les données sont extrêmement longues à se rafraîchir et sont même parfois incomplètes, je ne comprends pas car toute la configuration du port COM se fait dans mon application et les paramètres sont bons... (baudrate 38400).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    COMPort.PortName = My.Settings.ComPort
    'Set SerialPort1 to the selected COM port at startup
    COMPort.BaudRate = My.Settings.Baudrate
    'Set Baud rate to the selected value on
    'Other Serial Port Property
    COMPort.Parity = IO.Ports.Parity.None
    COMPort.StopBits = IO.Ports.StopBits.One
    COMPort.Handshake = Handshake.None
    COMPort.DataBits = 8 'Open our serial port
    Try
        COMPort.Open()
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    Avez-vous déjà vu ça ?

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    utilises tu les méthodes qui envoient des octets ou celles qui envoient des string (et s'occupent donc de la conversion) ?
    quel est ton code de réception ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Par défaut
    Bonjour Polo, décidément tu es là pour m'aider

    Alors pour être plus précis je suis connecté à des cartes électroniques qui me remontent sur la RS232 des informations toutes les x ms.
    Je dois interpréter ces trames pour les mettre en forme dans un tableau mais je peux aussi envoyer des trames pour piloter des devices connectés dessus. (pour tout ça je suis un protocole de communication mis en place en interne).

    Alors pour la réception des trames j'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
        Private Sub Receiver(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) Handles COMPort.DataReceived
            If GetSetSerialStatus() = False Then
                GetSetSerialStatus() = True
            End If
            Dim buffer(46) As Byte
            Dim data(37) As Byte
            Dim stx As Byte ' Byte de début de message
            Dim cmd As Byte ' Type de commande envoyée
            Dim cks As Byte ' Checksum
            Dim etx As Byte ' Byte de fin de message
     
            ' Si la mémoire tampon de réception n'est pas vide alors on continue l'execution
            If COMPort.BytesToRead <> 0 Then
                COMPort.Read(buffer, 0, 46)
                stx = buffer(0)
                etx = buffer(45)
                ' On continue le traitement uniquement si il s'agit d'une trame correspondant au protocole, commençant par 0x02 et finissant par 0x03
                If stx = &H2 And etx = &H3 Then
                    cmd = buffer(4)
                    ' On vérifie que la commande envoyée correspond également au protocole
                    If cmd = &H80 Or &H82 Or &H83 Or &H84 Or &H85 Then
                        ' Enfin on contrôle que le checksum de la trame soit bien correcte
                        cks = buffer(0)
                        For i = 1 To 43
                            cks = cks Xor buffer(i)
                        Next
                        If cks = buffer(44) Then
                            'Extrait du tableau la partie data
                            Array.Copy(buffer, 6, data, 0, 38)
                            managerSingleton = Manager.GetInstance()
                            managerSingleton.Update(cmd, data)
                        End If
                    End If
                End If
            End If
        End Sub
    En gros lors de la réception des données j'en extrait les informations dont j'ai besoin et je mets à jour par la suite mon tableau d'objet contenant diverses informations.
    Ce tableau d'objet est lié à mon datagridview en utilisant le databinding.
    En utilisant mon adaptateur USB/RS232 aucun problème c'est très réactif, en passant par le port COM du second PC la datagrid met longtemps à se remplir et le changement des données est très long...

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    est-ce qu'il y a beaucoup de cas où tu ne passes pas dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If stx = &H2 And etx = &H3 Then
    parce que ca se trouve tu recois plein de trames aveec des défauts que tu ne traites pas
    parce que normalement on ne gère pas ca comme ca, on concatène tout ce qu'il y a dans le buffer pour rechercher un début et une fin de trame (ou plusieurs comme expliqué ci après)

    en plus quand l'event est levé (= des octets sont dans le buffer)
    tu lis les 46 premiers octets, s'il y avait 2 trames dans le buffer, une reste en attente, et ne sera lue qu'à la prochaine réception de données, te faisant au final un décalage dans le temps

    la communication série n'est pas aussi simple qu'on pourrait le penser
    voir ce que je dis ici sur le tcp : http://www.developpez.net/forums/d15...p/#post8178515
    sachant qu'en plus sur un port série il y a encore autre chose : autant qu'en tcp si j'envoie 8 et 20 je suis sur que l'autre côté va recevoir 8 et 20, en liaison série rs232 si j'envoie 8 et 20, de l'autre côté on peut recevoir 16 20 et 43
    en cas d'interférence les bits peuvent se transformer, certains peuvent même apparaitre ou disparaitre
    (il y peut etre de la correction d'erreur sur le nombre de bits, mais pas sur les valeurs je pense)
    il convient donc d'avoir un checksum permettant de vérifier que la trame n'a pas subi d'altération
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 52
    Par défaut
    je te remercie pour tes explications, je vais investiguer dans ce sens là.

    Par contre quelle est la différence entre mon adaptateur USB/RS232 et un port COM pour que j'obtienne des résultats différents ? C'est une histoire de mémoire tampon ou un truc du genre qui peut faire que le résultat du coup n'est pas le même ?

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 202
    Par défaut
    oui, soit le matériel, soit la liaison usb qui est gérée différemment dans windows (genre donc un regroupement de paquets)

    par contre si c'est bien ca, c'est quand même un bug dans ton code
    un bug c'est un défaut de programmation qui peut n’apparaitre que dans certains cas (ici la mauvaise gestion de la lecture avec une vision simplifiée)
    car quand un bug apparait tout le temps et sur tous les postes, on le remarque vite donc on le corrige
    certains bugs n'arrivent que certains jours de l'année etc...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [XL-2010] VBA liaison série RS232 - Problème de réception
    Par Quent4491 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/12/2014, 15h17
  2. Problème liaison série
    Par ben1015 dans le forum LabVIEW
    Réponses: 2
    Dernier message: 10/04/2009, 22h39
  3. [AVR Studio]problème liaison série
    Par gpgp007 dans le forum C
    Réponses: 0
    Dernier message: 21/02/2009, 19h08
  4. Comment capturer les données sur une liaison série RS232
    Par jef Orome dans le forum Windows Serveur
    Réponses: 3
    Dernier message: 02/04/2007, 18h14
  5. [Debutant(e)] Liaison série RS232 et servlet
    Par bourack dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 07/01/2005, 14h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo