- Labornetzteil AliExpress         
Ergebnis 1 bis 2 von 2

Thema: Problem mit Serial Port (empfang)

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    01.06.2007
    Ort
    Recke
    Alter
    35
    Beiträge
    46

    Problem mit Serial Port (empfang)

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    01.06.2007
    Ort
    Recke
    Alter
    35
    Beiträge
    46
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad