Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: FAQ - DOS und Win32-Konsole ::  Ströme lenken  
Gehen Sie zu Seite 1, 2, 3, 4  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
konstantin
Unregistrierter




Beitrag konstantin Unregistrierter 20:33:00 19.05.2002   Titel:   Ströme lenken            Zitieren

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
Werbeunterbrechung
mynona
Unregistrierter




Beitrag mynona Unregistrierter 20:37:00 19.05.2002   Titel:              Zitieren

schau dir meine klasse an

CPORT.H
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/******************************************/
/*             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*/
/*                                        */
/*                        */
/******************************************/

#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);
};


CPORT.CPP
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/******************************************/
/*             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*/
/*                                        */
/*                        */
/******************************************/
 
 
#include <windows.h>
#include "CPORT.H"
 
HANDLE hCom;
DWORD COMStatus;
 
int ComPort::SetOPEN(int PORT)
{
    if(PORT<=0&#0124;&#0124;PORT>4)
    {
        return WRONG_PORT;
    }
    char*CP[]={"COM1","COM2","COM3","COM4"};
    hCom = CreateFile(CP[PORT-1],
    GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    0,              
    NULL);    
 
    return 0;
}
 
 
int ComPort::SetCLOSE()
{
    CloseHandle(hCom);
    return 0;
}
 
int ComPort::SetDTR(bool mode)
{
   
    if(mode==ON)
    {  
        EscapeCommFunction(hCom, SETDTR);  // setzen
    }
    else
    {
        EscapeCommFunction(hCom, CLRDTR);  // Loeschen  
    }
 
    return 0;
}
 
int ComPort::SetRTS(bool mode)
{
    if(mode==ON)
    {  
        EscapeCommFunction(hCom, SETRTS);  // setzen
    }
    else
    {
        EscapeCommFunction(hCom, CLRRTS);  // Loeschen      
    }
    return 0;
}
 
int ComPort::SetTXD(bool mode)
{
    if(mode==ON)
    {  
        EscapeCommFunction(hCom, SETBREAK);  // setzen
    }
    else
    {
        EscapeCommFunction(hCom, CLRBREAK);  // Loeschen    
    }
    return 0;
}
 
 
 
bool ComPort::GetCTS()
{
    GetCommModemStatus(hCom, &COMStatus);  
    if(COMStatus & MS_CTS_ON)
    {
        return ON;
    }
    return OFF;
}
 
bool ComPort::GetDSR()
{
    GetCommModemStatus(hCom, &COMStatus);  
    if(COMStatus & MS_DSR_ON)
    {
        return ON;
    }
    return OFF;
}
void  ComPort::SetAll (bool mode)
{
    SetRTS(mode);
    SetTXD(mode);
    SetDTR(mode);
}
AJ
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.10.2001
Beiträge: 3727
Beitrag AJ Mitglied 21:54:00 19.05.2002   Titel:              Zitieren

@mynona
Nicht schlecht. Wobei ich TxD nicht ständig auf Impuls setzen würde ;). Zumindest nicht bei normalen Gebrauch der COM-Schnittstellen.
konstantin
Unregistrierter




Beitrag konstantin Unregistrierter 22:04:00 19.05.2002   Titel:              Zitieren

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...
AJ
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.10.2001
Beiträge: 3727
Beitrag AJ Mitglied 22:28:00 19.05.2002   Titel:              Zitieren

@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 ;).

@Side
Wär vielleicht mal interesant für die FAQ ;)
konstantin
Unregistrierter




Beitrag konstantin Unregistrierter 23:59:00 19.05.2002   Titel:              Zitieren

@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
AJ
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.10.2001
Beiträge: 3727
Beitrag AJ Mitglied 11:36:00 20.05.2002   Titel:              Zitieren

@konstantin
Na klar mach ich gern. Ich schreib dir jetzt mal einfach zwei Funktionen mit einer kleinen Spielerei für das LED ;D

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "cport.h"
 
...
 
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 ;).
SideWinder
Moderator

Benutzerprofil
Anmeldungsdatum: 19.10.2001
Beiträge: 19173
Beitrag SideWinder Moderator 12:05:00 20.05.2002   Titel:              Zitieren

Globale Variablen sind immer schlecht ... wohl auch hier. Hab keine Ahnung von Ports ... aber ne Klasse ist immer gut :eek:! 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.

MfG SideWinder

_________________
http://www.dilbert.com/2009-06-11/
http://www.dilbert.com/2009-06-14/
mynona
Unregistrierter




Beitrag mynona Unregistrierter 13:38:00 20.05.2002   Titel:              Zitieren

@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
SideWinder
Moderator

Benutzerprofil
Anmeldungsdatum: 19.10.2001
Beiträge: 19173
Beitrag SideWinder Moderator 14:57:00 20.05.2002   Titel:              Zitieren

@mynona: Seit wann bist du nicht mehr registriert?

MfG SideWinder

_________________
http://www.dilbert.com/2009-06-11/
http://www.dilbert.com/2009-06-14/
C++ Forum :: FAQ - DOS und Win32-Konsole ::  Ströme lenken  
Gehen Sie zu Seite 1, 2, 3, 4  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net 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 und www.c-plusplus.net 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.