none
[VB 2010]Wie über SerialPort empfangene Daten nur bestimmt Zeichen anzeigen lassen?? RRS feed

  • Frage

  • So hab da nun ein weiteres Problem^^

    Wie kann man über den SerialPort nur bestimmt Zeichen anzeigen lassen?

    Ich möchte über den Serialport emfangene Daten nur teilweise anzeigen lassen.



    Mal als Beispie:
    Ich bekomme als Antwort: 01 12 23 45 56 78 89 0A 0B 0C 0D 0E
    Ich möchte aber nur: 3 5 6 8 9 A B C D angezeigt bekommen.

    Wie mache ich dies?

    Zum Verständnis ist hier mal ein Auszug vom code:

    Hier konvertiere ich von ASCII  zu HEX:
     Private Function HexToByte(ByVal msg As String) As Byte()
    
      Dim comBuffer As Byte() = New Byte(_msg.Length / 2 - 1) {}
      For i As Integer = 0 To _msg.Length - 1 Step 2
       comBuffer(i / 2) = CByte(Convert.ToByte(_msg.Substring(i, 2), 16))
      Next
      write = True
      Return comBuffer
    
     End Function


    Und hier spreche ich mein Gerät an und lasse mir die ganze Antwort anzeigen:
     Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
      SerialPort1.Write(Chr(&H1) & Chr(&H2) & Chr(&H2) & Chr(&H3) & Chr(&H0) & Chr(&H0) & Chr(&H3D))
      Dim bytes As Integer = SerialPort1.BytesToRead
      Dim comBuffer As Byte() = New Byte(bytes - 1) {}
      SerialPort1.Read(comBuffer, 0, bytes)
      Threading.Thread.Sleep(600)
      Final = ByteToHex(comBuffer) + ""
      TextBox14.Text = (Final)
    
     End Sub


    Sonntag, 27. März 2011 10:22

Alle Antworten

  • Mal als Beispie:
    Ich bekomme als Antwort: 01 12 23 45 56 78 89 0A 0B 0C 0D 0E
    Ich möchte aber nur: 3 5 6 8 9 A B C D angezeigt bekommen.

    Hallo DPlus,

    Erstmals schau Dir mal folgende Links an wie man mit der Seriellen Schnittstelle arbeitet und zeige mal Deinen ganzen Code:

    http://social.msdn.microsoft.com/Search/de-DE/?Refinement=112&query=SerialPort%20AND%20DataReceived

    Die HexToByte Funktion würde ich so umschreiben:

     

     Private Function HexToByte(ByVal msg As String) As Byte()
        Dim strs As String() = msg.Split(" "c)
        Dim bytes(strs.Length - 1) As Byte
    
        For i As Integer = 0 To bytes.GetUpperBound(0) Step 1
          bytes(i) = Convert.ToByte(strs(i), 16)
        Next i
    
        Return bytes
      End Function
    

    Schau Dir mal die folgenden Links an. Vielleicht können sie Dir weiter helfen.

    Regular expression

    String.Contains-Methode

    PS: In Deine Code Beispiele die Du gepostet hast sehe ich eine HexToByte Funktion aber auch eine Zeile mit: Final = ByteToHex(comBuffer) + ""

    Grüße,

    Robert

    Dienstag, 29. März 2011 17:21
  • Hallo Robert,

     

    danke erstmal für die Links, die werde ich sofort mal durchgehen.

    Ich habe vor 3 Wochen erst mit Visual Basic angefangen und wollte mal "eben" für den Anfang eine Anwendung machen mit der ich meine selbst gebautes Kartenlesegerät ansteuern kann.

     

    Ja die HexToByte ist momentan noch nicht so wichtig, war ein Fehler von mir beim Posten ;)
    Die ist momentan noch ohne Funktion.

    ich nutze die ByteToHex Funktion um die erhaltenen Daten der Karte in Hex umzuwandeln.

      Private Function ByteToHex(ByVal comByte As Byte()) As String
        Dim builder As New StringBuilder(comByte.Length * 3)
        For Each data As Byte In comByte
          builder.Append(Convert.ToString(data, 16).PadLeft(2, "0"c).PadRight(3, " "c))
        Next
    
        Return builder.ToString().ToUpper()
      End Function
    

    Stehe momentan aber noch vor mehreren Problemen^^

    Ich habe jetzt noch so, wenn ich einen String zur Karte sende, dass ich immer noch den String den ich sende angezeigt bekomme und den Inhalt aus aus dem Schritt davor.

    Also führe ich einen Reset aus dann bekomme ich von der Karte den ATR gemeldet.
    Sende ich nun einen String zur Karte bekomme ich die Zeichen die ich gesendet habe und nochmal de ATR.
    Führe ich den Schritt nun noch einmal aus, kommt der gesendete String und die zu erwartende Antwort.

    Hier mal mein ganzer Code.
    Nicht wundern, dürfte für Fortgeschrittene bestimmt Chaotisch aussehen^^

    Aber wie gesagt ich lerne ja gerade erst alles.

     

    Public Class Form1
      Private _msg As String
      Private write As Boolean = True
    
    
    #Region "HexToByte"
    
      Private Function HexToByte(ByVal msg As String) As Byte()
    
        Dim comBuffer As Byte() = New Byte(_msg.Length / 2 - 1) {}
        For i As Integer = 0 To _msg.Length - 1 Step 2
          comBuffer(i / 2) = CByte(Convert.ToByte(_msg.Substring(i, 2), 16))
    
        Next
        write = True
        Return comBuffer
    
      End Function
    #End Region
    
    
    #Region "ByteToHex"
    
      Private Function ByteToHex(ByVal comByte As Byte()) As String
        Dim builder As New StringBuilder(comByte.Length * 3)
        For Each data As Byte In comByte
          builder.Append(Convert.ToString(data, 16).PadLeft(2, "0"c).PadRight(3, " "c))
        Next
    
        Return builder.ToString().ToUpper()
      End Function
    #End Region
    
    #Region "Verbinden"
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
        Try
          SerialPort1.PortName = TextBox28.Text
          SerialPort1.BaudRate = TextBox31.Text
          SerialPort1.Open()
    
          Button1.Enabled = False
          Button2.Enabled = True
          Button3.Enabled = True
          Button4.Enabled = True
          Button4.Enabled = True
          Button5.Enabled = True
          Button6.Enabled = True
          Button7.Enabled = True
    
    
        Catch ex As Exception
          MsgBox("Verbindung zum Reader konnte nicht hergestellt werden")
    
        End Try
      End Sub
    #End Region
    
    #Region "Beenden"
      Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        ' Beenden und Schnittstelle schließen fals offen
        If SerialPort1.IsOpen = True Then
          SerialPort1.Close()
        End If
      End Sub
    #End Region
    
    
    #Region "Senden und empfangen"
      Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    
    
        SerialPort1.Write(Chr(&H1) & Chr(&H2) & Chr(&H2) & Chr(&H3) & Chr(&H0) & Chr(&H0) & Chr(&H3D))
        Dim bytes As Integer = SerialPort1.BytesToRead
        Dim comBuffer As Byte() = New Byte(bytes - 1) {}
        Threading.Thread.Sleep(1000)
        SerialPort1.Read(comBuffer, 0, bytes)
        Threading.Thread.Sleep(1000)
    
    
        Dim Final2 As String
        Final2 = ByteToHex(comBuffer) + ""
        TextBox40.Text = (Final2)
    
     
    #Region "Schnittstelle schließen und Buttons Sperren"
      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    
        SerialPort1.Close()
    
        Button1.Enabled = True
        Button2.Enabled = False
        Button3.Enabled = False
        Button4.Enabled = False
        Button4.Enabled = False
        Button5.Enabled = False
        Button6.Enabled = False
        Button7.Enabled = False
      End Sub
    
    #End Region
    
    #Region "Reset auslösen und ATR anzeigen"
      Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    
    
        SerialPort1.RtsEnable = True
        SerialPort1.DtrEnable = True
        SerialPort1.RtsEnable = False
        SerialPort1.DtrEnable = False
        Dim bytes As Integer = SerialPort1.BytesToRead
        Dim comBuffer As Byte() = New Byte(bytes - 1) {}
    
        Threading.Thread.Sleep(1000)
        SerialPort1.Read(comBuffer, 0, bytes)
    
        Dim Final As String
        Final = ByteToHex(comBuffer) + ""
        TextBox1.Text = (Final)
    
    
    
      End Sub
    #End Region
    
    
    End Class
    

    Gruß

    Richy

    Mittwoch, 30. März 2011 13:27