hi, ich muß euch leider mal wieder nerven, aber ich habe eine Frage, die mich beschäftigt.(Ich weiß zwar net ganzs, obs hier reinpasst, aber ich fand auch nichts anderes).
Wie kann man eine Win32-Anwendung schreiben, mit der man die elektrischen Impulse an einer Schnittstelle, beispielsweise COM1 oder COM2 steuern und regulieren kann. Mein Plan ist es, einen Motor an den PC anzuschließen, und ich bräuchte dann halt einen kleinen Impuls, um über Verstärker(extern) den Motor zum laufen zu bringen. Geht das überhaupt? Andererseits ist es doch auch so, dass beispielsweise ein Drucker auch Impulse über bestimmte Pole der Schnittstelle erhält, warum sollte man die dann nicht auch einzeln ansteuern können? Bin über jeden Hinweis überaus dankbar,
Gruß und FROHE PFINGSTEN, konstantin
CPORT.H
[cpp]/******************************************/
/* made by */
/* */
/*mm mm y y n nnn oo n nnn a */
/*m m m m y y nn n o o nn n a a */
/*m m m y n n o o n n aaaaa*/
/*m m y n n oo n n a a*/
/* */
/* www.mynona.de.vu */
/******************************************/
#define WRONG_PORT 100
#define ON true
#define OFF false
class ComPort
{
public:
int SetOPEN (int PORT);
int SetCLOSE (void);
int SetDTR (bool mode);
int SetRTS (bool mode);
int SetTXD (bool mode);
bool GetCTS ();
bool GetDSR ();
void SetAll (bool mode);
};[/cpp]
CPORT.CPP
[code]/******************************************/
/* made by */
/* */
/*mm mm y y n nnn oo n nnn a */
/*m m m m y y nn n o o nn n a a */
/*m m m y n n o o n n aaaaa*/
/*m m y n n oo n n a a*/
/* */
/* www.mynona.de.vu */
/******************************************/
also erst einmal vielen dank für diese umfangreiche antwort, aber ich hab noch ein paar fragen dazu:
wieso die funktion CreateFile() ?
was bedeutet SetDTR,SetRTS und SetTXD ? Was macht man damit ?
Was macht GetDTS? bzw GetCommModemStatus?
Was macht GetDSR ?
Die COM-Schnittstellen sind doch 25-polig,oder?
Wie kann ich gezielt zwei Pole ansteuern?
Liegt dann an jedem Pol, der einen Impul gibt, Plus an oder kann man die Polung des Pols auch bestimmen ?
So, ich glaub das reicht erstmal. Nochmals vielen Dank für eure umfangreiche Hilfe, das find ich echt sehr nett...
@Konstantin
Ich empfehle dir dringendst dich erstmal technisch über die COM-Schnittstellen zu informieren. Wenn du solche Fragen stellst, dann vermute ich mal, dass du überhaupt keine Ahnung von den seriellen Schnittstellen hast.
Also zu Erklärung....
Die COM-Schnittstellen sind normalerweise 9-polig (es gibt auch 25-polige ).
CreateFile() heißt: Du machst einen Stream auf zur COM-Schnittstelle, wie bei einer normalen Datei.
DTR, RTS, TxD, DTS, DSR und RxD sind einzelnen Pins an einer bestimmten vordefinierten Stelle der Schnittstelle. Welche genau kann ich dir jetzt leider auch nicht sagen, aber da gibts sicher Infos im WWW (hab schonmal was dazu gefunden mit Bildern ).
GetCommModemStatus() ist dazu da, um den Status, der angegebenen COM-Schnittstelle zu ermittelt. Einschließlich der Zustände der einzelnen Pins.
Zusätzlich gibt es noch den Pin GND (auch Ground genannt). Das und nur das ist der Minuspol!! Alle anderen 8 Pins bzw. 24 Pins sind pluspolig! Außerdem bringen die Schnittstellen normalerweise nur einen durchschnittliche Leistung von 5 V! Um so länger das Kabel von der Schnittstelle weggeht um so niedriger wird die Leistung, was eigentlich logisch ist .
@AJ
in der Tat bin ich auf diesem Gebiet leider nicht sehr bewandert, es ist aber dringend notwenig, zu erfahren wie das läuft, also entschuldige meine nervige Fragerei, aber eine bitte hätt ich noch:
könntest du mir vielleicht ein kleines Beispiel posten, wie ich an einem Pin eine Spannung anlegen kann, um zum beispiel eine LED an diesen Pin mit dem einen Ende(der Anode) anzuschliessen und mit dem anderen Ende an der Masse(umständlich formuliert, aber ich bin recht müde). Wie muss dann der Code geschrieben sein? Muss ich dann einfach nur nach initialisierung die Methode z.B. .SetRTS(TRUE) aufrufen, und bis die methode SetRTS(FALSE) aufgerufen wird, fließt dann ein Strom ? Das wäre ja dann in der tat recht simpel. Also nochmals vielen Dank, gruß Konstantin
void blinkeLED(int sek, int anz, int millisek)
{
ComPort comp; //erzeuge Objekt für Schnittstelle
comp.SetOPEN(1); //Öffne COM1 (GND hat ab jetzt Strom)
while(!kbhit()) //Prüft ob eine Taste gedrückt wurde
{
blinke(comp, anz, millisek);
sleep(sek); //wartet sek Sekunden bis es weitergeht
}
getch(); //fängt die Eingabe ab if(kbhit()) //wenn nötig
getch(); //ein zweites mal (Sondertasten)
comp.SetCLOSE(); //Schließt Schnittstelle (Alle Pins kein Strom)
}
void blinke(ComPort comp, int anz, int millisek)
{
int i;
for(i=0;i<anz;++i)
{
comp.SetRTS(TRUE); //Strom auf RTS-Leitung (LED leuchtet)
Sleep(millisek); //wartet millisek Millisekunden bis es weitergeht
comp.SetRTS(FALSE); //Strom weg von RTS-Leitung (LED aus)
}
}
void blinkeLED(int sek, int anz, int millisek)
{
ComPort comp; //erzeuge Objekt für Schnittstelle
comp.SetOPEN(1); //Öffne COM1 (GND hat ab jetzt Strom)
while(!kbhit()) //Prüft ob eine Taste gedrückt wurde
{
blinke(comp, anz, millisek);
sleep(sek); //wartet sek Sekunden bis es weitergeht
}
getch(); //fängt die Eingabe ab if(kbhit()) //wenn nötig
getch(); //ein zweites mal (Sondertasten)
comp.SetCLOSE(); //Schließt Schnittstelle (Alle Pins kein Strom)
}
void blinke(ComPort comp, int anz, int millisek)
{
int i;
for(i=0;i<anz;++i)
{
comp.SetRTS(TRUE); //Strom auf RTS-Leitung (LED leuchtet)
Sleep(millisek); //wartet millisek Millisekunden bis es weitergeht
comp.SetRTS(FALSE); //Strom weg von RTS-Leitung (LED aus)
}
}
void blinkeLED(int sek, int anz, int millisek)
{
ComPort comp; //erzeuge Objekt für Schnittstelle
comp.SetOPEN(1); //Öffne COM1 (GND hat ab jetzt Strom)
while(!kbhit()) //Prüft ob eine Taste gedrückt wurde
{
blinke(comp, anz, millisek);
sleep(sek); //wartet sek Sekunden bis es weitergeht
}
getch(); //fängt die Eingabe ab if(kbhit()) //wenn nötig
getch(); //ein zweites mal (Sondertasten)
comp.SetCLOSE(); //Schließt Schnittstelle (Alle Pins kein Strom)
}
void blinke(ComPort comp, int anz, int millisek)
{
int i;
for(i=0;i<anz;++i)
{
comp.SetRTS(TRUE); //Strom auf RTS-Leitung (LED leuchtet)
Sleep(millisek); //wartet millisek Millisekunden bis es weitergeht
comp.SetRTS(FALSE); //Strom weg von RTS-Leitung (LED aus)
}
}
Wenn du jetzt blinkeLED(2, 3, 300) z. B. aus main() aufrufst, dann blinkt dein angeschlossenes LED alle zwei Sekunden dreimal im Abstand von 300 Millisekunden. Pass aber auch auf, dass das LED passt! Sonst gehts kaputt oder es leuchtet erst gar nicht.
Kleine Korrektur an mich: Es sind nicht 5 V sondern durchschnittlich 8 V, die anliegen an den Pins!!!
@mynona
Mir ist aufgefallen, dass dein Code noch nicht ganz ausgereift ist. Was ist z. B. wenn man zuerst COM1 öffnet, offen lässt und dann noch COM2 öffnet? Die Variable hCom wird dann vom zweiten Öffnen überschrieben, aber was ist dann mit COM1??? Ich würde empfehlen hCom auch in die Klasse mit einzubinden und nicht als einzige globale Variable .
Globale Variablen sind immer schlecht ... wohl auch hier. Hab keine Ahnung von Ports ... aber ne Klasse ist immer gut ! Werd mir das mal genauer ansehen - vielleicht kann man da auch was lernen.
@AJ: Wär tatsächlich was für die FAQ ... wenn der Thread fertig ist schieb ich ihn dorthin - hier am besten ohne Veränderung: Ich kenn mich sowieso nicht aus, und es sind keine Schrott-Postings hier.
@aj die klasse habe ich fürn eigen betrieb geschrieben, und ich öffne doch nicht 2 coms nacheinander mit einem handle, naja auch da testen ob handle funtzt usw überprüfen,etc aber für mich war des unwichtig weil ich mir dachte du passt da schon uf
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum nicht antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.