Problem mit serieller Schnittstelle (DTR)

18/01/2010 - 15:32 von Uwe Weih | Report spam
Hallo,

ich messe an der seriellen Schnittstelle zwischen DTR und Masse mit einem
Oszilloskop 11,5 V bei DTR = High und -11,3 V bei DTR = Low.

Obwohl ich vor dem Öffnen der seriellen Schnittstelle DTR auf Low setze,
wird beim Öffnen der seriellen Schnittstelle DTR für 1,8 ms auf High
gesetzt. Dies tritt nur beim ersten Öffnen der seriellen Schnittstelle nach
Programmstart auf, nicht bei wiederholtem Schließen und Öffnen der
Schnittstelle und Öffnen und Schließen des Programms. Erst wenn man ein
anders Terminalprogramm wie Hyperterminal verwendet (wobei Hyperterminal DTR
generell auf High setzt), tritt obiges Problem erneut mit der Anwendung beim
ersten Aufruf auf.

Das Problem habe ich auch bei einer Anwendung, die ich mit VB6 erstellt
habe. Und nun mit einer Anwendung, die ich mit VS 2008 SP1 und VB.NET
erstelle. Eingestelltes Zielframework ist 2.0.

Ich poste mal meine testweise erstellte Klasse cSerialPort:

Option Explicit On
Option Strict On

Imports System.IO.Ports

Public Class cSerialPort
Private serPort As New System.IO.Ports.SerialPort

Public Sub New()
With serPort
.PortName = "COM1"
.BaudRate = 9600
.DataBits = 7
.Parity = Parity.Even
.StopBits = StopBits.One
.Handshake = Handshake.None

.DtrEnable = False
.RtsEnable = False
End With
End Sub

Public Overrides Function ToString() As String
Dim strAusgabe As String = MyBase.ToString()
Return strAusgabe
End Function

Public Function Open(ByVal Port As Byte, ByVal Baudrate As Integer) As
Boolean
Try
serPort.PortName = "COM" & Port.ToString
serPort.BaudRate = Baudrate
serPort.DtrEnable = False
serPort.Open()
Return True
Catch ex As Exception
Return False
End Try
End Function

Public Sub Close()
Try
serPort.Close()
Catch ex As Exception
End Try
End Sub

Public WriteOnly Property DTR() As Boolean
Set(ByVal value As Boolean)
serPort.DtrEnable = value
End Set
End Property

Und hier der Code fürs Hauptfenster, der vier Schaltflàchen (Connect,
Disconnect, DRT = Low und DRT = High) enthàlt:

Public Class frmHauptfenster

Dim blnAbbruch As Boolean = False
Dim SerialPort As New cSerialPort

Private Sub frmHauptfenster_Load(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles MyBase.Load
btnConnect.Enabled = True
btnDisconnect.Enabled = False

btnDTRLow.Enabled = False
btnDTRHigh.Enabled = False
End Sub

Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnConnect.Click
SerialPort.Open(1, 9600)
btnConnect.Enabled = False
btnDisconnect.Enabled = True

btnDTRLow.Enabled = True
btnDTRHigh.Enabled = True
End Sub

Private Sub btnDisconnect_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles btnDisconnect.Click
SerialPort.Close()
btnDisconnect.Enabled = False
btnConnect.Enabled = True

btnDTRLow.Enabled = False
btnDTRHigh.Enabled = False
End Sub


Private Sub btnDTRHigh_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnDTRHigh.Click
SerialPort.DTR = True
End Sub

Private Sub btnDTRLow_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btnDTRLow.Click
SerialPort.DTR = False
End Sub


End Class

BTW: Wenn hier niemand ist, der mit der seriellen Schnittstelle
programmiert, wo könnte man das Problem posten und jemand das nachvollziehen
will und kann? Eine Erklàrung warum das so ist wàre toll.

Ciao

Uwe Weih
 

Lesen sie die antworten

#1 Olaf Rabbachin
18/01/2010 - 16:42 | Warnen spam
Hi Uwe,

Uwe Weih wrote:

Ich poste mal meine testweise erstellte Klasse cSerialPort:
[...]
Public Function Open(ByVal Port As Byte, ByVal Baudrate As Integer) As
Boolean
Try
serPort.PortName = "COM" & Port.ToString
serPort.BaudRate = Baudrate
serPort.DtrEnable = False



das Problem dürfte sein, dass Du hier *immer* DtrEnable auf False setzt und
Deine DTR-prop misachtest.
Du solltest das ergo hier durch ...

serPort.DtrEnable = DTR

... ersetzen und Deine DTR-Prop ...

Public WriteOnly Property DTR() As Boolean
Set(ByVal value As Boolean)
serPort.DtrEnable = value
End Set
End Property



... abàndern:

Public WriteOnly Property DTR() As Boolean
prvate get() As Boolean
return serPort.DtrEnable
End Set
Set(ByVal value As Boolean)
serPort.DtrEnable = value
End Set
End Property

Ggf. musst Du dann den Konstruktor noch anpassen, sodass der initiale Wert
entsprechend lautet.

Gruß,
Olaf

Ähnliche fragen