Hallo,
Ich bin dabei nen Schrittmotor vom PC aus über einen Atmega 32 anzusteuern.
Die Controllersoftware habe ich soweit fertig und funktionieren tuts auch.
Naja, jedenfalls vom Terminal aus.
Ich muss dem Controller nacheinander 3 Daten übermitteln:
- ein l oder ein r für die Drehrichtung
- eine ganzzahl für die Drehzahl in U/min
- die Anzahl der Schritte die er laufen soll.
Mit dem Terminal läuft das ganze wie folgt:
ich verbinde das Terminal ganz normal mir den passenden com port einstellungen.
Dann drücke ich l und anschließend enter. Daraufhin antwortet mir der Controller mit O für OK.
dann gebe ich eine Zahl z.b.200 ein und drücke wieder enter.
Er antwortet wieder mit O.
Zuletzt geb ich dann wieder ne zahl (z.b.1000) ein gefolgt von enter und er Antwortet wieder mit O. Und nun macht der Motor auch genau das, was er soll:
Mit 200 U/min 1000 Schritte nach Links drehen.
Nun versuche ich mit VB2008 ein Programm zu erstellen, das halt genau diese befehle ausgibt, erst habe ich versucht direkt ein programm zu erstellen das zeilenweise eine textbox ausließt, und die Daten dann übertträgt, da das allerdings nicht wirklich klappen wollte will ich erstmal ganz einfach anfangen.:
Code:Module Module1 Dim myport As New System.IO.Ports.SerialPort Dim Daten() As Byte Sub Main() myport.PortName = "COM2" myport.BaudRate = 9600 myport.Parity = IO.Ports.Parity.None myport.StopBits = IO.Ports.StopBits.One myport.DataBits = 8 myport.Open() Do myport.Write("r") myport.Write(Chr(13)) 'Threading.Thread.Sleep(500) Checkinput() myport.Write("300") myport.Write(Chr(13)) 'Threading.Thread.Sleep(500) Checkinput() myport.Write("1000") myport.Write(Chr(13)) MsgBox("Durchgang fertig") Loop End Sub Private Sub Checkinput() Dim Buffer As String = "" Do Buffer = Buffer + myport.ReadLine If Buffer = "O" + Chr(13) Then Exit Do Else MsgBox("Aktueller empfang = " + Buffer) End If Loop End Sub End Module
der Hauptteil läuft, wenn ich die momentan auskommentierten 'Threading.Thread.Sleep(500) benutze. Aber da ich das mc programm extra so erstellt habe, dass er immer antwortet wenn was da ist, möchte ich diese Antworten auf dem Pc auch benutzen um ihm zu sagen wann er das nächste losschicken darf.
Dazu hab ich nun die Sub Checkinput() eingebaut, die aber leider irgendwie garnicht das macht was ich will
Nach dem Starten des Programms erknnt der Kontroller seine laufrichtung und gibt O aus, am PC im checkinput kommt aber eine messagebox
mit dem Text "Aktueller empfang = l ". Nach klick auf OK kommt dann die 2te messagebox mit dem Text "Aktueller empfang = lO ".
Nach bstätigung hängt er dann in der Do Loop schleife Fest.
Was ich nicht verstehe, warum erkennt der im eingang ein l ?? der Kontroller gibt definitiv nur das O als antwort aus, zumindest wird nur das O als Antwort im Terminal angezeigt.
Was könnt ihr mir dazu sagen ? Was ist Falsch, ich bin hier jetzt 2 Tagen am rumprobieren und bekomme es einfach nicht hin.
Ich hoffe ihr könnt mir helfen, ich habe noch kein Tutorial oder Hinweise gefunden die mit da weiterhelfen konnten
mfg
Jens R.
So nach einigen weiteren Stunden des rumprobierens hab ichs nun endlich geschafft
Meine Fehler:
-Ich wusste nicht das der mc deim Input ein echo sendet, deswegen immer die mysteriösen rückmeldung die ich nicht auswerten konnte.
-mc Programm hatte ich warum auch immer als baudrate 9400 statt 9600 programmiert.
-Die abfrage der Rückmeldungen mache ich nun durch das DataReceived Event des Com Ports.
-im mc programm hab ich nun noch eine bestätigungsmeldung eingebaut die gesendet wird, wenn der Motor die Schritte abgeschlossen hat.
Hier nochmal der aktuelle code des PC-Programms:
Code:Module Module1 Dim WithEvents myport As New System.IO.Ports.SerialPort Dim Daten() As Byte Dim buffer As Byte Sub Main() myport.PortName = "COM2" myport.BaudRate = 9600 myport.Parity = IO.Ports.Parity.None myport.StopBits = IO.Ports.StopBits.One myport.DataBits = 8 myport.Open() Do myport.Write("l") myport.Write(Chr(13)) Checkinput() MsgBox("Richtung empfangen") myport.Write("400") myport.Write(Chr(13)) Checkinput() MsgBox("Geschwindigkeit empfangen") myport.Write("2000") myport.Write(Chr(13)) Checkinput() MsgBox("Schrittzahl empfangen") Checkinput() MsgBox("Motorlauf Fertig") Loop End Sub Private Sub Checkinput() Do If buffer = 79 Then buffer = 0 Exit Do End If Loop End Sub Private Sub myport_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles myport.DataReceived buffer = myport.ReadByte End Sub End Module
Lesezeichen