Serielle Schnittstelle

Nino14

Erfahrenes Mitglied
Liebe Community,

an dieser Stelle möchte ich erstmal allen danken, die mir bis jetz so erfolgreich geholfen haben.

Aber nun zu meinem Problem:
Mein Sportverein stellte mir heute die Aufagabe, dass sie gerne auf unserer HP nachlesen wollen, ob sich momentan jemand in einer unsere 2 Hallen befindet. Und das Ganze so kostengünstig wie irgendwie möglich.

Mein Lösungsansatz:
Man hängt in beiden Hallen Bewegungsmelder auf, die ein Relais schalten. (Zusätzlich könnte man Helligkeitssensoren anbringen. Wäre aber nciht zwingend nötig.) Durch das Relais wird ein Stromkreis geschlossen, der an eine serielle Schnittstelle eines PC' s angeschlossen ist(z.B. von Pin4 nach Pin 1 und von Pin4 nach Pin6). Auf dem PC läuft ein Programm das alle x Sekunden den Seriellen Port abfragt und daraufhin das Ergebnis in jeweils eine txt Datei schreibt. Diese Datei wird dann bei Bedarf von Server auf dem unser HP liegt geöffnet und ausgelesen. Via FTP server auf dem PC und php auf dem Server der HP.

Soweit bin ich auch nach einiegen Nachforschungen und Überlegungen am heutiegen Tag gekommen. Ich habe auch schonmal VB geprogt, nur leider ist das 2 Jahre her und meine Erinnerungen sind daran nicht mehr so groß da ich mich in letzter Zeit hauptsächlich mit PHP beschäftigt habe. Also bräuchte ich ein paar Anfänger-taugliche Tipps wie ich die Seriellen Ports des PC's abfragen kann. Wenn ich das Ergebnis der Abfrage in einer Variable steheh hätte könnte ich den Rest auch selber hinkriegen. Nur leider reichen meine Kentnisse nicht mehr für die Abfrage der Ports.


So weit mein Denkansatz. Falls das so nicht realisierbar ist bitte ich um alternativen.
Das is ersma so ne Menge. Falls irgendetwas nicht verständlich ist, fragt einfach nach. Ich bin für jede Hilfe dankbar

LG Nino
 
Hallo

Hier ein Beispiel wie Du den Com Port abhören kannst.
Dazu benötigst Du das MS Comm Control und eine ListBox.
Code:
Private N As Integer

Private Sub Form_Load()
  MSComm1.CommPort = 1
  MSComm1.DTREnable = True
  MSComm1.RTSEnable = True
  MSComm1.PortOpen = True
End Sub

Private Sub MSComm1_OnComm()

N = N + 1

List1.AddItem N

Select Case MSComm1.CommEvent

 ' Fehler
 Case comEventBreak
   List1.AddItem "Es wurde ein Anhaltesignal empfangen"
 Case comEventFrame
   List1.AddItem "Fehler im Übertragungs-Raster (Framing Error)"
 Case comEventOverrun
   List1.AddItem "Datenverlust"
 Case comEventRxOver
   List1.AddItem "Überlauf des Empfangs-Puffers"
 Case comEventRxParity
   List1.AddItem "Paritätsfehler"
 Case comEventTxFull
   List1.AddItem "Sendepuffer voll"
 Case comEventDCB
   List1.AddItem "Unerwarteter Fehler beim Abrufen des DCB"


 ' Ereignisse
 Case comEvSend
   List1.AddItem "Im Sendepuffer befinden sich SThreshold Zeichen"
 Case comEvReceive
   List1.AddItem "Anzahl empfangener Zeichen gleich RThreshold"
 Case comEvCTS
   List1.AddItem "Pegeländerung auf CTS"
   List1.AddItem "Signal: " & IIf(MSComm1.CTSHolding, "High", "Low")
 Case comEvDSR
   List1.AddItem "Pegeländerung auf DSR"
   List1.AddItem "Signal: " & IIf(MSComm1.DSRHolding, "High", "Low")
 Case comEvCD
   List1.AddItem "Pegeländerung auf DCD"
   List1.AddItem "Signal: " & IIf(MSComm1.CDHolding, "High", "Low")
 Case comEvRing
   List1.AddItem "Pegeländerung auf RI"
 Case comEvEOF
   List1.AddItem "Im Eingabestrom wurde ein EOF-Zeichen gefunden"
End Select

End Sub

Pinbelegung D-Sub, 9-polig, männlich:

Pin - Bez. - Bedeutung - E/A
1 - DCD - Data Carrier Detect - Eingang
2 - RD - Receive Data - Eingang
3 - TD - Transmit Data - Ausgang
4 - DTR - Data Terminal Ready - Ausgang
5 - GND - Ground
6 - DSR - Dataset Ready - Eingang
7 - RTS - Request to Send - Ausgang
8 - CTS - Clear to Send - Eingang
9 - RI - Ring Indicator - Eingang


Schließt Du den Schaltkontakt des Relais zwischen:
DSR (Pin 6) und RTS (Pin 7)
oder
DSR (Pin 6) und DTR (Pin 4) dann bekommst Du eine Signaländerung auf DSR.

Schließt Du den Schaltkontakt des Relais zwischen:
CTS (Pin 8) und RTS (Pin 7)
oder
CTS (Pin 8) und DTR (Pin 4) dann bekommst Du eine Signaländerung auf CTS.

Schließt Du den Schaltkontakt des Relais zwischen:
DCD (Pin 1) und RTS (Pin 7)
oder
DCD (Pin 1) und DTR (Pin 4) dann bekommst Du eine Signaländerung auf DCD.
 
hey danke schonmal

wenn ich den Code jetz richtig verstanden habe geht es da aber um eine Datenübertragung oder habe ich das falsch verstanden? Könntest du eventuell noch ein Paar Kommentare in deinen Code einfügen?
Ich werde mal sehen was ich trotzdem schon daraus machen kann.

Achja was ich im ersten Post vergessen habe ist das das Betriebssystem WIN 98 ist. Ich programmiere im moment mit Visual Basic 2008 Express edition. Bin aber auch bereit jeweils etwas anderes zu verwenden.

LG Nino

und ich hoffe mir können noch ein paar mehr leute hilfen geben.
 
Zuletzt bearbeitet:
Das Beispiel von Wincnc ist VB6. Falls Du das Projekt in VB 2008 realisieren willst,solltest Du Deine Frage im .NET-Forum noch mal stellen.
 
wie schon gesagt ich bin recht flexibel und kann auch gerne umsteigen. Damit erklärt sich mir auch warum das bei mir nicht funktioniert hat...
Danke
 
Prima, denn das Beispiel, das wincnc geschrieben hat, sieht gut aus. Mit VB .NET geht das sicherlich auch, aber, wie gesagt, da können wir Dir hier nicht so gut helfen wie die .NET-Spezialisten.
 
cool danke das ihr mir alle so viel helft...

Aber es wäre für mich viel einfacher wenn ihr den code kommentieren könntet da es bei mir doch recht lange her ist das ich das letzte mal VB geprogt hab. Wäre echt sehr nett...

LG Nino
 
Hallo, das Ganze in Net:
Code:
Public Class Form1

    Private Sub SerialPort1_PinChanged(ByVal sender As Object, ByVal e As System.IO.Ports.SerialPinChangedEventArgs) Handles SerialPort1.PinChanged
        Select Case e.EventType

            Case IO.Ports.SerialPinChange.DsrChanged
                If Me.SerialPort1.DsrHolding Then
                    MsgBox("DSR High")
                Else
                    MsgBox("DSR Low")
                End If

            Case IO.Ports.SerialPinChange.CtsChanged
                If Me.SerialPort1.CtsHolding Then
                    MsgBox("CTS High")
                Else
                    MsgBox("CTS Low")
                End If

            Case IO.Ports.SerialPinChange.CDChanged
                If Me.SerialPort1.CDHolding Then
                    MsgBox("CD High")
                Else
                    MsgBox("CD Low")
                End If

        End Select
    End Sub

    Private Sub Form1_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
        Me.SerialPort1.Close()
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Me.SerialPort1.PortName = "COM1"
        Me.SerialPort1.Open()
        Me.SerialPort1.RtsEnable = True
        Me.SerialPort1.DtrEnable = True
    End Sub
End Class
 

Neue Beiträge

Zurück