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.
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.