ich will keine, die extra bei meinem Programm dann dabei sein müssen!
Wo ist der Unterschied von seriell und parallel?!

Wie kann ich z.B. eine 1-Kanal-Relais-Karte aufbauen (Schaltplan)?
Kann mir mal jemand ein Code-Beispiel machen?
Code: Alles auswählen
;{**********-Konstanten, Variablen, Strings, ...; laden von Fonts, Bildern,...-**********
;*****-Konstanten für Fenster-*****
Enumeration
#HauptFenster
EndEnumeration
#HauptFensterWidth = 365
#HauptFensterHeight = 165
#HauptFensterFlags = #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget
;*****-Konstanten für Gadgets-******
Enumeration
#GadgetFrame3D1
#GadgetFrame3D2
#GadgetTextInput1
#GadgetTextInput2
#GadgetTextRelais1
#GadgetTextRelais2
#GadgetImageInput1
#GadgetImageInput2
#GadgetButtonRelais1Ein
#GadgetButtonRelais1Aus
#GadgetButtonRelais2Ein
#GadgetButtonRelais2Aus
#GadgetButtonBeenden
EndEnumeration
;*****-Konstanten für Bilder-*****
Enumeration
#ImageInput1
#ImageInput2
EndEnumeration
;*****-Sonstige Konstanten, Variablen, Strings, ...-******
#AnwendungName = "2 Relais-Relaiskarte"
#VersionName = "2 Relais-Relaiskarte 1.0"
Global ComPort.l
Global Thread.l
;*****-Bilder erstellen-*****
CreateImage(#ImageInput1, 30, 30)
CreateImage(#ImageInput2, 30, 30)
;}
Procedure ReChargeInputs()
If ComGetDSR(ComPort) = 0
If StartDrawing(ImageOutput(#ImageInput1))
Box(0, 0, 30, 30, RGB(228, 48, 27))
StopDrawing()
EndIf
Else
If StartDrawing(ImageOutput(#ImageInput1))
Box(0, 0, 30, 30, RGB(136, 207, 78))
StopDrawing()
EndIf
EndIf
If ComGetCTS(ComPort) = 0
If StartDrawing(ImageOutput(#ImageInput2))
Box(0, 0, 30, 30, RGB(228, 48, 27))
StopDrawing()
EndIf
Else
If StartDrawing(ImageOutput(#ImageInput2))
Box(0, 0, 30, 30, RGB(136, 207, 78))
StopDrawing()
EndIf
EndIf
SetGadgetState(#GadgetImageInput1, ImageID(#ImageInput1))
SetGadgetState(#GadgetImageInput2, ImageID(#ImageInput2))
EndProcedure
Procedure Thread()
Repeat
ReChargeInputs()
Delay(250)
ForEver
EndProcedure
Procedure HauptFenster()
If OpenWindow(#HauptFenster, 0, 0, #HauptFensterWidth, #HauptFensterHeight, #AnwendungName, #HauptFensterFlags)
;{*****-Gadgets erstellen-*****
If CreateGadgetList(WindowID(#HauptFenster))
TextGadget(#GadgetTextInput1, 20, 20, 60, 15, "Eingang 1", #PB_Text_Center)
ImageGadget(#GadgetImageInput1, 35, 40, 30, 30, 0, #PB_Image_Border)
TextGadget(#GadgetTextInput2, 20, 90, 60, 15, "Eingang 2", #PB_Text_Center)
ImageGadget(#GadgetImageInput2, 35, 110, 30, 30, 0, #PB_Image_Border)
Frame3DGadget(#GadgetFrame3D1, 100, 15, 2, 140, "", #PB_Frame3D_Single)
TextGadget(#GadgetTextRelais1, 130, 20, 70, 15, "Relais 1", #PB_Text_Center)
ButtonGadget(#GadgetButtonRelais1Ein, 130, 40, 30, 30, "Ein")
ButtonGadget(#GadgetButtonRelais1Aus, 170, 40, 30, 30, "Aus")
TextGadget(#GadgetTextRelais2, 130, 90, 70, 15, "Relais 1", #PB_Text_Center)
ButtonGadget(#GadgetButtonRelais2Ein, 130, 110, 30, 30, "Ein")
ButtonGadget(#GadgetButtonRelais2Aus, 170, 110, 30, 30, "Aus")
Frame3DGadget(#GadgetFrame3D2, 230, 15, 2, 140, "", #PB_Frame3D_Single)
ButtonGadget(#GadgetButtonBeenden, 260, 105, 80, 35, "Beenden")
EndIf
;}
ReChargeInputs()
Beenden_HauptFenster = 0
Thread = CreateThread(@Thread(), 0)
Repeat
Event_HauptFenster = WaitWindowEvent()
If Event_HauptFenster = #PB_Event_Gadget
Select EventGadget()
Case #GadgetButtonRelais1Ein
ComSetDTR(ComPort, 1)
Case #GadgetButtonRelais1Aus
ComSetDTR(ComPort, 0)
Case #GadgetButtonRelais2Ein
ComSetRTS(ComPort, 1)
Case #GadgetButtonRelais2Aus
ComSetRTS(ComPort, 0)
Case #GadgetButtonBeenden
Beenden_HauptFenster = 1
EndSelect
EndIf
If Event_HauptFenster = #PB_Event_CloseWindow
Beenden_HauptFenster = 1
EndIf
Until Beenden_HauptFenster <> 0
Else
MessageRequester("Fehler", "Fenster konnte nicht geöffnet werden.", #MB_ICONERROR)
End
EndIf
KillThread(Thread)
CloseWindow(#HauptFenster)
ComClose(ComPort)
End
EndProcedure
ComPort = ComOpen("COM1: baud=9600 parity=N data=8 stop=1", #HandShakeModeNone, 0, 0)
ComSetDTR(ComPort, 0)
ComSetRTS(ComPort, 0)
HauptFenster()
Schließlich muss man eben wissen, solange das eigene Programm läuft,Purebasic-Hilfe hat geschrieben:Wenn möglich, sollte ein Flag (z.B. eine globale Variable) verwendet werden, welcher dem Thread mitteilt, sich selbst zu beenden (und das benötigte "Aufräumen" zu erledigen). Und dieser Befehl sollte nur verwendet werden, wenn dies auf irgendwelchen Gründen nicht möglich ist.
Code: Alles auswählen
Procedure Beeper()
Repeat
For a= 1 To 4
For i= 1000 To 3000 Step 500
Beep_(i,40)
Next i
For i= 2000 To 1000 Step -500
Beep_(i,40)
Next i
Next a
Delay(2000)
ForEver
EndProcedure
CreateThread(@Beeper(),0)
MessageRequester("Info", "It will beep every 3 seconds."+Chr(10)+"Click To finish the program", 0)
End ; Beendet das Programm ordentlich, wie in der Hilfe steht.
Zur Veranschaulichung noch 2 Kleine Pics:Mein altes Referat hat geschrieben:Parallelbusse, wie zum Beispiel der Centronics- Parallel-Bus, den wir auch als LPT- oder
Druckeranschluss kennen, übertragen Ihre Binärcodes, wie der Name des Bustyps schon sagt, parallel. Jede Ader wird also, je nach Wert, mit einer bestimmten Spannung belegt, oder eben nicht.
So kann eine bestimmte Menge an Binärzahlen, begrenzt durch die Anzahl der Datenadern, gleichzeitig von A nach B ‚gebracht’ werden. Tatsächlich werden diese Daten nicht befördert, da ein ‚Übermitteln’ nicht zwangsläufig den Verlust dieser Daten auf der Senderseite bedeutet. Durch ein bestimmtes Signal, oder einer bestimmten Datenader, wird dem Empfänger jetzt mitgeteilt, dass die Daten jetzt vollständig und korrekt an den Eingängen anliegen. Jetzt liest der Empfänger den Signalbestand aus und interpretiert daraus die Daten. Ein Zyklus dieses Vorgangs nennt man „Takt“. Die Taktrate ist also die Anzahl dieser Vorgänge innerhalb einer Sekunde. Hertz.
Doch physikalisch gesehen trifft man mit der Datenbreite bei Parallelbussen irgendwann auf seine Grenzen: Da man nur begrenzt Material und Platz zur Verfügung hat, würden die immer breiter werdenden Busse irgendwann zu üppig. Noch viel problematischer ist aber das “Überspringen”. Wenn man einen parallelen Bus hat, welcher auf jeder Datenleitung ein Bit überträgt, und die Hertz-Zyklen dabei sehr hoch einstellt, so kann es sein, dass durch die Spannung und die hohe Frequenz ein Nebenanliegendes Kabel beeinflusst wird. Haben wir also 3 Leitungen, und nur die mittlere soll eine Binär-1 darstellen, so kann bei einer hohen Frequenz das anliegende Kabel auch zur Binär-1 interpretiert werden. Da das auf physikalischen Gesetzen beruht, ist es nur durch dickere Abschmirmung möglich, diesem entgegenzuwirken. Da der Daten und Leistungshunger der Menschen aber nie wirklich gestillt sein wird, wurde irgendwann ein anderes Kabel-System, entwickelt, welches bis heute immer weiter optimiert und ergänzt wurde: Das seriell- System. Serielle Kabel und Busse haben gegenüber Parallelbussen mittlerweile nicht nur platz- sondern auch leistungsbezogene Vorteile. Daten, die vorher über 24-adrige Kabel geschickt werden mussten, sind plötzlich auch über 4-adrige Kabel verfügbar. Durch immer schneller werdende Hardware, wie zum Beispiel Multi- und Demultiplexer und Schieberegister, werden serielle Busse auch bei zeitkritischen Anwendungen immer interessanter. Das Prinzip der binären Übertragung ist nach wie vor dasselbige. Doch wie werden so große Datenbreiten über ein so schmales Kabel geschickt?
Wir werden das Prinzip an einer synchronen seriellen Datenübertragung erklären:
Das Sendergerät legt an einem parallelen Ausgang seinen zu übertragenden Wert an. Dieser Ausgang ist mit einem so genannten Demultiplexer verbunden. Ein Demultiplexer hat (jetzt nur um die Funktionsweise zu erklären) 3 Eingänge, und einen Ausgang. Am Ersten Eingang liegt das zu übertragende, noch parallele Signal an. Am zweiten Eingang sitzt ein Binärzähler, der auf eine bestimmte Größe angepasst ist. Zum Beispiel 9 (um genau 1 Byte + Freigabebyte zu übertragen). An dem Binärzähler ist wiederum ein Taktgeber, welcher dem Zähler in einer bestimmten Hertz-Zahl sagt, wann er „weiter zählen“ soll. Am Ausgang des Demultiplexers ist eine einzelne
Datenader angeschlossen, welche zum Eingang eines so genannten Schieberegisters führt.
Der Sender der Daten legt nun also das Signal an den Demultiplexer an, und setzt den Binärzähler zurück. Der Binärzähler fängt jetzt an zu „zählen“, und legt die aktuelle Zählposition an den
zweiten Eingang des Demultiplexers. Der Demultiplexer legt das jeweilige Signal an seinen Ausgang an: Ist der Binärzähler bei 1, so wird das erste Signal des parallel anliegenden Signals an den einzelnen Ausgang angelegt. Ist der Binärzähler bei 2, so wird das zweite Signal des parallel anliegenden Signals an den Ausgang gelegt- und so weiter. Auf der Gegenseite passiert ähnliches: Jedes Mal, wenn der Taktgeber ausschlägt, wird das Signal am Eingang des Schieberegister weitergegeben. Ein Schieberegister kann ein Signal, welches gerade anlag „verschieben“. Dadurch ist es möglich, binäre Daten, wie in einer Schlange an der Einkaufskasse zu verarbeiten. So „schiebt“ sich das Gesamtsignal immer weiter. Kommt der Binärzähler bei 9 an, so wird auf der Senderseite der Demultiplexer zurückgesetzt, und auf der Empfängerseite der Ausgang des Schieberegisters freigegeben. Am Ausgang des Schieberegisters liegt jetzt also das parallele Signal an, welches anfangs am Eingang des Demultiplexers lag.
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!