Ja ,jetzt erscheint beim debug das :
Anhang 24956
Druckbare Version
Ja ,jetzt erscheint beim debug das :
Anhang 24956
Ja passt doch. Er kriegt in der geforderten Zeit kein CR&LF und bricht ab. Wäre das Error handling (das mit dem Try) jetzt nicht auskommentiert, würde dein Programm sauber weiter laufen.
Dann kommentier das Timeout mal wieder aus und sende ihm irgendwas von mir aus
Print ("Hallo")
Dann müsste eigentlich in TextBox3 "Hallo" stehen.
Also ich habe jetzt das Timeout entfernt aber das Try noch nicht eingebaut.
Jetzt habe ich einfach einen Code für den MC mit Print einmal pro Sekunde "Hallo" geschrieben.
Doch kann ich wenn ich das vb Prog debug gemacht habe nur einmal den Button 4 drücken und da erscheint nur einmal Hallo.
Doch liegt das wahrscheinlich daran ,dass es immer in der ersten Zeile ausgegeben wird un dich da nur keinen Unterschied sehen kann.Oder ??
Jetzt habe ich mal diesen Code für den MC genommen:
Doch wenn ich den angezeigt bekommen möchte funktionier das mit dem Button nicht (er wartet wieder ewig).Code:$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32
Config Portd.7 = Output
Config Portc.2 = Output
Config Portc.5 = Output
Portc.2 = 1
Portc.5 = 1
Dim Wort As Byte
Wait 1
Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2
Main:
Waitms 500
Input "?" , Wort
Select Case Wort
Case 1
Waitms 10
Portc.5 = 0
Print "An"
Waitms 500
Case 0
Waitms 10
Portc.5 = 1
Print "Aus"
Waitms 500
Case 3
Waitms 10
Portc.2 = 0
Print "An"
Waitms 500
Case 2
Waitms 10
Portc.2 = 1
Print "Aus"
Waitms 500
Case Else
Waitms 10
Print "Fehler"
Waitms 10
End Select
Goto Main
Meine Vermutung :Liegt es an dem Input Befehl ???
Ja der MC wartet auf ein Zeichen und VB auch. Da wird nichts passieren.
Nimm den Input und das Select case mal weg. Mach doch erstmal was einfaches ohne viel SchnickSchnack.
Print "An"
waitms 500
Print "Aus"
waitms 500
Das Packst du in eine While oder Loop und guckst ob sich der text in VB alle 500ms ändert.
Das habe ich ja ausprobiert gehabt. So bald ich ein zweites mal den Button drücke wartet er und es kommt nichts neues.
Wenn ich dann den Button für die LED an drücke ,kommt als Fehlermeldung ,dass der Port schon belegt sei.
Das hast du aber nicht geschrieben. Der MC Code den du gepostet hast sagt auch was anderes. Hast du das wirklich in einer Loop gehabt? Das er immer wieder "An" und "Aus" sendet?
Ja ich habe ja vorher den MC Code geändert :
Code:$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32
Config Portd.7 = Output
Wait 1
Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2
Do
Print "An"
Waitms 500
Print "Aus"
Waitms 500
Loop
End
Und da schreibt er wenn du Button4 clickst nur einmal "An" in die TextBox3?
Falscher Alarm. Ich habe es jetzt noch mal gründlicher getestet und es hat funktioniert. Doch kann es vielleicht sein ,dass es nicht sofort angezeigt wird/reagiert ???
Dann ginge es jetzt nur noch darum wie ich es unabhängig , ohne das Senden vom Pc aus zu beeinflussen, hinbekomme ??
Kann durchaus sein das es verzögert und unregelmäßig ankommt. Windows ist kein Echtzeit Betriebssystem und wenn es was wichtigeres/anderes zutun hat muss dein Programm eben warten bis Windows wieder zeit hat.
Aber wie??Zitat:
Dann ginge es jetzt nur noch darum wie ich es unabhängig , ohne das Senden vom Pc aus zu beeinflussen, hinbekomme ??
Mit einem Timer??
Ja z.B. oder mit Pause befehlen. Was da besser ist weiss ich aber auch nicht.
Heute fällt mir dazu aber auch nichts mehr ein.
Ist verständlich. :) Aber Danke schon mal für das was schon war.
Wäre aber nett wenn du irgendwann noch mal drüber nachdenkst, wenn du Zeit hast.
Eine Möglichkeit, wäre es mit 2 Timern zu machen.
Aber ich würde mal etwas Googlen. Du bist ja nicht der erste der sowas vor hat.
Ich glaube , ich habe was gefunden : (https://www.roboternetz.de/community...Basic+controll)
Also ich meine das:
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If SerialPort1.BytesToRead > 0 Then
Do
TextBox4.AppendText(Chr(SerialPort1.ReadByte))
TextBox4.ScrollToCaret()
If SerialPort1.BytesToRead = 0 Then
Exit Do
End If
Loop
End If
End Sub
Ja das sieht gut aus.
Das senden machst du dann per Button?
Bei der Textbox musst du mal gucken ob du die als Multiline textbox definieren musst. Sonst stellt der immer nur eine Zeile da.
Ja ,erst mal schon.Zitat:
Das senden machst du dann per Button?
Dann probiere ich es mal aus.
- - - Aktualisiert - - -
Also ,ich habe es jetzt getestet. Mit Bascom EMU hat es funktioniert ,mit VB aber nicht (es wurde nichts angezeigt) ,aber es kam auch keine Fehlermeldung.
Muss ich irgendwie noch am Anfang de Programms den Timer staten oder einstellen??
Bei Form habe ich rechts bei den Einstellung auf Enabled = False , Generate Member = True , Interval = 100 eingestellt .Stimmt das so ??
Du musst den Timer noch enablen. Also entweder mit nem Button oder direkt in den Einstellungen auf True stellen. Sonst läuft der nicht und deine Timer routine wird nie gestartet.
Klinkt logisch.Aber jetzt kommt beim debug wieder das :
Anhang 24963
Steht doch da. "Der Anschluss ist geschlossen."
SerialPort1.Open() am anfang der Timer routine und
SerialPort1.Close() am ende.
Dann sagt er mir das der Com 1 nicht vorhanden ist. So habe ich also noch das davor geschrieben:
SerialPort1.PortName = TextBox1.Text
SerialPort1.BaudRate = TextBox2.Text
Doch dann sagt er mir ,menn ich auf den Verbinden Button gedrückt habe:
PortName kann nicht bei geöffnetem Anschluss festgelegt werden.
Was jetzt???
Wie gut das ich schon aufgehört habe Deine Fragen und Antworten zu lesen....bis jetzt.
Hast Du Port 1 oder 10? Mal schreibst Du so, dann wieder so...
Also Du kannst keinen Port auswählen den Du schon anderweitig geöffnet hast oder mehrfach öffnen willst ... und schon garnicht einen der nicht vorhanden ist bzw an dem nicht die Zielhardware angeschlossen ist.
Der Daniel beweist ziemliche Geduld mit Dir. Ein großes Lob.
COM 1 ist ja auch nicht vorhanden! Dann musst du den Timer mit einem Button enablen und erst den Comport, Baudrate etc zuweisen.
Ich helf ihm alleine! Ich wäre froh wenn hier noch einer helfen würde! :p
Also erst mal zu HeXPloreR :
Das finde ich auch ,einen großen Dank.Zitat:
Der Daniel beweist ziemliche Geduld mit Dir. Ein großes Lob.
Also bei mir ist es Com 10. Doch hat mir das Programm gesagt dass es bei Com1 nicht gefunden hat ,da ich bei dieser Sub vergessen habe den Eingang du deklarieren.Zitat:
Hast Du Port 1 oder 10? Mal schreibst Du so, dann wieder so...
Zu Daniel:
Wie genau ??Zitat:
Dann musst du den Timer mit einem Button enablen und erst den Comport, Baudrate etc zuweisen.
So ??:::
Zur Erklärung des Codes : die Checkboxen musst du nicht beachten.Code:Imports System.IO.Ports.SerialPort
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
SerialPort1.PortName = TextBox1.Text
SerialPort1.BaudRate = TextBox2.Text
SerialPort1.Open()
Button1.Enabled = False
Button2.Enabled = True
Button3.Enabled = True
CheckBox1.Enabled = True
CheckBox2.Enabled = True
Catch ex As Exception
MsgBox("Verbindung konnte nicht hergestellt werden")
End Try
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If SerialPort1.IsOpen = True Then
SerialPort1.Close()
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SerialPort1.Write("1" & vbCr)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
SerialPort1.Write("0" & vbCr)
End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
Label1.Text = "LED1 ist an"
SerialPort1.Write("1" & vbCr)
Else
Label1.Text = "LED1 ist aus"
SerialPort1.Write("0" & vbCr)
End If
End Sub
Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged
If CheckBox2.Checked = True Then
Label2.Text = "LED2 ist an"
SerialPort1.Write("3" & vbCr)
Else
Label2.Text = "LED2 ist aus"
SerialPort1.Write("2" & vbCr)
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
SerialPort1.PortName = TextBox1.Text
SerialPort1.BaudRate = TextBox2.Text
SerialPort1.Open()
If SerialPort1.BytesToRead > 0 Then
Do
TextBox3.AppendText(Chr(SerialPort1.ReadByte))
TextBox3.ScrollToCaret()
If SerialPort1.BytesToRead = 0 Then
Exit Do
End If
Loop
End If
SerialPort1.Close()
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Timer1.Enabled = True
End Sub
End Class
Ja so. Probier es doch auch einfach mal aus bevor du hier was fragst. Try and Error ist auch eine Methode zu lernen!
Hab mich wohl verlesen. Sehe jetzt auch das Wort "beiden" nicht mehr.
Also ich hab das jetzt einfach mal getestet ,aber es wird wieder das angezeigt:
Lies doch mal die Fehlermeldung!!! Da steht doch ganz klar was nicht in Ordnung ist!
Ok, habe jetzt mal das gemacht ,was du gesagt hast (mit selber ausprobieren )
Und : Jetzt funktioniert es.
Doch eine Frage : Muss ich den Timer wieder ausschalten ,wenn ich was vom PC aus senden möchte ,oder kann ich trotzdem Empfangen und auch gleichzeitig senden ???
Code:Imports System.IO.Ports.SerialPort
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
SerialPort1.PortName = TextBox1.Text
SerialPort1.BaudRate = TextBox2.Text
SerialPort1.Open()
Button1.Enabled = False
Button2.Enabled = True
Button3.Enabled = True
CheckBox1.Enabled = True
CheckBox2.Enabled = True
Catch ex As Exception
MsgBox("Verbindung konnte nicht hergestellt werden")
End Try
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
If SerialPort1.IsOpen = True Then
SerialPort1.Close()
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
SerialPort1.Write("1" & vbCr)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
SerialPort1.Write("0" & vbCr)
End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
If CheckBox1.Checked = True Then
Label1.Text = "LED1 ist an"
SerialPort1.Write("1" & vbCr)
Else
Label1.Text = "LED1 ist aus"
SerialPort1.Write("0" & vbCr)
End If
End Sub
Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged
If CheckBox2.Checked = True Then
Label2.Text = "LED2 ist an"
SerialPort1.Write("3" & vbCr)
Else
Label2.Text = "LED2 ist aus"
SerialPort1.Write("2" & vbCr)
End If
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If SerialPort1.BytesToRead > 0 Then
Do
TextBox3.AppendText(Chr(SerialPort1.ReadByte))
TextBox3.ScrollToCaret()
If SerialPort1.BytesToRead = 0 Then
Exit Do
End If
Loop
End If
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Timer1.Enabled = True
End Sub
End Class
Probier es doch aus! ;-)
Siehst du jetzt bist du in der Lage Probleme selbst zu lösen. Das war mein eigentliches Ziel! Nicht das deine Kommunikation läuft. ;-)
Na gut ,dann versuch ich es mal . Aber Danke für deine Hilfe und die riesige Geduld (hat mir geholfen ) :)
Falls ich wichtige Fragen habe melde ich mich aber noch mal.
- - - Aktualisiert - - -
Sehe ich das richtig ,dass wenn ich nicht nur Bytes lesen will ,sondern auch Zeichen oder Text ,ich statt "TextBox3.AppendText(Chr(SerialPort1.ReadByte) )" einfach nur "TextBox3.AppendText(Chr(SerialPort1.Read))" schreiben muss ???
Doch sagt er mir dann das: "Fehler :Fehler bei der Überladungsauflösung, da keine zugreifbare "Read" diese Anzahl von Argumenten akzeptiert "
Doch weiß ich jetzt nicht ,was das bedeuten soll ??
Dafür habe ich schon erste Erfolge bei der Steuerung über die Pfeiltasten zu melden. Wenn gewünscht ,kann ich die weiteren Versuche von mir hier zeigen (für andere Anfänger oder so)
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
If SerialPort1.BytesToRead > 0 Then
Do
TextBox3.AppendText(Chr(SerialPort1.ReadByte))
TextBox3.ScrollToCaret()
If SerialPort1.BytesToRead = 0 Then
Exit Do
End If
Loop
End If
End Sub
Uiuiuiuiuiuiuiuiui
Bevor du das liest setz dich hin! Du hast ja sooooo ein glück das ich das jetzt selbst brauche, das ichs selbst kaum fassen kann. :-D
Ich habe eine geile Methode gefunden wie du die Daten per Event von der seriellen Schnittstelle liest! Das ist viiiiiieeeeel besser als es mit einem Timer zu machen.
Ich versuchs mal Step by Step (rot ist was du einfügen musst das andere steht da nur damit du weisst wohin):
Das hier in den Form Load EventCode:Public Class Form1
Delegate Sub TextBoxCallback(ByVal text As String)
Code:Me.SerialPort1.DtrEnable = True
Me.SerialPort1.ReceivedBytesThreshold = 1
Damit müsste jetzt in TextBox1 der Text der an der seriellen Schnitte ankommt angezeigt werden.Code:Private Sub serial_event(sender As Object, e As EventArgs) Handles SerialPort1.DataReceived
Dim msg As String = Me.SerialPort1.ReadExisting
Me.ShowText(msg)
End Sub
Private Sub ShowText(ByVal text As String)
If Me.TextBox1.InvokeRequired Then
Dim d As New TextBoxCallback(AddressOf ShowText)
Me.Invoke(d, New Object() {text})
Else
Me.TextBox1.AppendText(text)
Me.TextBox1.SelectionStart = Me.TextBox1.Text.Length
Me.TextBox1.ScrollToCaret()
End If
End Sub
End Class
Mein MC ist mit Arduino programmiert.
Code:int led = 13;
long i = 0;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
Serial.begin(9600);
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
delay(100); // wait for a second
digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
delay(100); // wait for a second
i++;
Serial.println(i);
}
Hallo Leute,
ich wollte mal wieder hier weitermachen und habe auch nun schon einige Stunden in die Programmierung gesteckt (bevor ich euch wieder mit Fragen nerve), doch bekomme ich keine richtige Kommunikation hin.
Also ich sage jetzt nochmal, was mein Ziel ist:
Ich möchte einen Roboter, der über ein serielles Funkmodul am PC hängt und von diesem aus gesteuert werden soll. Dazu möchte ich zunächst über 4 Tasten die Motoren des Roboters steuern. Wenn ich z.B. die Taste Vor drücke soll er so lange Vor fahren, bis ich die Taste nicht mehr drücke.
Des weiteren möchte ich später auch noch den Status des Roboters abfragen können usw...
Um diese Funktionen zu bewerkstelligen habe ich mir folgendes überlegt: Ich sende um es für den Anfang möglichst einfach zu halten ein Byte an den Roboter (also 255 Befehle sind möglich). Dieser schaut ab und zu mal in seinen Eingang und sagt ob etwas vorliegt. Wenn etwas vorliegt, soll er dies tun, und ansonsten mit seinem anderen Programm weitermachen.
Doch habe ich es noch nicht so richtig hinbekommen ein Programm sowohl für den Roboter als auch für den PC zu schreiben.
Mein Ansatz für den Roboter wäre :
und für den PC:Code:Config Serialin = Buffered , Size = 20
Config Serialout = Buffered , Size = 1
Enable Interrupts
Dim Data_available As Byte
Dim Adresse As String * 255
Do
Data_available = Ischarwaiting()
If Data_available > 0 Then 'wenn Daten da sind, dann...
Input Adresse
Waitms 2
Print Adresse
End If
Loop
End
Doch das geht nicht so wirklich. Wie würdet ihr das machen ??Code: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("2" + 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("1" + vbCr)
End Sub
Ich hoffe ihr wollt mir noch helfen, auch wenn das Thema schon älter ist.
p.s. Danke auch noch mal an DanielSan. (Das habe ich erst jetzt gesehen) :)
Äh ich hab dir doch in Post #72 alles gegeben was du dafür brauchst!?
Das mit dem Vorwärts fahren wenn eine Taste gedrückt wird würde ich mit Events machen. Also einen Event wenn die Taste gedrückt wird und einen wenn sie wieder losgelassen wird. Dann schickst du bei ButtonDown ein Startzeichen an den Bot und bei ButtonUp ein Stopzeichen. Das hast du ja im Prinzip auch schon so gemacht.
Du liest doch nach jeder Schleife wieder ein neues Zeichen ein und das alte verliert dann seine Gültigkeit. Ein Char oder byte wäre hier vollkommen ausreichend.Code:Dim Adresse As String * 255
Die Maus als Trigger nehmen ist auch nicht wirklich schön. Nimm einfach eine Taste, z.b. Pfeiltasten.
Außerdem wirst du sicher keine Zeichen vom Roboter empfangen können, solange dein PC-Programm keine Empfangsroutine hat. Es kann entweder das Terminal auf den Port zugreifen oder dein Programm, aber nicht beides!
mfg
Ja, aber es funktioniert noch nicht richtig.Zitat:
Das hast du ja im Prinzip auch schon so gemacht.
Also hier noch mal der Code den ich bis jetzt habe:
Bascom:
Und VB: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
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.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
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:
Genau so will ich es ja.Zitat:
Du liest doch nach jeder Schleife wieder ein neues Zeichen ein und das alte verliert dann seine Gültigkeit.
Nur hat es damit leider noch weniger funktioniert.Zitat:
Ein Char oder byte wäre hier vollkommen ausreichend.
Das würde ich ja auch lieber, aber weiß ich nicht mehr wie man Pfeiltasten abfragt.Zitat:
Die Maus als Trigger nehmen ist auch nicht wirklich schön. Nimm einfach eine Taste, z.b. Pfeiltasten.
Schau mal in diesen Post :)Zitat:
Außerdem wirst du sicher keine Zeichen vom Roboter empfangen können, solange dein PC-Programm keine Empfangsroutine hat.
Das ist kein Problem, sondern steht genauso in deinem Code.Zitat:
Das Problem ist jetzt, dass wenn ich den Roboter anschalte, dieser mir sofort eine endlose Reihe Stopp sendet.
Du solltest auch die Empfangsvariable nach jeder Schleife wieder leeren, damit sich da sicher nichts aufaddiert und wirklich immer nur das letzte, empfangene Zeichen drin ist.Zitat:
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 du "20" etc sendest, dann ist das auch kein char mehr, sonder 2 char. Wenn du dann sogar noch ein CR sendest, sinds sogar 3 Zeichen.Zitat:
Genau so will ich es ja.
Ein Char oder byte wäre hier vollkommen ausreichend.
Nur hat es damit leider noch weniger funktioniert.
mfg
Wenn ich nun den Code ausführt und die Taste drücke, zeigt er mir das an:
Stopp
Stopp
Stopp
Stopp
Stopp
Stopp
20
Vor
10
Stopp
20
Stopp
10
Stopp
20
Stopp
bei jedem drücken erscheint ein neues:
10
Stopp
20
Stopp
Bei dem AVR Code habe ich noch Adresse = "0"
Data_available = 0
vor eingefügt.
Also: Es will einfach nicht so funktionieren. Hat denn einer mal so etwas gemacht und kann mir den Code geben?? Das wäre sehr nett.
Dein Dauter Stopp kommt daher, das die Select Anweisung nicht in der If schleife ist, d.h., bekommst du keine daten wird immer ein stopp gesendet.
Zu deinem Problem mit dem erkennen der Zeichen.
Mit Ischarwaiting() frägst du ja nur einen char ab, liest dann aber einen string ein. Dadurch ist nicht sichergestellt, das der ganze String schon übertragen wurde.
Ein Byteweises Einlesen der Zeichen und dann zu einem String zusammenhängen, würde dir hier helfen.
Und erst wenn deine String länge festgestellt wurde (2 Zeichen), dann einmal die Select Anweisung ausführen und ansonsten Warten bis Daten gesendet werden.
Ich habe jetzt eine Möglichkeit gefunden die recht gut funktioniert :) Doch darf ich sie hier leider nicht zeigen, da diese aus dem Buch " Roboter selbst bauen" übernommen wurde (leider).
Ob das was robin in 79 geschrieben hat funktioniert werde ich bei Gelegenheit noch mal prüfen...