Partage
  • Partager sur Facebook
  • Partager sur Twitter

Petite problème de traduction VB6 to VB.NET

Port série

    16 avril 2011 à 11:54:19

    Bonjour, je sollicite votre aide pour avoir la traduction de ces commandes en VB.NET :

    serialport.Settings = txt_port.Text
     serialport.CommPort = txt_portnum
     serialport.PortOpen = True
    


    serialport est le nom de mon port et les txt sont des textbox.

    Edit : Des textbox contenant les paramètres :)

    Merci d'avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      16 avril 2011 à 18:47:19

      serialport est une instance de...?
      • Partager sur Facebook
      • Partager sur Twitter
        17 avril 2011 à 19:22:09

        Citation : Ice_Keese

        serialport est une instance de...?



        C'est un port série, je trouve juste pas la version VB.NET de .Settings, .CommPort et .PortOpen

        Edit : Voici les erreurs :

        - 'Settings' is not a member of 'System.IO.Ports.SerialPort'.
        - 'CommPort' is not a member of 'System.IO.Ports.SerialPort'.
        - 'PortOpen' is not a member of 'System.IO.Ports.SerialPort'.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          17 avril 2011 à 20:08:46

          Oui mais c'est quoi le nom de la classe dont serialPort est une instance ?
          • Partager sur Facebook
          • Partager sur Twitter
            18 avril 2011 à 0:38:28

            serialPort.CommPort => SerialPort.PortName
            serialPort.PortOpen => SerialPort.Open()
            serialPort.Settings => SerialPort.[Voir la doc pour définir BaudRate, bit de parité, StopCondition etc etc...Chaque paramétrage est découpé dans une propriété]
            • Partager sur Facebook
            • Partager sur Twitter
              18 avril 2011 à 12:13:59

              Voici un exemple de configuration de port COM (SerialPort) via une petite classe.
              Tu peux t'en inspirer (ce code n'est pas tip top) conjointement avec la MSDN

              Imports System.Reflection.MethodBase
              Imports System.Runtime.InteropServices
              Imports System.IO.Ports
              
              
              Public Class CDialSpp
              
                  Private m_portCom As SerialPort
              
              
                  ''' <summary>
                  ''' Ouvre le port COM BT
                  ''' </summary>
                  ''' <returns>True si tout s'est bien passé</returns>
                  Public Function OpenPort() As Boolean
                      Dim res As Boolean = False
                      Dim str As String
              
                      Try
                          If Not IsNothing(m_portCom) Then
              
                              If m_portCom.IsOpen Then
                                  m_portCom.Close()
                              End If
              
                              With m_portCom
                                  .BaudRate = 19200
                                  .Parity = IO.Ports.Parity.None
                                  .DataBits = 8
                                  .StopBits = IO.Ports.StopBits.One
                                  .ReadTimeout = 700
                                  .NewLine = vbCr & vbLf
                                  '.Encoding = System.Text.Encoding.ASCII
                              End With
              
                              m_portCom.Open()
              
                          End If
              
                      Catch ex As Exception
                          Throw ex
                      End Try
              
                      Return res
                  End Function
              
              
              
                  ''' <summary>
                  ''' Ferme le port COM BT
                  ''' </summary>
                  Public Sub ClosePort()
                      If Not IsNothing(m_portCom) Then
                          If m_portCom.IsOpen Then
                              Try
                                  m_portCom.Close()
                                  m_portCom.Dispose()
                              Catch ex As Exception
                              End Try
                          End If
                          m_portCom.Dispose()
                      End If
                  End Sub
              
              
              
                  ''' <summary>
                  ''' Initialisation (ouverture COM)
                  ''' </summary>
                  ''' <param name="numPort">Port COM utilisé</param>
                  ''' <returns>True si l'initialisation s'est bien passée</returns>
                  Public Function Init(ByVal numPort As String) As Boolean
                      Dim listePortsCom() As String
                      Dim res As Boolean = False
              
                      listePortsCom = SerialPort.GetPortNames()
                      Array.Sort(listePortsCom)
              
                      For Each valPort As String In listePortsCom
                          If valPort = numPort Then
                              res = True
                              Exit For
                          End If
                      Next
              
                      If res = True Then
                          m_portCom = New SerialPort(numPort)
                          Return OpenPort()
                      Else
                          Return False
                      End If
                  End Function
              
              
              End Class
              
              • Partager sur Facebook
              • Partager sur Twitter
                18 avril 2011 à 15:05:22

                Citation : Aethec

                Oui mais c'est quoi le nom de la classe dont serialPort est une instance ?



                Je ne sais pas trop ce qu'est une instance donc si tu peux m'éclairer j'en serai ravi :)

                @HolyView : Merci pour ton exemple, je vais choper ce qui m'intéresse :) Qu'est ce que "Try" ?

                Citation : Nisnor

                serialPort.CommPort => SerialPort.PortName
                serialPort.PortOpen => SerialPort.Open()
                serialPort.Settings => SerialPort.[Voir la doc pour définir BaudRate, bit de parité, StopCondition etc etc...Chaque paramétrage est découpé dans une propriété]



                C'est ce que j'attendais comme réponse merci :)
                Si je comprend bien le serial.PortOpen qui était une valeur booléenne devient une "fonction" ?
                Et pour le PortName il suffit de dire serialport.PortName = 1 ou = COM1 ?
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  18 avril 2011 à 15:20:37

                  Citation : Zero_boulot_dodo

                  Citation : Aethec

                  Oui mais c'est quoi le nom de la classe dont serialPort est une instance ?



                  Je ne sais pas trop ce qu'est une instance donc si tu peux m'éclairer j'en serai ravi :)



                  Dans le code suivant :
                  Dim unObjet As MaClasse
                  

                  unObjet est une instance de MaClasse. ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 avril 2011 à 15:24:10

                    @Aethec : Quel est l'intêret de déclarer mon serialport comme étant une instance de SerialPort ? Je ne l'ai pas fait et cela a l'air de fonctionner .. :/

                    Edit : Le code qu'on m'a fourni donne ceci pour le click sur le bouton "ON"

                    Private Sub btn_on_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_on.Click
                                serialport.RtsEnable = 0
                                serialport.RtsEnable = 1
                                serialport.RtsEnable = 1
                                serialport.RtsEnable = 1
                                serialport.RtsEnable = 1
                                serialport.RtsEnable = 1
                                serialport.RtsEnable = 0
                    
                        End Sub
                    


                    Je ne comprend pas c'est qu'est le RTS et ni à quoi sert cette sucession de mise à zéro puis à 1

                    Edit 2 : J'ai un petit problème à nouveau ( un de plus )

                    J'utilise cette ligne pour envoyer une trame sur mon port série :


                    serialport.Write("" + Chr(137) + Chr(0) + Chr(20) + Chr(128) + Chr(0))
                    


                    J'utilise un port série virtuel pour lire les trames envoyées par mon programme, sauf qu'au lieu d'avoir :

                    137 0 20 128 0

                    J'ai

                    63 20 0 0 0 ( en héxa : 3F 14 00 00 00 )

                    Alors là, j'y pige rien, il me plafonne tout à 3F ..
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 avril 2011 à 17:13:28

                      Citation : Zero_boulot_dodo


                      Si je comprend bien le serial.PortOpen qui était une valeur booléenne devient une "fonction" ?
                      Et pour le PortName il suffit de dire serialport.PortName = 1 ou = COM1 ?



                      C'est tout à fait ça. Le nom à fournir est un "nom-objet-système". Le système "référence" les ports d'I/O parallèle et série avec un nom et un ID. Le premier port parallèle de la machine est donc LPT1...Le premier port série de la machine serait COM1. Si tu ne veux pas te prendre la tête avec ces considérations, tu peux utiliser directement SerialPort.PortName() pour obtenir une liste des identifiants de ports série disponibles sur ta machine.

                      N'hésite pas à te servir du MSDN pour trouver tout ce que tu veux sur SerialPort. Tu auras les réponses beaucoup plus rapidement qu'en attendant la réponse de quelqu'un ici ^^.

                      Citation : Zero_boulot_dodo

                      Je ne comprend pas c'est qu'est le RTS et ni à quoi sert cette sucession de mise à zéro puis à 1


                      J'ai déjà bricolé une interface de programmation pour µC ATMEL sur port série...Il me reste quelques résidu mais je me rappelle plus de tout. RTS signifie "Request To Send" qui veut littéralement dire "Requête d'envoit". Cette ligne est physiquement présente sur le port série et permet à l'ordinateur de spécifier au périphérique connecté que ce dernier peut émettre des données. Avec son copain CTS, ces deux lignes te permettent de faire une gestion de flux hardware plus qu'une gestion de flux software. Pour bien comprendre comment marche un port série en mode RS-232, je te recommande ce lien.

                      Pourquoi met-il RTS à 0 ou à 1? Ca, c'est au bonhomme qui a fait le programme qu'il faut le demander. Il n'y a que lui qui pourra te dire quel type de matériel, susceptible de réagir à ces changements de la ligne RTS, est piloté par son programme.

                      Pour le problème d'octets qui ne correspondent pas...Je ne suis pas expert VB.NET, aussi, je vais juste te demander à quoi sert la fonction "Chr"?


                      Edit : Garde en tête que le port série marche sur 9 bits maximum et que les chaines de caractères .NET sont encodées en Unicode (sur 16 bits donc). Deux trames du port série seront utilisées pour coder un seul caractère .NET.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 avril 2011 à 18:14:58

                        Merci pour ta longue réponse, tout est clair :)

                        Chr : Returns a String containing the character associated with the specified character code. ;)

                        Quelqu'un sait pour mon problème de trame ? :euh:
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          18 avril 2011 à 18:17:14

                          Pour Chr, c'est probablement un problème d'encodage...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 avril 2011 à 18:37:39

                            Citation : Aethec

                            Pour Chr, c'est probablement un problème d'encodage...



                            On m'a dit ça, mais l'UTF-8 ou UTF32 me sort des trames trop longues de vingt chiffres ..

                            Edit : @Aethec : Quel est l'intêret de déclarer mon serialport comme étant une instance de SerialPort ? Je ne l'ai pas fait et cela a l'air de fonctionner .. :/
                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 avril 2011 à 18:43:51

                              Citation : Zero_boulot_dodo

                              Edit : @Aethec : Quel est l'intêret de déclarer mon serialport comme étant une instance de SerialPort ? Je ne l'ai pas fait et cela a l'air de fonctionner .. :/


                              Si tu utilises VB.NET v9.0+ (VS 2008 et plus), tu peux ajouter Infer On en haut de ton fichier pour activer l'inférence de type (ou, mieux encore, aller dans les options de ton projet > Compilation > Option Infer).
                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 avril 2011 à 18:46:39

                                Citation : Ice_Keese

                                Citation : Zero_boulot_dodo

                                Edit : @Aethec : Quel est l'intêret de déclarer mon serialport comme étant une instance de SerialPort ? Je ne l'ai pas fait et cela a l'air de fonctionner .. :/


                                Si tu utilises VB.NET v9.0+ (VS 2008 et plus), tu peux ajouter Infer On en haut de ton fichier pour activer l'inférence de type.



                                Pourquoi faire ça, c'est me rajouter une source de problème non ?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  18 avril 2011 à 18:54:30

                                  Citation : Zero_boulot_dodo

                                  Citation : Ice_Keese

                                  Citation : Zero_boulot_dodo

                                  Edit : @Aethec : Quel est l'intêret de déclarer mon serialport comme étant une instance de SerialPort ? Je ne l'ai pas fait et cela a l'air de fonctionner .. :/


                                  Si tu utilises VB.NET v9.0+ (VS 2008 et plus), tu peux ajouter Infer On en haut de ton fichier pour activer l'inférence de type.



                                  Pourquoi faire ça, c'est me rajouter une source de problème non ?


                                  Non.

                                  L'inférence de type permet à ton compilateur d'automatiquement déterminer le bon type à employer en fonction de son utilisation.

                                  Par exemple:
                                  Dim val = 2
                                  

                                  Sans Infer On, val est un Object, avec Infer On, val est un Integer. C'est équivalent au mot clé var de C#. Ça réduit la verbosité.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    18 avril 2011 à 18:57:59

                                    Citation : Ice_Keese

                                    Citation : Zero_boulot_dodo

                                    Citation : Ice_Keese

                                    Citation : Zero_boulot_dodo

                                    Edit : @Aethec : Quel est l'intêret de déclarer mon serialport comme étant une instance de SerialPort ? Je ne l'ai pas fait et cela a l'air de fonctionner .. :/


                                    Si tu utilises VB.NET v9.0+ (VS 2008 et plus), tu peux ajouter Infer On en haut de ton fichier pour activer l'inférence de type.



                                    Pourquoi faire ça, c'est me rajouter une source de problème non ?


                                    Non.

                                    L'inférence de type permet à ton compilateur d'automatiquement déterminer le bon type à employer en fonction de son utilisation.

                                    Par exemple:

                                    Dim val = 2
                                    


                                    Sans Infer On, val est un Object, avec Infer On, val est un Integer. C'est équivalent au mot clé var de C#. Ça réduit la verbosité.



                                    Ha bah je vais faire ça :D

                                    Quelqu'un sait pour ma trame ? >_<
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      18 avril 2011 à 19:01:05

                                      Vu les problèmes qu'on peut avoir à cause des différents encodages de texte utilisés, je testerais plutôt avec Write(byte[], int, int). Ecrit un octet dedans et voit si ton port virtuel sort le même octet...Ca limitera déjà les problèmes liés à l'encodage de texte.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        18 avril 2011 à 19:03:35

                                        Citation : Nisnor

                                        Vu les problèmes qu'on peut avoir à cause des différents encodages de texte utilisés, je testerais plutôt avec Write(byte[], int, int). Ecrit un octet dedans et voit si ton port virtuel sort le même octet...Ca limitera déjà les problèmes liés à l'encodage de texte.



                                        Je suis chiant mais je ne comprend rien aux explications MSDN concernant la syntaxe, buffer, c'est quoi ça ? :o

                                        Tu me donnerais un exemple pour envoyer 137 0 20 128 0 sur le port ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          18 avril 2011 à 19:07:22

                                          dans la doc MSDN, buffer représente un tableau d'octet qui contient les octets à envoyer par le port série, offset, c'est l'index de démarrage, dans le tableau d'octet, à partir duquel tu veux envoyer tes octets et length, c'est le nombre d'octet à envoyer.

                                          Un exemple C# (traductible en VB.NET facilement) :
                                          byte[] buffer = new byte[] {128};
                                          monSerialPort.Write(buffer, 0, buffer.Length);
                                          

                                          enverra le contenu de mon tableau "buffer" sur le port série. Ici, mon tableau ne contient qu'un seul octet "128"...Ce sera la seule donnée transmise sur le port série.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            18 avril 2011 à 19:09:44

                                            Citation : Nisnor

                                            dans la doc MSDN, buffer représente un tableau d'octet qui contient les octets à envoyer par le port série, offset, c'est l'index de démarrage, dans le tableau d'octet, à partir duquel tu veux envoyer tes octets et length, c'est le nombre d'octet à envoyer.

                                            Un exemple C# (traductible en VB.NET facilement) :

                                            byte[] buffer = new byte[] {128};
                                            monSerialPort.Write(buffer, 0, buffer.Length);
                                            


                                            enverra le contenu de mon tableau "buffer" sur le port série. Ici, mon tableau ne contient qu'un seul octet "128"...Ce sera la seule donnée transmise sur le port série.



                                            Facilement traductible en VB.NET, à condition de connaître le C# :p
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              18 avril 2011 à 19:10:54

                                              Citation : Zero_boulot_dodo


                                              Edit : @Aethec : Quel est l'intêret de déclarer mon serialport comme étant une instance de SerialPort ? Je ne l'ai pas fait et cela a l'air de fonctionner .. :/



                                              Bah c'est le principe même de l'objet. Tu travail avec des instances de classes. Le hic avec le VB.Net, c'est qu'à beaucoup d'endroit, c'est pas nécessaire... C'est pas nécessairement mauvais, car VB fonctionne comme ça, mais quand tu fait la transition vers C#, t'es perdu parce que ça ne marche plus.

                                              Aussi pour le Infer On, c'est bien, mais ça répond pas du tout à la question.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                18 avril 2011 à 19:12:40

                                                Rooo...Tu fais autant d'efforts que moi là XD .

                                                Dim Buffer() as Byte
                                                Buffer=New Byte(){128}
                                                monSerialPort.Write(Buffer, 0, Buffer.Length)
                                                


                                                (J'suis une bille en VB.NET, y'a p'tet des erreurs dans ce code)
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  18 avril 2011 à 19:18:22

                                                  Merci beaucoup, ton code est juste je pense :)
                                                  Si j'veux mettre un deuxième octet je rajoute quoi ? :euh:
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    18 avril 2011 à 19:19:21

                                                    Une virgule et l'octet suivant entre les accolades : "Buffer=New Byte(){128,129}"
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      18 avril 2011 à 19:24:01

                                                      Citation : Nisnor

                                                      Une virgule et l'octet suivant entre les accolades : "Buffer=New Byte(){128,129}"



                                                      Buffer = New Byte() {255, 0, 255, 0, 255}
                                                      


                                                      Il m’envoie 255 255 255 0 0 sur le port série : comment faire pour qu'il tienne compte de l'ordre ?
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        18 avril 2011 à 19:33:26

                                                        Heuuu...Normalement, il n'y a rien à faire, ça l'envoit dans l'ordre dans lequel c'est spécifié dans le tableau o_O
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          18 avril 2011 à 19:34:34

                                                          Citation : Nisnor

                                                          Heuuu...Normalement, il n'y a rien à faire, ça l'envoit dans l'ordre dans lequel c'est spécifié dans le tableau o_O



                                                          Mon tableau est un gros fumier. Il peut pas faire comme tout le monde .. Tu saurais pas comment déclarer les octets autrement, en spécifiant un ordre ?
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            19 avril 2011 à 10:34:05

                                                            Bon soyons sérieux ! tes octets seront envoyés dans cet ordre sur le port série !!!!
                                                            Ca c'est fait.

                                                            Maintenant, comment sais-tu que les octets n'arrivent pas dans le bon ordre ??
                                                            Comment fais tu tes tests ?

                                                            PS : Try/Catch permets de gérer les erreurs qui peuvent se produire en utilisant certaines fonctions. Par exemple une division par zéro provoque une exception, l'utilisation de Try/Catch permet de gérer l'exception plutot que ton programme plante royalement !
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              19 avril 2011 à 11:11:29

                                                              Citation : HolyView

                                                              Comment fais tu tes tests ?


                                                              Il a parlé de port série virtuel un peu plus haut.

                                                              Je ne sais pas si c'est pareil...Mais pour mes tests lors du développement de l'interface de programmation, j'utilisais une machine virtuelle VMWare avec un port série virtuel...Je n'ai jamais rencontré de problème d'octet arrivés dans le désordre. Peut-être ton émulateur de port de série est-il un peu bancal???
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Petite problème de traduction VB6 to VB.NET

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown