PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Serial Port (empfang)



Tredory
06.03.2009, 22:58
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.:


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.

Tredory
07.03.2009, 17:23
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:


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