- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 4 von 4

Thema: Problem beim Vergleichen von Strings (µC -> VB.2005)

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.07.2007
    Alter
    41
    Beiträge
    214

    Problem beim Vergleichen von Strings (µC -> VB.2005)

    Anzeige

    Praxistest und DIY Projekte
    Hallo!

    Folgende Situation:
    Ich schreibe gerade an eier Steuersoftware in VB 2005 mit der ich ein - auf RN-Control umgerüstetes - RC-Fahrzeug über den PC (per RS232) steuern möchte.

    Dazu schicke ich beim Klick auf die verschiedenen Steuer-Buttons in der VB-Steuer-Oberfläche einen entsprechenden 'Kommando-String' an das RN-Control.
    Das RN-Control vergleicht den eingehenden String in einer 'Select Case' - Schleife und schickt das erkannte Kommando zur Kontrolle unverändert an den PC zurück.
    Damit ich jetzt feststellen kann, ob der String korrekt empfangen wurde und die entsprechenden Aktionen ausführen kann, vergleiche ich jetzt den vom RN-Control zurückgelieferten String mit einer 'Select Case'-Abfrage im Steuer-Programm.

    Was schon funktioniert:
    Der vom PC gesendete Kommando-String wird vom RN-Control empfangen und per 'Select Case' der entsprechende Programmpfad ausgeführt. D.h. beim RN-Control funktioniert der Vergleich problemlos.

    Was nicht funktoiniert:
    Der String den mir das RN-Control zurückliefert, wird in meiner 'Select Case'-Abfrage nicht erkannt.
    Wenn ich mir den String z.B. per MessageBox anzeigen lasse, wird mir aber eine absolut korrekte Zeichenfolge angezeigt.
    Jetzt wüsste ich gerne, wie ich den eingehenden String richtig in meiner 'Select Case'-Schleife richtig abfragen kann.

    Der Code im RN-Control ist dieser: (das ist ein kleines Test-Programm, damit es übersichtlicher für euch ist)

    Code:
    $regfile "m32def.dat"
    $crystal = 16000000
    $framesize = 32
    $hwstack = 32
    $swstack = 32
    $baud = 19200
    
    '======================================================
    'Konfigurationen
    '======================================================
    
    Config Serialin = Buffered , Size = 180
    Config Serialout = Buffered , Size = 180
    
    
    '========================
    ' Deklarationen
    '========================
    
    Dim InString as String * 25
    Dim InByte as Byte
    
    InString = ""
    InByte = 255
    
    Enable Interrupts
    
    '=======================
    'Hauptprogramm
    '=======================
    
    Do
       Do
          InByte = inkey()
          If InByte <> 0 then
             InString = Instring + chr(InByte)
          End if
       Loop until InByte = 0
    
       InByte = 255
    
       Select case InString
          case "MOVE_FWD_R"
             Print InString
          case "MOVE_STOP"
             print InString
          case "SWITCH_LIGHT_AUTO_ON"
             print InString
          case else
       End select
       InString = ""
       waitms 100                                               'wieso gehts nur hiermit?
    Loop
    Und mein VB-Programm (Ausschnitt aus der Entsprechnung zum o.g. Test-Programm) hat folgenden Code:

    Code:
        Dim InString As String = "nix"
        Dim OutString As String = "nix"
            
        Private Sub bsSenden1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bsSenden1.Click
            OutString = "MOVE_FWD_R"
            SerialPort1.Write(OutString)        
        End Sub
    
        Private Sub bsSenden2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bsSenden2.Click
            OutString = "MOVE_STOP"
            SerialPort1.Write(OutString)        
        End Sub
    
        Private Sub bsSenden3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bsSenden3.Click
            OutString = "SWITCH_LIGHT_AUTO_ON"
            SerialPort1.Write(OutString)        
        End Sub
    
        Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
            InString = SerialPort1.ReadLine()
    
            Select Case InString
                Case "MOVE_FWD_R"
                    MessageBox.Show(InString + " wurde per 'Case' erkannt!")
                Case "MOVE_STOP"
                    MessageBox.Show(InString + " wurde per 'Case' erkannt!")
                Case "SWITCH_LIGHT_AUTO_ON"
                    MessageBox.Show(InString + " wurde per 'Case' erkannt!")
            End Select
                End Sub
    Das VB-Programm hab ich auch nochmal als komplettes VB.2005-Projekt angehängt.

    Ich hoffe ihr könnt mir hier weiterhelfen.
    Ich hab jede mir bekannte Methode versucht das richtig zu vergleichen, aber nichts hat funktioniert.
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von marvin42x
    Registriert seit
    02.08.2005
    Ort
    Berlin
    Alter
    76
    Beiträge
    703
    Das sieht auf den ersten Blick ganz gut aus.
    Wenn du unter dem letzten Case aber vor End Select noch ein Case Else einfügst kannst Du dort alles abfangen und verarbeiten was die case oben nicht interessiert hat. Da kannst du den Inhalt von InString z.B. noch mal ausgeben oder eine Fehlermeldung.

    Insgesamt würde ich mal im Debug mode am Anfang der sub einen Breackpoint setzen und das Ding mit F8 im Einzellschritt durchgehen.
    Dabei kannst du wenn du mit der Maus die Variable InString anklickst sehen was sie enthält.
    Dort achte mal bei der Darstellung bitte darauf ob der angezeigte String vorne Und!! Hinten seine Gänsefüsschen hat „
    Es gibt manchmal den Fall das ein unsichtbares Zeichen am Ende versteckt ist was du erst löschen musst.
    Diesen Fall stöberst du auf in dem du auf die Gänsefüsschen achtest. Das ist nämlich dann verschwunden.
    Der Messagebox ist das ega die zeigt alles brav an ohne murren und knurren.

    Das wäre so eine Zeile mit der du das letzte Zeichen löschst.
    Wobei ich InString mal als String annehme, wie du ihn ja auch oben global deklariert hast.

    InString = InString.Trim.Remove(Instring.Trim.Length - 1, 1) 'Am Ende ein unsichtbares Zeichen killen

    Vielleicht hilft dir das weiter.

    Netter Gruss
    Die ersten zehn Millionen Jahre waren die schlimmsten. Und die zweiten Zehn Millionen Jahre, die waren auch die schlimmsten.url

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    30.07.2007
    Alter
    41
    Beiträge
    214
    Dein Tipp mit dem 'Remove'-Befehl war tatsächlich fast die Lösung für mein Problem!

    Es funktioniert, aber nur dann, wenn man den Befehl ohne das "Trim" verwendet, also:
    InString = InString.Remove(InString.Length-1,1)

    Mit 'InString.Trim.Length' nimmt er mir das letzte sichtbare Zeichen meines Strings weg und die Anführungzeichen am Ende verschwinden auch.
    Ohne 'Trim' klappt es perfekt!

    Zuerst hatte ich es mit 'InString.Replace(chr(13),Nothing) versucht, aber das hat auch nicht funktoniert.

    Eine Frage, eine Antwort, ein Treffer....ich bin absolut begeistert! \/

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von marvin42x
    Registriert seit
    02.08.2005
    Ort
    Berlin
    Alter
    76
    Beiträge
    703
    Danke für die Rückmeldung.

    das freut mich natürlich sehr, dass das weitergeholfen hat.
    Zum Glück bist Du ja flexibel genug gewesen die Beispielzeile umzubauen.
    Da muss ich selbst mal gucken warum ich das in meinem Fall so gemacht habe.
    Ich hatte das auf die schnelle aus meinem Programm rausgefischt weil ich dort in einer case Anweisung ein ähnliches Problem hatte.

    Netter Gruß
    Die ersten zehn Millionen Jahre waren die schlimmsten. Und die zweiten Zehn Millionen Jahre, die waren auch die schlimmsten.url

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests