PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem beim Vergleichen von Strings (µC -> VB.2005)



Cairol
29.08.2007, 19:22
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)


$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:


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.

marvin42x
30.08.2007, 01:16
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

Cairol
30.08.2007, 12:29
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! \:D/

marvin42x
30.08.2007, 13:23
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ß