Forum: PC-Programmierung Serielle Schnittstelle


von Moritz R. (bugsier3)


Lesenswert?

Hallo,
kann mir jemand helfen?

ich habe einen Tams Master Controll(Digitalessteuergerät für eine 
Modellbahn) und will ihn jetzt über den PC steuern. Mein Code sieht so 
aus(,aber ich finde den Fehler nicht):

Public Class Form1

    Const COM_PORT As String = "COM9"

    Dim PufferString As String

    Private Delegate Sub DelegateSub()
    Private Datenanzeigen As New DelegateSub(AddressOf Anzeigen)

------------------------------------------------------------------------ 
---

    Private Sub Form1Load(ByVal sender As System.Object, ByVal e As 
System.EventArgs) _ Handles MyBase.Load

        Dim EinzelPort As String

        Debug.WriteLine("INFO: Folgende Ports wurden auf dem System 
gefunden:")
        For Each EinzelPort In My.Computer.Ports.SerialPortNames
            Debug.WriteLine(EinzelPort)
        Next EinzelPort

        With SerialPort1
            If Not .IsOpen Then
                Try
                    .PortName = COM_PORT
                    .BaudRate = 57600
                    .DataBits = 8
                    .WriteTimeout = 2000                   ' 1000 ms = 1 
Sek.
                    .ReadTimeout = 2000                    ' 1000 ms = 1 
Sek.
                    .Handshake = IO.Ports.Handshake.None
                    .NewLine = vbCr
                    .Open()
                    Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
                Catch ex As Exception
                    MessageBox.Show(ex.Message, "Fehler beim Open", _
                                MessageBoxButtons.OK, 
MessageBoxIcon.Error)
                    Exit Sub
                End Try
            End If
        End With

        TextBox1.Multiline = True
        TextBox1.ScrollBars = ScrollBars.Both

    End Sub


------------------------------------------------------------------------ 
---
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) _Handles Button1.Click


        Try
            SerialPort1.WriteLine(TextBox1.Text)

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Fehler beim Senden ...")
            Exit Sub
        End Try

        Debug.WriteLine("Daten übermittelt!")

        Try
            TextBox1.Text = SerialPort1.ReadLine

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Fehler beim Empfangen ...")
        End Try

    End Sub

'----------------------------------------------------------------------- 
---

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, _
                                ByVal e As 
System.IO.Ports.SerialDataReceivedEventArgs)_ Handles 
SerialPort1.DataReceived

    End Sub



    Private Sub Anzeigen()
        TextBox1.AppendText(PufferString)                       ' Text 
am Ende hinzufügen
        TextBox1.ScrollToCaret()                       ' Scrollen bis 
zum neuen Text
    End Sub

'----------------------------------------------------------------------- 
---

    Private Sub Form1_FormClosing(ByVal sender As Object, _
      ByVal e As System.Windows.Forms.FormClosingEventArgs) _ Handles 
Me.FormClosing

        If SerialPort1.IsOpen Then SerialPort1.Close() ' Port wieder 
Schließen
        Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
    End Sub
End Class

Ich glaube das keine Verbindung mit dem Gerät hergestellt wird.

danke, schon mal im Vorhinaus. :)

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Moritz R. schrieb:
> Ich glaube das keine Verbindung mit dem Gerät hergestellt wird.

zu Glaubens-Fragen sind eher religiös orientierte Boards vermutlich 
bessere Ratgeber....

Ansonsten soltest du einiges mehr zu deiner Hardware und Umgebung 
schreiben (mit Produktlinks, Fotos etc). Bei diesem Wetter beschlagen 
die Glaskugeln nämlich ziemich schnell...

von bluppdidupp (Gast)


Lesenswert?

Kommt denn ne Fehlermeldung oder warum vermutest du das?

von Moritz R. (bugsier3)


Lesenswert?

Weil 1. Keine Antwort kommt.
        2. Kommt das timeout

...hier ist das Modell:
http://www.tams-online.de/htmls/produkte/EasyControl/produkte_ec1.html

von Karl H. (kbuchegg)


Lesenswert?

Moritz R. schrieb:
> Weil 1. Keine Antwort kommt.

Hast du mal versucht, das Modul von einem Terminalprogramm aus 
anzusprechen?

von Moritz R. (bugsier3)


Lesenswert?

ja, hab ich. Da hat es auch wunderbar funktioniert.

von Karl H. (kbuchegg)


Lesenswert?

Wird

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, _
                                ByVal e As
System.IO.Ports.SerialDataReceivedEventArgs)_ Handles
SerialPort1.DataReceived

    End Sub

aufgerufen?

von Moritz R. (bugsier3)


Lesenswert?

nein, es kommt nur bis

 Try
            TextBox1.Text = SerialPort1.ReadLine

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Fehler beim Empfangen ...")
        End Try

    End Sub

..und dann kommt ist timeout.

grüße Mori

von bluppdidupp (Gast)


Lesenswert?

- Kommt bei .ReadByte statt .ReadLine auch Timeout?
- Sicher mit NewLine = vbCr und nicht evtl. LF?

von Moritz R. (bugsier3)


Lesenswert?

juppi, jetzt funktioniert es, musste noch ein paar Eigenschaften 
einstellen. Danke füre unterstützung :)

von Juergen R. (stumpjumper)


Lesenswert?

Dann lass doch den Rest der Welt an Deiner Freude teilhaben und verrate 
welche das waren

von Moritz R. (bugsier3)


Lesenswert?

der gesamte code:
Const COM_PORT As String = "COM9"

    Dim PufferString As String

    Private Delegate Sub DelegateSub()
    Private Datenanzeigen As New DelegateSub(AddressOf Anzeigen)



    Private Sub Form1Load(ByVal sender As System.Object, ByVal e As 
System.EventArgs) _
                                Handles MyBase.Load

        Dim EinzelPort As String

        Debug.WriteLine("INFO: Folgende Ports wurden auf dem System 
gefunden:")
        For Each EinzelPort In My.Computer.Ports.SerialPortNames
            Debug.WriteLine(EinzelPort)
        Next EinzelPort

        With SerialPort1
            If Not .IsOpen Then
                Try
                    '.PortName = COM_PORT
                    '.BaudRate = 57600
                    '.DataBits = 8
                    '.WriteTimeout = 2000                        ' 1000 
ms = 1 Sek.
                    '.ReadTimeout = 2000                         ' 1000 
ms = 1 Sek.
                    '.Handshake = IO.Ports.Handshake.None
                    '.ReceivedBytesThreshold = 1
                    .NewLine = vbCr
                    .Open()
                    Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
                Catch ex As Exception
                    MessageBox.Show(ex.Message, "Fehler beim Open", _
                                    MessageBoxButtons.OK, 
MessageBoxIcon.Error)
                    Exit Sub
                End Try
            End If
        End With

        TextBox1.Multiline = True
        TextBox1.ScrollBars = ScrollBars.Both

    End Sub



    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) _
                                Handles Button1.Click


        Try
            PufferString = ""
            SerialPort1.WriteLine(TextBox1.Text)

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Fehler beim Senden ...")
            Exit Sub
        End Try

        Debug.WriteLine("Daten übermittelt!")
        TextBox1.Text = ""

    End Sub



    Private Sub SerialPort1_DataReceived(ByVal sender As Object, _
                                ByVal e As 
System.IO.Ports.SerialDataReceivedEventArgs) _
                                Handles SerialPort1.DataReceived 
'hier
        Dim response As String

        Try
            'TextBox1.Text = TextBox1.Text & SerialPort1.ReadExisting
            response = SerialPort1.ReadExisting
            Debug.WriteLine(response)
            PufferString &= response
            If PufferString.EndsWith("]") Then
                'event auslösen
            End If
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Fehler beim Empfangen ...")
        End Try
    End Sub



    Private Sub Anzeigen()
        Label1.Text = PufferString
    End Sub



    Private Sub Form1_FormClosing(ByVal sender As Object, _
                                ByVal e As 
System.Windows.Forms.FormClosingEventArgs) _
                                Handles Me.FormClosing
        If SerialPort1.IsOpen Then SerialPort1.Close() ' Port wieder 
Schließen
        Debug.WriteLine("Port Open: " & SerialPort1.IsOpen)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button2.Click
        Anzeigen()
    End Sub


    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button3.Click
        Try
            PufferString = ""
            SerialPort1.WriteLine("Behfehl") '<----hier befehl eingeben

        Catch ex As Exception
            MessageBox.Show(ex.Message, "Fehler beim Senden ...")
            Exit Sub
        End Try

        Debug.WriteLine("Daten übermittelt!")
        TextBox1.Text = ""

    End Sub

..und die Eigenschaften:
unter serial_port :
                   -DtrEnable auf "True"
                   -RtsEnable auf "True"

Gruß Moritz

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.