Announcement

Collapse
No announcement yet.

Daten im SerialPort einlesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Daten im SerialPort einlesen

    Hallo zusammen,
    ich habe zwar schon gefunden, dass man mit SerialPort1.DataReceived auf die einkommenden Daten warten kann... aber das funktioniert bei mir nicht...#

    ich muss erst einen Wert in den Port schreiben um einen Wert zurück zu bekommen...
    Unter VB6 habe ich das wie folgt gemacht

    with MSComm_T
    .Output = "P01" & Chr(3)
    Do
    DoEvents
    Loop Until .OutBufferCount = 0
    Retval = .Input
    end with


    Wie kann ich so etwas in VB.Net 2005 umsetzten ?

    Schon mal Danke

  • #2
    hast du den seriellen Port zuvor geöffnet mit
    [highlight=vbnet]
    withevents sport as new Serialport("Com1")
    sport.open()
    [/highlight]
    Solange dies nicht geschehen ist wird auch kein Event ausgelöst selbst, wenn im Moment Daten ankämen.
    Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

    Comment


    • #3
      Das habe ich.
      Ich habe auch Komunikation zum Port. Ich kann Daten zum Port schreiben... das kann ich sehen...

      ...ich bekomme aber keine Werte zurück....

      Comment


      • #4
        Das habe ich.
        Ich habe auch Komunikation zum Port. Ich kann Daten zum Port schreiben... das kann ich sehen...

        ...ich bekomme aber keine Werte zurück....
        Dann solltest du uns deinen Code zeigen der nicht funktioniert.

        Ansonsten kann man nur nach den allgemeinen Sachen fragen.
        Hast du die passenden Protokoleinstellungen vorgenommen? (Handshaking, Baudrate etc.)
        Hast du überhaupt einen Sender der dir ein Signal auf den Port legt? Wenn du versuchst zu lesen was du selbst auf den Port schreibst brauchst du einen Loop-Back-Stecker.
        Wenn DataReceived nicht feuert du aber glaubst es müssten Daten am Port anliegen, hast du mal einen expliziten Port.Read() versucht?

        Comment


        • #5
          Ok.
          Also zur Erklärung. Ich möchte Daten aus einem Temperaturmessgerät lesen. Unter VB6 geht das einwandfrei. Es muss ein String übergeben werden, dann werden die Daten vom Meßgerät zurückgesand.
          Unter VB6 hab ich dies wie folgt gemacht ( Code funktioniert eninwandfrei ):
          Code:
          Private Sub MSComm_T_OnComm()
              If MSComm_T.CommEvent = comEvDSR Then
                  MSComm_T.PortOpen = False
              ElseIf MSComm_T.CommEvent = comEventRxOver Then
                  MSComm_T.InBufferCount = 0
              End If
          End Sub
          
          Private Sub ReadValue(ByRef ReturnValue as String )
           With MSComm_T
                  .Settings = "9600,N,8,1"
                  .CommPort = Port
                  .Handshaking = 0
                   On Error Resume Next
                  .PortOpen = True
                   .Output = "P01" & Chr(3)
                    Do
                        DoEvents
                    Loop Until .OutBufferCount = 0
          
                    ReturnValue = .Input
                  .PortOpen = False
              End With
          End Sub
          Im VB.Net sieht mein Versuch wie folgt aus:

          [highlight=vbnet]
          Friend WithEvents MyPort As IO.Ports.SerialPort

          Private Sub ReadData(ByVal Retval As String)
          MyPort = New IO.Ports.SerialPort
          With MyPort
          .BaudRate = 9600
          .Parity = IO.Ports.Parity.None
          .DataBits = 8
          .StopBits = IO.Ports.StopBits.One
          .Handshake = IO.Ports.Handshake.None
          .Open()
          .WriteLine("P01" & Chr(3))
          Retval = CType(.ReadChar, String)
          .Close()

          End With
          End Sub
          [/highlight]

          Ich habe zwar gelesen, das die Werte im folgenden Ereignis Automatisch zurückgegeben werden, aber das funktioniert bei mir nicht:

          [highlight=vbnet]
          Private Sub MyPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles MyPort.DataReceived

          End Sub
          [/highlight]

          Comment


          • #6
            Du benutzt WriteLine und nicht die Write Methode. Da du es nicht so in dem VB Original macht muß ich fragen ob dein Temperaturmessgerät mit dem extra Newline Character den du hinterhersendest klar kommt?

            Ansonsten vermute ich du schließt den Port zu früh damit der Event feuert.
            Den Event wirst du aber auch nicht brauchen du willst ja gleich nach dem senden genau ein Returnwert lesen und den Port dann wieder schließen. DataReceived ist eher dazu gedacht wenn du dauerhaft den Port überwachst und irgendwann asynchron Daten von irgendeinem Gerät bekommst. Also z.B. wenn die Messung vom Temperaturmessgerät ausgelöst werden würde und dein Programm müßte dann automatisch reagieren.

            Weißt du was dein Temperaturmessgerät für Daten zurückliefert? Also wieviel Bytes bzw. ob diese mit irgendeinem Kennzeichen abgeschlossen sind (z.B. NewLine)? Je nachem solltest du dann zwischen Open und Close des Ports die ReadLine Methode benutzen oder eine Schleife über Ports.BytesToRead bis alle Bytes des Temperaturmessgeräts da sind und dann mit Port.ReadExisting alle auslesen.

            Comment


            • #7
              muß ich fragen ob dein Temperaturmessgerät mit dem extra Newline Character den du hinterhersendest klar kommt?
              Das kann ich nicht genau sagen, aber da es ein älteres Gerät ist denke ich mal nicht.

              Du meinst
              [highlight=vbnet]
              .Write("P01" & Chr(3))
              [/highlight]
              würde besser funktionieren ?


              Weißt du was dein Temperaturmessgerät für Daten zurückliefert? Also wieviel Bytes bzw. ob diese mit irgendeinem Kennzeichen abgeschlossen sind
              Kann ich im Moment nicht genau sagen, da ich das Messgerät nicht hier habe. Das könnte ich dir aber am Montag mitteilen. Ich denke das es mit "Chr(3)" abgeschlossen wird. Ich mußte mir den Übergabestring damals wie folgt kürzen:

              Code:
              'VB6 Code
              
              Function StringKürzen_Temp(Text As String)
                  Dim Pos As Long
                  Dim Suchzeichen As String
                  Suchzeichen = Chr(3)
                  
                  If Len(Text) <= 5 Then   'Initialisierung Start
                      Pos = InStr(1, Text, Suchzeichen)
                      Text = Left(Text, Pos)
                  Else                    'Messwert
                      Text = Mid(Text, 23, 7)
                  End If
                  StringKürzen_Temp = Text 'StrConv(Text, vbUnicode)
              End Function

              die ReadLine Methode benutzen
              Das hatte ich als erstes auch ausprobiert. Da ist mein Programm hängen geblieben...


              oder eine Schleife über Ports.BytesToRead bis alle Bytes des Temperaturmessgeräts da sind und dann mit Port.ReadExisting alle auslesen
              Habe ich mir auch schon mal angesehen, bin aber nicht weiter gekommen.
              Hättest du evtl. nen Codebeispiel...?

              Danke

              Comment


              • #8
                die ReadLine Methode benutzen
                Das hatte ich als erstes auch ausprobiert. Da ist mein Programm hängen geblieben...
                Dann wissen wir zumindest das dein Gerät keinen Newline am Ende sendet.

                Codebeispiel...?
                Bin eigentlich C# Mensch aber ich versuchs mal


                [Highlight=VB.Net]
                MyPort.Open()
                MyPort.Write("P01" & Chr(3))
                Do
                Thread.Sleep(0)
                Loop while MyPort.BytesToRead < DieNochZuErmittelndeAnzahlBytesDieVomGeraetGesende tWird
                Retval = MyPort.ReadExisting()
                MyPort.Close()
                [/Highlight]

                Comment


                • #9
                  OK. Danke.
                  Wie gesagt ich habe mein Messgerät nicht hier. ich klann also dein Code heute nicht testen....

                  ...ich werds gleich am Montag testen... und mich dann zurückmelden ob`s funktioniert hat....

                  Vielleicht bist du am Montag morgen auch online...
                  ...falls ich noch nen paar Fragen hab... wäre toll...

                  Erst mal Danke für deine Mühe...

                  Comment


                  • #10
                    Hallo nochmal,
                    ich bekomme immer noch keine Werte aus meinem Messgerät gelesen....

                    Ich habe mir den Wert mit dem alten Programm ( VB6 ) angesehen. Es müßte so etwas wie

                    "P01
                    MESSWERT: 00: +0048.6 øC
                    "

                    heraus kommen...

                    Comment


                    • #11
                      Baudrate etc. richtig eingestellt? Richtigen String zum initialisieren der SerialPort Klasse benutzt?
                      Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                      Comment


                      • #12
                        Hallo,
                        dies ist mein funktionierender VB6 Code:

                        Code:
                        Private Sub MSComm_T_OnComm()
                            If MSComm_T.CommEvent = comEvDSR Then
                                MSComm_T.PortOpen = False
                            ElseIf MSComm_T.CommEvent = comEventRxOver Then
                                MSComm_T.InBufferCount = 0
                            End If
                        End Sub
                        
                        Private Sub ReadValue(ByRef ReturnValue as String )
                         With MSComm_T
                                .Settings = "9600,N,8,1"
                                .CommPort = Port
                                .Handshaking = 0
                                 On Error Resume Next
                                .PortOpen = True
                                 .Output = "P01" & Chr(3)
                                  Do
                                      DoEvents
                                  Loop Until .OutBufferCount = 0
                        
                                  ReturnValue = .Input
                                .PortOpen = False
                            End With
                        End Sub

                        So versuche ich es im VB.Net
                        [highlight=vbnet]
                        Try
                        With SerialPort
                        If .IsOpen Then Return True
                        .PortName = Port
                        '.BaudRate = Baud
                        '.Parity = Parity
                        '.DataBits = DataBit
                        '.StopBits = StopBit
                        '.Handshake = HandShake
                        '.RtsEnable = Rts
                        '.ReadBufferSize = 40
                        '.Open()
                        '.Close()

                        .BaudRate = 9600
                        .Parity = IO.Ports.Parity.None
                        .DataBits = 8
                        .StopBits = IO.Ports.StopBits.One
                        .Handshake = IO.Ports.Handshake.None
                        .Open()
                        .Write("P01" & ChrW(3))
                        '.Write("A1" & Chr(3))
                        Do
                        Application.DoEvents()
                        Loop While .BytesToRead <= 0
                        'Threading.Thread.Sleep(1)
                        RetVal = .ReadExisting
                        End With

                        [[/highlight]

                        Was mache ich falsch..??


                        Kurios ist schon. Wenn ich "P01" & Chr(3)" im VB6 übergebe passiert nichts in der Anzeige des Messgerätes, ich bekomme aber Werte zurück.

                        Wenn ich das wie oben beschrieben im VB.Net mache verändere ich damit den Anzeigewert des Messgerätes, bekomme aber keine über den Port zurück...

                        Comment


                        • #13
                          deinen .PortName belegst du ja mit der Variable Port. Wie kommt die zustande? Kannst du das bitte noch schnell posten?
                          Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                          Comment


                          • #14
                            Im Port steht "COM1"

                            Comment


                            • #15
                              Was mir jetz noch auffällt du benutzt CHRW im .NET Code während im VB6 Code noch CHR benutzt, den genauen Unterschied hab ich no net weil ich im Moment nicht am Programmierplatz bin wo ich alle Anwendungen habe. Aber vielleicht bringt das ja was.
                              Das verändern der Anzeige ist schon sehr eigenartig.

                              Was du vielleicht mal machen könntest, wäre das ErrorRecieved Event projektierst, damit man mal sehen kann ob nicht vielleicht der Schreibvorgang am SeriellenPort fehlschlägt!
                              Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

                              Comment

                              Working...
                              X