Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon code se bloque sur port.ReadLine

Communication Série

Sujet résolu
    23 mai 2018 à 12:16:34

    Bonjour,

    J'essaye simplement de lire un port série, le problème est que mon code se bloque sur readline. Je ne sais absolument pas pourquoi. Les tests avec Tera Term fonctionnent pourtant.

    Voilà le code (https://docs.microsoft.com/fr-fr/dotnet/visual-basic/developing-apps/programming/computer-resources/how-to-receive-strings-from-serial-ports):

    Function ReceiveSerialData() As String
        ' Receive strings from a serial port.
        Dim returnStr As String = ""
    
        Dim com1 As IO.Ports.SerialPort = Nothing
        Try
            com1 = My.Computer.Ports.OpenSerialPort("COM1")
            com1.ReadTimeout = 10000
            Do
                Dim Incoming As String = com1.ReadLine()
                If Incoming Is Nothing Then
                    Exit Do
                Else
                    returnStr &= Incoming & vbCrLf
                End If
            Loop
        Catch ex As TimeoutException
            returnStr = "Error: Serial Port read timed out."
        Finally
            If com1 IsNot Nothing Then com1.Close()
        End Try
    
        Return returnStr
    End Function


    Merci d'avance !

    • Partager sur Facebook
    • Partager sur Twitter
      23 mai 2018 à 12:51:53

      C'est pas interdit de lire la documentation... elle stipule bien que ReadLine bloque l'exécution jusqu'à ce qu'une ligne soit reçue, du coup si rien n'arrive depuis COM1 tu peux rester bloqué longtemps.

      Par conséquent soit y'a un souci au niveau de ce qui est envoyé (t'envoies bien ? ; t'es sur le bon port etc.) soit tu peux modifier avant la propriété ReadTimeOut de ton SerialPort pour la duree que tu veux, du coup ça sera plus bloquant (enfin si mais uniquement jusqu'à la durée spécifiée), par contre s'il n'y a pas eu de lecture dans ce laps de temps il faudra traiter avec la TimeOutException qui sera lancée

      • Partager sur Facebook
      • Partager sur Twitter
      Censément, quelqu'un de sensé est censé s'exprimer sensément.
        23 mai 2018 à 13:37:13

        Oui j'ai lu la doc, je sais bien, j'envoie en même temps, je l'ai pas précisé car ça me paraissait évident.

        Je vais ré-installer deux trois trucs pour voir.


        Sehnsucht a écrit:

        C'est pas interdit de lire la documentation... elle stipule bien que ReadLine bloque l'exécution jusqu'à ce qu'une ligne soit reçue, du coup si rien n'arrive depuis COM1 tu peux rester bloqué longtemps.

        Par conséquent soit y'a un souci au niveau de ce qui est envoyé (t'envoies bien ? ; t'es sur le bon port etc.) soit tu peux modifier avant la propriété ReadTimeOut de ton SerialPort pour la duree que tu veux, du coup ça sera plus bloquant (enfin si mais uniquement jusqu'à la durée spécifiée), par contre s'il n'y a pas eu de lecture dans ce laps de temps il faudra traiter avec la TimeOutException qui sera lancée


        EDIT 1: Après d'autres tests, le problème a l'air de toujours venir de readline qui bloque même si elle reçoit bien une ligne.

        EDIT 2: Après 3h de recherche j'ai trouvé la solution, il s'avère que le code emprunté sur la doc Microsoft ne fonctionne pas avec moi (allez savoir pourquoi ?).

        La solution est la suivante :

        Function ReceiveSerialData() As String
            ' Receive strings from a serial port.
            Dim returnStr As String = ""
         
            Dim com1 As IO.Ports.SerialPort = Nothing
            Try
                com1 = My.Computer.Ports.OpenSerialPort("COM1")
                com1.ReadTimeout = 10000
                Do
                    Dim Incoming As String = com1.ReadLine()
                    If Incoming = Nothing Then  '<------------ MODIF
                        Exit Do
                    Else
                        returnStr &= Incoming & vbCrLf
                    End If
                Loop
            Catch ex As TimeoutException
                returnStr = "Error: Serial Port read timed out."
            Finally
                If com1 IsNot Nothing Then com1.Close()
            End Try
         
            Return returnStr
        End Function

        Des bisous !

        -
        Edité par Slownners 23 mai 2018 à 16:11:53

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2018 à 17:30:00

          ?? j'ai aucun problème à faire avec Is ; surtout que ce test ne sert a priori à rien ; ReadLine lit jusqu'au prochain NewLine donc il n'y a aucun cas où ça peut donner Nothing, dans le pire des cas y'a une exception mais là on sort du bloc pour aller dans le catch du coup on zappe le test

          • Partager sur Facebook
          • Partager sur Twitter
          Censément, quelqu'un de sensé est censé s'exprimer sensément.
            24 mai 2018 à 12:16:54

            Sehnsucht a écrit:

            ?? j'ai aucun problème à faire avec Is ; surtout que ce test ne sert a priori à rien ; ReadLine lit jusqu'au prochain NewLine donc il n'y a aucun cas où ça peut donner Nothing, dans le pire des cas y'a une exception mais là on sort du bloc pour aller dans le catch du coup on zappe le test

            Oui, j'ai rien dit mais une partie du problème venait de l'installe de VS2017. Je sais pas ce que le PC avait subit avant moi mais apparemment il avait souffert. Je l'ai remis sur pied et maintenant même avec le "Is" ça fonctionne.

            L'ancien utilisateur de ce PC devait certainement être un stagiaire un peu douteux.

            Mais oui l'erreur est et restera obscure...

            Merci quand même pour ton aide Sehnsucht !

            • Partager sur Facebook
            • Partager sur Twitter

            Mon code se bloque sur port.ReadLine

            × 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