PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit VB über FTDI Roboter steuern



Der Einsteiger
25.03.2013, 10:41
Hallo Roboternetzuser,
wie schon in der Überschrift genannt ,möchte ich gerne meinen kleinen Roboter mit RN-Controlboard über einen FTDI (Seriell zu USB) mit Visual Basic 2010 Express steuern. Dazu habe ich mir das Lernpaket :Experimente mit USB angeschafft. Doch lassen sich die dort beschriebenen Beispiele nur ausführen (Anwendung) ,aber ich kann sie nicht ,wie in der Anleitung beschrieben ,einsehen (Code) um sie auf meine Anwendung abzuändern.

Nun habe ich auch schon länger im Internet nach Lösungsansätzen gesucht ,doch bin ich leider nicht fündig geworden.

Deshalb die Frage : Hat einer von euch vielleicht einen funktionierenden Code mit FTDI in Visual Basic 2010 Express zum steuern.

(Senden und Empfangen)
(Habe von VB noch fast keine Ahnung ) :)

Vielen Dank schon mal im Voraus.

DanielSan
25.03.2013, 11:21
Der FTDI sollte dir doch einen COM Port am PC erzeugen. Dann ist das Stichwort für dich "VB Serielle Schnittstelle" oder "VB RS232" oder "VB com" usw. einfach googlen wie man mit VB die serielle Schnittstelle steuert. Das ist nicht sooo besonders schwer. Fertiger Code hilft ja nicht wirklich.

Wenn du mit der seriellen Schnittstelle arbeitest, kann ich dir HTerm empfehlen. Damit kannst du auch von Hand Befehle über den COM Port senden und erstmal gucken ob die Hardware so funktioniert, wie sie soll.

Der Einsteiger
25.03.2013, 16:31
Fertiger Code hilft ja nicht wirklich.
Doch ,würde helfen ,damit ich mal ein komplettes Programm mit Seriell sehe und dann nachvollziehen kann.

Ich habe jetzt mal im Internet gesucht und mehrere Sachen ausprobiert ,doch habe ich unterschiedlichste Fehlermeldungen dabei erhalten.
Bei einem Programm hat sich beim ausprobieren sogar das Programm meines Controllers geändert.

Und noch mal was zum FTDI: Serwohl muss man bei vb bestimmte Lib für den FTDI eintragen ,doch weiß ich leider nicht welche und wie ich so ein Programm dann aufbauen muss.


kann ich dir HTerm empfehlen
Wenn das so eine Art Terminal ist , da verwende ich schon den Terminal Emulator aus Bascom. Trotzdem Danke für den Tipp.

Also Hardware habe ich getestet (mit dem eben genannten Programm) ,aber mit vb will es nicht gehen!

Frage : Hat irgendeiner ein Programm mit serieller Kommunikation (Senden und Empfangen) für mich ,was ich auch einsehen kann ??

DanielSan
25.03.2013, 17:40
Nach ca. 1,0328 Sekunden suche inkl. Suchbegriff in Google eingeben...
http://www.youtube.com/watch?v=1YQM30r8Nuo

Der Einsteiger
25.03.2013, 18:27
schön ,genau das Video habe ich unter anderem schon getestet. Bei diesem Programm habe ich diese Fehlermeldung bekommen:


24936


Was das mit "Eine Ausnahme ...." bedeutet weiß ich nicht und auch nicht wie ich es lösen kann

DanielSan
25.03.2013, 18:47
Mh die Fehlermeldung sagt mir nicht viel. Zeig mal den Quellcode.

Hast du wirklich den richtigen COM Port ausgewählt? Ist der Port wirklich geschlossen? Sonst kannst du ihn nicht öffnen!
Ich schliesse den immer bevor ich ihn öffne. Das unterbricht dann zwar potentiel bestehende Verbindungen, ist mir aber egal.

HeXPloreR
25.03.2013, 18:48
Hallo,

das Tutorial hier http://www.youtube.com/watch?v=1qZO1OtjoJY gehört dazu.

Zeigt das Codefenster hier auch VB-Code an? - dann zeig mal Dein Programm - und zwar beide.

Der Einsteiger
25.03.2013, 18:59
Hier der Code (den habe ich einfach vom Video übernommen) :


Public Class Form1

Private Sub COM1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Try
SerialPort1.PortName = TextBox1.Text
SerialPort1.BaudRate = TextBox2.Text
SerialPort1.Open()
Button1.Enabled = False
Button2.Enabled = True
Button3.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
End Class

Zu DanielSan: Wie hast du das mit dem Com Port vorher schließen gemacht???

HeXPloreR
25.03.2013, 19:16
Du hast die falsche klasse ausgewählt oder nicht? Du hast _Textchanged .... im Video ist es aber _click auf Button1.

Woher hattest Du diese Programm nochmal...
Ist es bei Dir denn auch Com1?
Wenn Du das so schreibst wie hier im Video müsstest Du doch auch ein Click-Event für einen Button1 verwenden? Was _TextChanged anstellt weiß ich leider auch noch nicht....

Kommt denn die Meldung MsgBox?

Der Einsteiger
25.03.2013, 19:32
Du hast die falsche klasse ausgewählt oder nicht? Du hast _Textchanged .... im Video ist es aber _click auf Button1.

Stimmt,Haste Recht.Das habe ich wohl falsch abgeschrieben. ](*,)
Jetzt funktioniert es schon mal ,aber es wird trotzdem das mit " Eine Ausnahme ist in..... aufgetreten" angezeigt. Was das bedeutet weiß ich nicht???


Woher hattest Du diese Programm nochmal...
Was meinst du ??


Ist es bei Dir denn auch Com1?
Nein, es ist Com 10, aber das stört ja nicht ,da ich es umstellen kann.


Kommt denn die Meldung MsgBox?
Was ??


So also hat denn jetzt mal einer einen Code fürs Senden und Empfangen (von Text). Denn wenn ich den Menschen im Video richtig verstanden habe ist sein Code nur zum schalten von einer LED geeignet???

DanielSan
25.03.2013, 19:33
Ich glaube immer wenn du auch nur das geringste in der Textbox änderst, wird das gesendet. Mach es erstmal alles wie im Video.

Das mit dem schliessen sollte so gehen:



Try
SerialPort1.Close()
SerialPort1.PortName = TextBox1.Text
SerialPort1.BaudRate = TextBox2.Text
SerialPort1.Open()
Button1.Enabled = False
Button2.Enabled = True
Button3.Enabled = True
Catch ex As Exception
MsgBox("Verbindung konnte nicht hergestellt werden")
End Try

Wenn es COM10 ist musst du das auch einstellen.

Der Code sendet doch Text! Einmal eine 1 und einmal eine 0. Du hast den Gesamtzusammenhang noch nicht ganz verstanden.

Der Einsteiger
25.03.2013, 19:51
Der Code sendet doch Text! Einmal eine 1 und einmal eine 0. Du hast den Gesamtzusammenhang noch nicht ganz verstanden.
Da hast du Recht. Jetzt habe ich es aber halbwegs verstanden (das Senden ).
Wie könnte ich jetzt aber Sachen Empfangen und in einer Text Box anzeigen lassen ?? Die Sachen, die ich auf Youtube dazu gefunden habe hatten leider auch nicht funktioniert.

Könnt ihr mir da auch helfen??

HeXPloreR
25.03.2013, 19:54
Du hast die Menschen im Video falsch verstanden. Das ist ein einfaches Beispiel.
Übrigens fragte ich Dich auch nach dem Code auf dem AVR. Hier wir nämlich entschieden was passiert wenn eine "1" oder eine "0" oder ein "100" "255" "136" oder "125" rein kommt. Am einfachsten sind Zahlen am besten als Byte bei eine 8N1 Verbindung. Wenn Du mal guckst siehst Du ja das der Button2 nicht "1" heißt sondern "einschalten", das VB-Programm sendet nun eine "1" ab. Der AVR empfängt das ganze mit seinem Programm.
Wäre ja auch etwas unübersichtlich je nach Umfang des Codes wenn man die Buttons einfach nur 1, 2, 3 usw nennen würde.

Wenn man schon weiß das man Com 10 benutzt, sollte man es vielleicht auch in den Code schreiben, damit er auch diesen öffnet. Ansonsten könnte man versuchen den Com zu suchen...aber das ist wieder ein anderes Thema ;)

DanielSan
25.03.2013, 19:58
Das lesen geht fast wie das Schreiben. Such mal nach:

SerialPort1.Read()
in einer SUchmaschine.

Das solltest du jetzt alleine lösen können.

Der Einsteiger
25.03.2013, 20:18
Also zu HeXPloreR : hier der Code :


$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 32

Config Portd.7 = Output ' Summer für das Einschalten und für Fehlermeldungen
Config Portc.5 = Output ' Led die von vb gesteuert wird

Dim Wort As Word

Wait 1
Sound Portd.7 , 400 , 450 'Summer
Sound Portd.7 , 400 , 250 'Summer
Sound Portd.7 , 400 , 450 'Summer
Wait 2

Main:
Waitms 500
Input "?" , Wort

Select Case Wort

Case 1
Waitms 10
Portc.5 = 0
Waitms 500


Case 0
Waitms 10
Portc.5 = 1
Waitms 500

Case Else
Waitms 10
Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Waitms 10

End Select
Goto Main

Ich habe es auch schon mit dem Terminal Emulator und mit vb getestet. Hat funktioniert. Doch hatte ich ein Problem mit dem Summer. Als ich es erst in Bascom ausprobiert habe ,hatte er noch gesummt. Als ich es danach aber bei vb ausprobiert habe hat er nicht mehr gesummt. Dann habe ich es noch mal in Bascom versucht ,aber da wollte er dann auch nicht mehr summen. Nach einem Neubespielen des MC hat es genau so ausgesehen wie davor .Erst hat es in Bascom funktioniert ,sobald ich es aber einmal in vb testete hat es nicht mehr funktioniert. Warum ???????

HeXPloreR
25.03.2013, 20:31
Naja, weil das VB Program einen String über Com sendet... und Dein Bascom Programm ein Word erwartet.
Ausserdem scheint es als wenn Du input direkt den wert "?" zuweist. Was denkst Du macht das Programm wenn es keine 1 oder 0 auswerten kann?
Ausserdem werden die waits innerhalb select case 1 und 0 nicht benötigt. Beim Else kann man das lassen wenn man das möchte

Wie testest Du diese Programm in VB?

Ich würde den ganzen Codeteil mit dem Summer raus nehmen, denn sonst sollte es ja ständig summen - mal kurz unterbrochen wenn du die richtigen Daten sendest. Aber dazu hast Du ja die LED reingeschrieben.

Das von mir gelinkte Video bei 2:18 mal angucken.

Der Einsteiger
25.03.2013, 21:32
Also ich bin es noch mal .
Auch wenn ihr jetzt vielleicht lacht aber ich bekomme das selbst mit dem Empfangen nicht hin .Könnt ihr mir nicht nen kleinen Code schicken ??
Um alle anderen Fragen und so kümmer ich mich Morgen ,denn ich habe jetzt tierisch Kopfschmerzen (sitze seit heute Morgen um 9 Uhr am Rechner und prokel daran rum).

Also bis Morgen....

DanielSan
26.03.2013, 10:24
Ich kann dir nur mit was ungetestetem aushelfen.

Verusch mal das in einen neuen Button mit Click event einzubauen:


dim getText as String

SerialPort1.Open()
getText = SerialPort1.Readline()
SerialPort1.Close()


Damit sollte er alles was am COM Port ankommt bis er ein "\n" bzw. "CR LF" empfängt in die variable getText schreiben. Wie man den Text aus getText in eine Textbox schreibt erklär ich aber nicht. Das kannst du auch selbst googlen. Oder du schaffst die Transferleistung aus deinem Code, wo du die Textbox ausliest bis zum Textbox schreiben.

Gruß Daniel

Der Einsteiger
26.03.2013, 12:33
Danke für den Code ,doch habe ich es immer noch nicht hinbekommen. (Diese Softwaresachen versteh ich einfach nicht so gut)
Ich möchte ja auch nicht erst immer auf eine Taste drücken ,damit mir eine Information angezeigt wird. Ich möchte ja eine Art Terminal Programm haben.
Vielleicht weiß einer wie das geht und kann mir einen Code geben???

DanielSan
26.03.2013, 12:47
Etwas Eigeninitiative musst du schon mitbringen. Es wird sich wohl niemand hier hinsetzen und dir eine fertige Software schreiben. Außer du bezahlst ihn angemessen.

Dann mach es nicht mit nem Button click sondern starte einen Timer der z.b. 4 mal pro sek die serielle Schnitte abruft. Oder lass eine schleife laufen mit wait bzw. pause befehlen drin. Sonst ist dein pc vollständig ausgelastet.


Diese Softwaresachen versteh ich einfach nicht so gut
Das ist doch die Gelegenheit das zu ändern! Bei konkreten Fragen helfe ich gerne weiter.

Der Einsteiger
26.03.2013, 13:37
Es wird sich wohl niemand hier hinsetzen und dir eine fertige Software schreiben
Das stimmt!

Ich habe jetzt mal das gefunden: (http://support.microsoft.com/kb/904795)
Da steht das :

Function ReceiveSerialData() As String
' Receive strings from a serial port.
Dim returnStr As String = ""

Using com1 As IO.Ports.SerialPort = _
My.Computer.Ports.OpenSerialPort("COM1")
Do
Dim Incoming As String = com1.ReadLine()
If Incoming Is Nothing Then
Exit Do
Else
returnStr &= Incoming & vbCrLf
End If
Loop
com1.Close()
End Using

Return returnStr
End Function

Doch weiß ich noch nicht ,wie ich die TextBox einbinde und ob dieser Code für mich überhaupt geeignet ist ,da ich ja gar keine IO.Ports habe , sondern einen USB to Uart Brückentreiber????
Zu der Frage 1 musst du mir nichts sagen ,damit ich auch mal etwas selbst versuche ,wie du es auch schon gesagt hast. Aber zu der Frage 2 wäre es sehr nett ,da ich diese nicht beantworten kann . :)

DanielSan
26.03.2013, 13:57
Der COM Port ist ein IO.Port. Auch bei dir! ;-) Was du an hardware da liegen hast ist egal solange es als COM in Windows erkannt wird.

Was du da gefunden hast ist im Prinzip genau das gleiche wie das was ich dir schon geschrieben habe. Nur das meine Version abgespeckter ist. Das ist einfach nur eine Funktion die alles mitbringt um von der seriellen Schnittstelle zu lesen. Aufrufen musst du sie aber trotzdem noch. Sei es per Button oder alle paar sekunden.

Erstelle doch mal eine zusätzliche Textbox und einen Button. Dann bau dir das so zusammen, das du per Button click was von der seriellen Schnitte lesen kannst. Wenn das klappt, können wir weiter überlegen, wie wir das lesen automatisieren sodass du nicht immer clicken musst.

Also in den Click event von dem neuen Button schreibst du:


Try

dim getText as String
SerialPort1.PortName = TextBox1.Text
SerialPort1.BaudRate = TextBox2.Text

SerialPort1.Open()
getText = SerialPort1.Readline()
SerialPort1.Close()

TextBox3.Text = getText

Catch ex As Exception
MsgBox("Verbindung konnte nicht hergestellt werden")
End Try


Jetzt schickst du was an die serielle Schnitte und drückst den Button. Achte darauf das du ein "CR LF" sendest. Dein Programm wartet nämlich auf das Zeichen.

Schreib mal hinter jede Zeile in dem Buttonclick Event einen Kommentar mit dem was du denkst was da passiert. Ich will sehen das du auch verstehst was da passiert.

Das ist ungetestet! Wenns nicht gleich läuft poste die Fehlermeldungen.

Der Einsteiger
26.03.2013, 14:08
Wie meinst du das mit dem CR LF ???
Soll ich das von meinem MC aus an den PC schicken ??

Also so:
Print "Auto ist toll"
Print "CR LF"

DanielSan
26.03.2013, 14:32
Fast richtig! ;-) Mit dem MC an den PC was senden genau!

Programmierst du deinen MC mit Bascom?
Falls ja einfach nur:

Print "Auto ist toll"
Bei Bascom wird jedem Printbefehl ein CR&LF angehängt. Dadurch wird der nächste Text in eine neue Zeile geschrieben.

Der Einsteiger
26.03.2013, 14:36
Programmierst du deinen MC mit Bascom?
Ja .

Bei Bascom wird jedem Printbefehl ein CR&LF angehängt
Aha, das wusste ich noch nicht. Danke.

Hier ist die kleine Aufgabe von dir .Hoffentlich richtig gelöst??
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Try 'Versuche

Dim getText As String 'Deklariere getText als String
SerialPort1.PortName = TextBox1.Text 'Portname wird TextBox 1 entnommen
SerialPort1.BaudRate = TextBox2.Text 'Baudrate wird Text Box 2 entnommen

SerialPort1.Open() 'öffnet Serial Port
getText = SerialPort1.ReadLine() 'Das ,was empfangen wurde ,wird der Var getText zugeordnet
SerialPort1.Close() 'schließt Serial Port

TextBox3.Text = getText 'Schreibt in die Text Box 3 den empfangenen Wert ????

Catch ex As Exception
MsgBox("Verbindung konnte nicht hergestellt werden") 'Wenn es nicht geht soll das erscheinen
End Try
End Sub



Und hier noch mal der Code komplett:


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

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 Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Try 'Versuche

Dim getText As String 'Deklariere getText als String
SerialPort1.PortName = TextBox1.Text 'Portname wird TextBox 1 entnommen
SerialPort1.BaudRate = TextBox2.Text 'Baudrate wird Text Box 2 entnommen

SerialPort1.Open() 'öffnet Serial Port
getText = SerialPort1.ReadLine() 'Das ,was empfangen wurde ,wird der Var getText zugeordnet
SerialPort1.Close() 'schließt Serial Port

TextBox3.Text = getText 'Schreibt in die Text Box 3 den empfangenen Wert ????

Catch ex As Exception
MsgBox("Verbindung konnte nicht hergestellt werden") 'Wenn es nicht geht soll das erscheinen
End Try
End Sub
End Class

DanielSan
26.03.2013, 14:44
Super! Ist richtig.

Ich sehe gerade evtl kannst du auf die getText variable verzichten und direkt "TextBox3.Text = SerialPort1.ReadLine()" schreiben. Das kannst du ja mal ausprobieren.

Funktioniert das denn so?

Der Einsteiger
26.03.2013, 15:00
Also ich habe jetzt mal den ganzen Code getestet. Hat nicht funktioniert. Nicht nur das Empfangen ,sondern auch das Senden hat nicht mehr geklappt.Und es ist auch wieder die Fehlermeldung : Es ist eine Ausnahme in ... aufgetreten. Warum ??

DanielSan
26.03.2013, 15:05
Fehlermeldung?

Der Einsteiger
26.03.2013, 15:08
Ja ,beim Direktfenster.

DanielSan
26.03.2013, 15:10
Also die MsgBox?

Dann ist die serielle Schnittstelle evtl. schon offen oder du hast irgendwelche Parameter falsch angegeben.

Der Einsteiger
26.03.2013, 15:16
Nein ,keine MsgBox. Ich meine Das was du auf dem Bild sehen kannst. (UNten)

DanielSan
26.03.2013, 15:21
Da ist doch die MsgBox!

Du musst sowas sofort Posten. Lass dir doch die Fehelermeldung nicht aus der Nase ziehen.

Ich bleib dabei Schnittstelle schon offen oder falsche angegeben. Ist das immernoch COM10? Prüf das mal. Wenn du den USB Port wechselst, kann es sein das sich auch der COM Port ändert.

Der Einsteiger
26.03.2013, 15:57
Ach ok ,jetzt weiß ich was du meinst. Also zum erklären : Das ist das Bild vom Anfang ,nicht aktuell. Also diese MsgBox rechts oben kam vorhin nicht ,nur das da unten.

Mit dem Terminal Emu in Bascom habe ich den Code com MC aber schon getestet , damit hat es funktioniert. Also muss es an vb direkt liegen.

- - - Aktualisiert - - -

Ich habe jetzt mal den Code ein bisschen abgeändert :


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

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 Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Try 'Versuche


SerialPort1.PortName = TextBox1.Text 'Portname wird TextBox 1 entnommen
SerialPort1.BaudRate = TextBox2.Text 'Baudrate wird Text Box 2 entnommen
TextBox3.Text = SerialPort1.ReadLine() 'Das ,was empfangen wurde ,wird der Var getText zugeordnet

Catch ex As Exception
MsgBox("Verbindung konnte nicht hergestellt werd") 'Wenn es nicht geht soll das erscheinen
End Try
End Sub
End Class

Ich habe einfach mal beim Button 4 Sub dieses open und close Serial Port weggelassen und die Verbesserung vorgenommen ,die du vorgeschlagen hattest.
Jetzt lässt sich wieder der Zustand der LED auf dem Board steuern. Doch bekomme ich immer noch keinen Wert bei der Text Box angezeigt . Sobald ich auf den Button 4 drücke , bekomme ich dies MsgBox ,die du meintest angezeigt.

DanielSan
26.03.2013, 19:09
Dann änder mal testweise die Zeile

TextBox3.Text = SerialPort1.ReadLine()
in

TextBox3.Text = SerialPort1.Read()
um.

Damit liest du nur ein einziges Byte ein. Zum Testen ob überhaupt was kommt sollte das reichen.

Wenn das auch nicht klappt, kannst du noch den try und catch kram auskommentieren. Dann stürzt dein Programm richtig ab und der debugger zeigt dir mehr infos. Diese Infos postest du dann hier. Also für Button4 so

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
'Try 'Versuche
SerialPort1.PortName = TextBox1.Text 'Portname wird TextBox 1 entnommen
SerialPort1.BaudRate = TextBox2.Text 'Baudrate wird Text Box 2 entnommen
TextBox3.Text = SerialPort1.ReadLine() 'Das ,was empfangen wurde ,wird der Var getText zugeordnet
'Catch ex As Exception
'MsgBox("Verbindung konnte nicht hergestellt werd") 'Wenn es nicht geht soll das erscheinen
'End Try
End Sub

Der Einsteiger
26.03.2013, 19:39
Also bei dem Ersetzen durch :TextBox3.Text = SerialPort1.Read() ,zeigt er mir schon bevor ich debug will das:Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "Read" diese Anzahl von Argumenten akzeptiert. C:\Users\(Mein Name ,lasse ich mal weg)\Documents\Visual Studio 2010\Projects\Seriell-1.vb 43 29 Seriell-1
an.

Bei diesem unteren was du da geschrieben hast zeigt er das an:


24955

DanielSan
26.03.2013, 19:45
Ja dann den COM Port schliessen, die parameter setzen und dann vor dem read wieder öffnen und anschließend wieder schließen.



Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
'Try
SerialPort1.Close()
SerialPort1.PortName = TextBox1.Text
SerialPort1.BaudRate = TextBox2.Text
SerialPort1.Open()
TextBox3.Text = SerialPort1.ReadLine()
SerialPort1.Close()
'Catch ex As Exception
'MsgBox("Verbindung konnte nicht hergestellt werd")
'End Try
End Sub

Der Einsteiger
26.03.2013, 19:51
Also ,wenn ich jetzt einmal den Button vier klicke hängt sich die Anwendung auf (es lässt sich keine Taste mehr drücken,auch nicht die zum Schließen). :)
Aber es kommt keine Fehlermeldung mehr.

DanielSan
26.03.2013, 20:06
ja er wartet auf ein CR&LF. Erst wenn das kommt gehts weiter ;-)

Der Einsteiger
26.03.2013, 20:11
Ach so... Könnte man das auch irgendwie so machen, das in der TextBox einfach das eingezeigt wird,was gerade empfangen wird (wie Bascom Emu ) und ich gleichzeitig den Roboter teuern kann ???

DanielSan
26.03.2013, 20:28
Ja das ist unser Ziel. Aber erstmal wollen wir doch das die serielle Kommunikation überhaupt funktioniert.
Step by step! ;-)

Schreib mal in Button1 vor das "SerialPort1.Open()" das heir "SerialPort1.ReadTimeout = 500". Damit wartet er nur 500 millisekunden. Kommt dann kein CR&LF macht dein Programm weiter.

Funktioniert das Empfangen denn jetzt?

Der Einsteiger
26.03.2013, 20:34
Ja ,jetzt erscheint beim debug das :

24956

DanielSan
26.03.2013, 20:49
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.

Der Einsteiger
26.03.2013, 21:21
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:


$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

Doch wenn ich den angezeigt bekommen möchte funktionier das mit dem Button nicht (er wartet wieder ewig).
Meine Vermutung :Liegt es an dem Input Befehl ???

DanielSan
26.03.2013, 21:39
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.

Der Einsteiger
26.03.2013, 21:46
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.

DanielSan
26.03.2013, 21:48
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?

Der Einsteiger
26.03.2013, 21:50
Ja ich habe ja vorher den MC Code geändert :


$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

DanielSan
26.03.2013, 21:55
Und da schreibt er wenn du Button4 clickst nur einmal "An" in die TextBox3?

Der Einsteiger
26.03.2013, 22:10
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 ??

DanielSan
26.03.2013, 22:20
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.

Der Einsteiger
26.03.2013, 22:25
Dann ginge es jetzt nur noch darum wie ich es unabhängig , ohne das Senden vom Pc aus zu beeinflussen, hinbekomme ??
Aber wie??
Mit einem Timer??

DanielSan
26.03.2013, 22:33
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.

Der Einsteiger
26.03.2013, 22:37
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.

DanielSan
27.03.2013, 10:40
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.

Der Einsteiger
27.03.2013, 11:32
Ich glaube , ich habe was gefunden : (https://www.roboternetz.de/community/threads/53818-Visual-Basic-2010-RN-Controll?highlight=Visual+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

DanielSan
27.03.2013, 11:45
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.

Der Einsteiger
27.03.2013, 12:09
Das senden machst du dann per Button?
Ja ,erst mal schon.

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

DanielSan
27.03.2013, 12:11
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.

Der Einsteiger
27.03.2013, 12:17
Klinkt logisch.Aber jetzt kommt beim debug wieder das :


24963

DanielSan
27.03.2013, 12:21
Steht doch da. "Der Anschluss ist geschlossen."
SerialPort1.Open() am anfang der Timer routine und
SerialPort1.Close() am ende.

Der Einsteiger
27.03.2013, 12:33
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???

HeXPloreR
27.03.2013, 12:41
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.

DanielSan
27.03.2013, 12:43
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

Der Einsteiger
27.03.2013, 12:55
Also erst mal zu HeXPloreR :


Der Daniel beweist ziemliche Geduld mit Dir. Ein großes Lob.
Das finde ich auch ,einen großen Dank.


Hast Du Port 1 oder 10? Mal schreibst Du so, dann wieder so...
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.

Zu Daniel:


Dann musst du den Timer mit einem Button enablen und erst den Comport, Baudrate etc zuweisen.
Wie genau ??

So ??:::


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

Zur Erklärung des Codes : die Checkboxen musst du nicht beachten.

HeXPloreR
27.03.2013, 12:56
...

Die beiden? Ich helf ihm alleine! Ich wäre froh wenn hier noch einer helfen würde! :p

Soso, garnicht gemerkt das Du soooo vergesslich bist ;)

PS: Habe nichts von "beiden" geschrieben :P

DanielSan
27.03.2013, 13:02
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.

Der Einsteiger
27.03.2013, 13:13
Also ich hab das jetzt einfach mal getestet ,aber es wird wieder das angezeigt:

DanielSan
27.03.2013, 13:15
Lies doch mal die Fehlermeldung!!! Da steht doch ganz klar was nicht in Ordnung ist!

Der Einsteiger
27.03.2013, 13:21
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 ???


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

DanielSan
27.03.2013, 13:30
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. ;-)

Der Einsteiger
27.03.2013, 14:27
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

DanielSan
27.03.2013, 22:28
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):


Public Class Form1
Delegate Sub TextBoxCallback(ByVal text As String)

Das hier in den Form Load Event

Me.SerialPort1.DtrEnable = True
Me.SerialPort1.ReceivedBytesThreshold = 1


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


Damit müsste jetzt in TextBox1 der Text der an der seriellen Schnitte ankommt angezeigt werden.

Mein MC ist mit Arduino programmiert.


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);
}

Der Einsteiger
07.10.2013, 17:40
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 :


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

und für den PC:

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

Doch das geht nicht so wirklich. Wie würdet ihr das machen ??
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) :)

DanielSan
08.10.2013, 09:37
Ä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.

Wsk8
08.10.2013, 11:42
Dim Adresse As String * 255
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.

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

Der Einsteiger
08.10.2013, 12:24
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:

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

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

Wsk8
08.10.2013, 12:38
Das Problem ist jetzt, dass wenn ich den Roboter anschalte, dieser mir sofort eine endlose Reihe Stopp sendet.
Das ist kein Problem, sondern steht genauso in deinem Code.


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


Genau so will ich es ja.

Ein Char oder byte wäre hier vollkommen ausreichend.


Nur hat es damit leider noch weniger funktioniert.
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.

mfg

Der Einsteiger
08.10.2013, 12:52
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.

robin
09.10.2013, 20:12
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.

Der Einsteiger
26.10.2013, 10:43
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...