Das hast du ja im Prinzip auch schon so gemacht.
Ja, aber es funktioniert noch nicht richtig.
Also hier noch mal der Code den ich bis jetzt habe:
Bascom:
Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32
Config Portd.7 = Output
Config Pind.2 = Input ' Signal 1(a) vom RC-Empfänger
Config Pind.3 = Input ' Signal 2(b) vom RC-Empfänger
Config Portc.6 = Output 'Motor links
Config Portc.7 = Output 'Motor links
Config Portb.0 = Output 'Motor rechts
Config Portb.1 = Output 'Motor rechts
Config Portd.4 = Output 'PWM links
Config Portd.5 = Output 'PWM rechts
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
Config Serialin = Buffered , Size = 20
Config Serialout = Buffered , Size = 1
Enable Interrupts
Dim Data_available As Byte
Data_available = 0
Dim Adresse As String * 255
Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2
Do
Data_available = Ischarwaiting()
If Data_available > 0 Then 'wenn Daten da sind, dann...
Input Adresse
'Print Adresse
End If
Select Case Adresse
Case "20"
Portc.6 = 0
Portc.7 = 1
Portb.0 = 1
Portb.1 = 0
Pwm1a = 500
Pwm1b = 500
Print "Vor"
Case "30"
Portc.6 = 1
Portc.7 = 0
Portb.0 = 0
Portb.1 = 1
Pwm1a = 500
Pwm1b = 500
Print "Ruek"
Case "40"
Portc.6 = 1
Portc.7 = 0
Portb.0 = 1
Portb.1 = 0
Pwm1a = 600
Pwm1b = 600
Print "links"
Case "50"
Portc.6 = 0
Portc.7 = 1
Portb.0 = 0
Portb.1 = 1
Pwm1a = 600
Pwm1b = 600
Print "rechts"
Case Else
Portc.6 = 0
Portc.7 = 0
Portb.0 = 0
Portb.1 = 0
Pwm1a = 50
Pwm1b = 50
Print "Stopp"
End Select
Loop
End
Und VB:
Code:
Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Control.CheckForIllegalCrossThreadCalls = False
Buffer = (SerialPort1.ReadExisting)
'Die Textbox heißt Terminal und die Daten werden dort
'hineinkopiert()
Term.AppendText(Buffer)
Term.ScrollToCaret()
End Sub
Private Sub vor_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles vor.MouseDown
Control.CheckForIllegalCrossThreadCalls = False
SerialPort1.DiscardOutBuffer()
adr = 2
SerialPort1.WriteLine("20" + vbCr)
End Sub
Private Sub vor_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles vor.MouseUp
Control.CheckForIllegalCrossThreadCalls = False
SerialPort1.DiscardOutBuffer()
adr = 1
SerialPort1.WriteLine("10" + vbCr)
End Sub
Private Sub rüc_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles rüc.MouseDown
Control.CheckForIllegalCrossThreadCalls = False
SerialPort1.DiscardOutBuffer()
adr = 3
SerialPort1.WriteLine("30" + vbCr)
End Sub
Private Sub rüc_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles rüc.MouseUp
Control.CheckForIllegalCrossThreadCalls = False
SerialPort1.DiscardOutBuffer()
adr = 1
SerialPort1.WriteLine("10" + vbCr)
End Sub
Private Sub lin_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lin.MouseDown
Control.CheckForIllegalCrossThreadCalls = False
SerialPort1.DiscardOutBuffer()
adr = 4
SerialPort1.WriteLine("40" + vbCr)
End Sub
Private Sub lin_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles lin.MouseUp
Control.CheckForIllegalCrossThreadCalls = False
SerialPort1.DiscardOutBuffer()
adr = 1
SerialPort1.WriteLine("10" + vbCr)
End Sub
Private Sub rec_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles rec.MouseDown
Control.CheckForIllegalCrossThreadCalls = False
SerialPort1.DiscardOutBuffer()
adr = 5
SerialPort1.WriteLine("50" + vbCr)
End Sub
Private Sub rec_MouseUp(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles rec.MouseUp
Control.CheckForIllegalCrossThreadCalls = False
SerialPort1.DiscardOutBuffer()
adr = 1
SerialPort1.WriteLine("10" + vbCr)
End Sub
Das Problem ist jetzt, dass wenn ich den Roboter anschalte, dieser mir sofort eine endlose Reihe Stopp sendet. Sobald ich die Tste vor z.B. drücke fährt er kurz nach vorne und wenn ich jetzt wieder loslasse macht er nichts mehr (also setzt die Stoppreihe nicht fort). Wenn ich jetzt noch mal nach vorne Drücke wird mir nur etwas angezeigt, doch will sich der Roboter nicht mehr bewegen. Warum ?? Außerdem dürfte mir der Roboter gar nicht erst diese Stoppreihe senden, da Data_available ja eigentlich 0 ist, da ich noch nichts vorher gesendet habe. Ich hoffe ich konnte euch das Problem richtig erklären.
Dabei bräuchte ich nochmal die Hilfe von euch 
Der Einsteiger
P.s. der Text wurde vor dem von Wsk8 verfasst.
Also hier noch mal die Antworten dazu:
Du liest doch nach jeder Schleife wieder ein neues Zeichen ein und das alte verliert dann seine Gültigkeit.
Genau so will ich es ja.
Ein Char oder byte wäre hier vollkommen ausreichend.
Nur hat es damit leider noch weniger funktioniert.
Die Maus als Trigger nehmen ist auch nicht wirklich schön. Nimm einfach eine Taste, z.b. Pfeiltasten.
Das würde ich ja auch lieber, aber weiß ich nicht mehr wie man Pfeiltasten abfragt.
Außerdem wirst du sicher keine Zeichen vom Roboter empfangen können, solange dein PC-Programm keine Empfangsroutine hat.
Schau mal in diesen Post
Lesezeichen