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 Zurück  1, 2, 3, 4  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
AJ
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.10.2001
Beiträge: 3727
Beitrag AJ Mitglied 08:16:00 21.05.2002   Titel:              Zitieren

@mynona
Naja ich pass da schon auf, sonst wärs mir ja gar nicht aufgefallen ;). Hab deinen Code für mich auch ein wenig umgeändert, damit man mehrere COM-Ports öffnen kann. Vielleicht erweitere ich es auch noch um ein paar Abprüfungen und Spielereien :D.
Werbeunterbrechung
SideWinder
Moderator

Benutzerprofil
Anmeldungsdatum: 19.10.2001
Beiträge: 19109
Beitrag SideWinder Moderator 08:21:00 21.05.2002   Titel:              Zitieren

Den endgültigen Code könntest du dann hier posten - dann kommt der Thread auch endgültig in die FAQ.

MfG SideWinder

_________________
http://www.dilbert.com/2009-06-11/
http://www.dilbert.com/2009-06-14/
mynonA
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.10.2001
Beiträge: 587
Beitrag mynonA Mitglied 11:39:00 21.05.2002   Titel:              Zitieren

ich?
seitdem windows gecrasht ist und ich zu faul war auf anmelden zu klicken und mynona + mein passwort einzutragen, zuviel arbeit :)

_________________
--keine sig vorhanden--
AJ
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.10.2001
Beiträge: 3727
Beitrag AJ Mitglied 17:58:00 24.05.2002   Titel:              Zitieren

So jetzt hab ich mir mal die Zeit genommen und die Klasse fertig geschrieben. Ich poste sie jetzt mal hier rein:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#ifndef CPORT_H
#define CPORT_H "cport.h"

#include <windows.h>

 
class ComPort
{
private:
   HANDLE hCom;
public:
   enum {OFF,ON};
   enum {MAX_PORT = 6};
   enum {STATE_ERR = -3, OPEN_ERR, WRONG_PORT, COMM_OK};
 
   ComPort(void);
   ~ComPort(void);
 
   HANDLE GetHCom(void);
 
   int OpenCom(int portnr);
   void CloseCom(void);
 
   BOOL SetUART(DCB *dcb);
   BOOL SetUART(long baud, char bytes, char parity, char stopbit);
 
   BOOL SetTimeouts(COMMTIMEOUTS *timeouts);
   BOOL SetTimeouts(long interval, int multiplier, int constant);
 
   void SetDTR(int kz);
   void SetRTS(int kz);
   void SetTXD(int kz);
   void SetAll(int kz);
   void SetAll(int dtr, int rts, int txd);
 
   BOOL GetCTS(void);
   BOOL GetDSR(void);
 
   unsigned long Send(const char *text);
   unsigned long Receive(char *text, size_t maxsize);
 
   static const char *GetCP(int index);
};

#endif


cport.c
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
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#include "cport.h"
 
ComPort::ComPort(void)
{
   hCom=INVALID_HANDLE_VALUE;
}
 
ComPort::~ComPort(void)
{
   CloseCom();
}
 
HANDLE ComPort::GetHCom(void)
{
   return hCom;
}
 
int ComPort::OpenCom(int portnr)
{
   DCB dcb;
   BOOL res;
 
   if(portnr<=0||portnr>MAX_PORT)
      return(WRONG_PORT);
 
   hCom = CreateFile(GetCP(portnr-1), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
   if(hCom==INVALID_HANDLE_VALUE)
      return(OPEN_ERR);
 
   res=GetCommState(hCom, &dcb);
   if(!res)
   {
      CloseCom();
      return(STATE_ERR);
   }
 
   return(COMM_OK);
}
 
void ComPort::CloseCom()
{
   CloseHandle(hCom);
   hCom=INVALID_HANDLE_VALUE;
}
 
BOOL ComPort::SetUART(DCB *dcb)
{
   if(hCom!=INVALID_HANDLE_VALUE)
      return(SetCommState(hCom, dcb));
   else
      return(false);
}
 
BOOL ComPort::SetUART(long baud, char bytes, char parity, char stopbit)
{
   if(hCom!=INVALID_HANDLE_VALUE)
   {
      DCB dcb;
 
      dcb.BaudRate=baud;
      dcb.ByteSize=bytes;
      dcb.Parity=parity;
      dcb.StopBits=stopbit;
 
      return(SetCommState(hCom, &dcb));
   }
   else
      return(false);
}
 
BOOL ComPort::SetTimeouts(COMMTIMEOUTS *timeouts)
{
   if(hCom!=INVALID_HANDLE_VALUE)
      return(SetCommTimeouts(hCom, timeouts));
   else
      return(false);
}
 
BOOL ComPort::SetTimeouts(long interval, int multiplier, int constant)
{
   if(hCom!=INVALID_HANDLE_VALUE)
   {
      COMMTIMEOUTS timeouts;
 
      timeouts.ReadIntervalTimeout=interval;
      timeouts.ReadTotalTimeoutMultiplier=multiplier;
      timeouts.ReadTotalTimeoutConstant=constant;
 
      return(SetCommTimeouts(hCom, &timeouts));
   }
   else
      return(false);
}
 
void ComPort::SetDTR(int kz)
{
   if(hCom!=INVALID_HANDLE_VALUE)
      if(kz==ON)
         EscapeCommFunction(hCom, SETDTR);  // setzen
      else
         EscapeCommFunction(hCom, CLRDTR);  // Loeschen  
}
 
void ComPort::SetRTS(int kz)
{
   if(hCom!=INVALID_HANDLE_VALUE)
      if(kz==ON)
         EscapeCommFunction(hCom, SETRTS);  // setzen
      else
         EscapeCommFunction(hCom, CLRRTS);  // Loeschen      
}
 
void ComPort::SetTXD(int kz)
{
   if(hCom!=INVALID_HANDLE_VALUE)
      if(kz==ON)
         EscapeCommFunction(hCom, SETBREAK);  // setzen
      else
         EscapeCommFunction(hCom, CLRBREAK);  // Loeschen    
}
 
void ComPort::SetAll(int kz)
{
   SetAll(kz, kz, kz);
}
 
void ComPort::SetAll(int dtr, int rts, int txd)
{
   SetDTR(dtr);
   SetRTS(rts);
   SetTXD(txd);
}
 
BOOL ComPort::GetCTS(void)
{
   if(hCom!=INVALID_HANDLE_VALUE)
   {
      DWORD COMStatus;
 
      GetCommModemStatus(hCom, &COMStatus);  
      if(COMStatus & MS_CTS_ON)
         return ON;
 
      return OFF;
   }
   else
      return OFF;
}
 
BOOL ComPort::GetDSR(void)
{
   if(hCom!=INVALID_HANDLE_VALUE)
   {
      DWORD COMStatus;
 
      GetCommModemStatus(hCom, &COMStatus);  
      if(COMStatus & MS_DSR_ON)
         return ON;
 
      return OFF;
   }
   else
      return OFF;
}
 
unsigned long ComPort::Send(const char *text)
{
   if(hCom!=INVALID_HANDLE_VALUE)
   {
      unsigned long sent;
 
      WriteFile(hCom, text, strlen(text), &sent, NULL);
 
      return(sent);
   }
   else
      return(0);
}
 
unsigned long ComPort::Receive(char *text, size_t maxsize)
{
   if(hCom!=INVALID_HANDLE_VALUE)
   {
      unsigned long received;
 
      ReadFile(hCom, text, maxsize, &received, NULL);
      text[received]=0;
 
      return(received);
   }
   else
      return(0);
}
 
const char *ComPort::GetCP(int index)
{
   static const char *CP[]={"COM1","COM2","COM3","COM4","COM5","COM6"};
 
   if(index>-1&&index<ComPort::MAX_PORT)
      return(CP[index]);
   else
      return("");
}


Mit freundlicher Unterstützung von mynona, die das Grundgerüst lieferte und der Webseite http://www.htl-rankweil.vol.at/lhr/ze/c/serialport.html , auf der einige nützliche Informationen über die seriellen Schnittstellen stehen.

Wenn ihr irgendwelche Fehler entdeckt, schreibt mir bitte eine E-Mail, damit ich es korrigieren kann. Ihr könnt auch gerne mit einer E-Mail die Quellcodedateien anfordern bei mir.

Wäre nett, wenn sich Marc++us vielleicht dazu bereit erklärt, die Dateien auf dem Server zum Download bereitzustellen.

WICHTIG!!!
Ich hab die Dateien mit dem Compiler Borland 5.5 compiliert. Es gibt also keine Gewährleistung, dass der Quellcode bei jedem Compiler funktioniert (Feedback obs geht, wäre spitze). Ich konnte den Quellcode auch leider nicht direkt Testen, da mir dazu momentan die Mittel fehlen (auch hier wäre Feedback erwünscht).

Edit: //aj: Verbesserung des Quellcodes (statt static const -> ENUM; deutschsprachige Methoden in englisch unbenannt)

[ Dieser Beitrag wurde am 24.05.2002 um 23:52 Uhr von AJ editiert. ]


Zuletzt bearbeitet von SideWinder am 23:25:44 28.06.2010, insgesamt 1-mal bearbeitet
SideWinder
Moderator

Benutzerprofil
Anmeldungsdatum: 19.10.2001
Beiträge: 19109
Beitrag SideWinder Moderator 19:15:00 24.05.2002   Titel:              Zitieren

@AJ: Wieso machst du aus deinen ganzen static-Konstanten keine Enums? Zudem ist eigentlich alles durchgehend in Englisch, nur das hier nicht:
C++:
HANDLE HolHCom(void);

Bin ich richtig in der Annahme, das das "Hol Handle Com-Port" heißen soll?

Zudem würde ich nie ein Handle zurückgeben, der User kann dann mit CloseHandle() deinen Com-Port schließen, ohne das dies deine Klasse merkt.

MfG SideWinder

_________________
http://www.dilbert.com/2009-06-11/
http://www.dilbert.com/2009-06-14/
firefly
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.04.2002
Beiträge: 595
Beitrag firefly Mitglied 21:11:00 24.05.2002   Titel:              Zitieren

@SideWinder

du meinst das mit den enums wohl so oder :

anstelle von
C++:
1
2
3
4
5
6
7
8
9
     static const int MAX_PORT=6;
   
   static const int ON=1;
   static const int OFF=0;
   
   static const int COMM_OK=0;
   static const int WRONG_PORT=-1;
   static const int OPEN_ERR=-2;
   static const int STATE_ERR=-3;


meintest du wohl so
C++:
 enum {OFF,ON};
   enum {MAX_PORT = 6};
   enum {COMM_OK};
   enum {STATE_ERR = -3, OPEN_ERR, WRONG_PORT};
oder ?

[ Dieser Beitrag wurde am 24.05.2002 um 22:12 Uhr von firefly editiert. ]

_________________
Ein Ring, sie zu knechten, sie alle zu finden,
Ins Dunkel zu treiben und ewig zu binden
Im Lande Mordor, wo die Schatten drohn.
SideWinder
Moderator

Benutzerprofil
Anmeldungsdatum: 19.10.2001
Beiträge: 19109
Beitrag SideWinder Moderator 21:15:00 24.05.2002   Titel:              Zitieren

Yo, das mein ich!

MfG SideWinder

_________________
http://www.dilbert.com/2009-06-11/
http://www.dilbert.com/2009-06-14/
AJ
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.10.2001
Beiträge: 3727
Beitrag AJ Mitglied 22:35:00 24.05.2002   Titel:              Zitieren

@Side
Lässt sich ja noch ändern ;)
Übrigens merkt meine Klasse schon, ob das Handle geschlossen wurde von außen. Was meinst du wofür ich bei jeder Methode eine Abfrage eingebaut hab, ob es ein INVALID_HANDLE_VALUE ist? Ich vermute mal, dass CloseFile() schon so klug ist und den Handle auf diesen Wert setzt. Habs nur sicherheitshalber beim Schließen eingebaut, falls doch nicht ;).

Falls es nicht auf den Wert gesetzt wird und das macht jemand, dass er das Handle einfach von außen schließt und greift dann nochmal drauf zu, dann kann ich ihm auch nicht helfen. Ich kann nicht jeden Fehler jedes potenziellen Programmierers abfangen. Da würde ich ja ewig dran rumprogrammieren.

Etwas Selbstinitiative erwarte ich schon, z. B. dass man sich informiert über die seriellen Schnittstellen bevor man damit rumspielt. Deswegen hab ich auch den Link hinzugefügt.

Ich kann ja noch ein Beispiel dazu angeben, wie man es verwendet. Jetzt ändere ich erstmal den Code um, wegen den ENUMS und der Sprachunterschiede.
Mis2com
Mitglied

Benutzerprofil
Anmeldungsdatum: 30.03.2002
Beiträge: 2752
Beitrag Mis2com Mitglied 11:58:00 25.05.2002   Titel:              Zitieren

@mynonA:
Du bist erst 13 und kannst schon sowas??????????????????????????
Oh schei*e!!!!!!!!
Du bist ja echt sup er!
Der Thread witrd aber gefaqt!

_________________
Erfolg = Motivation
SideWinder
Moderator

Benutzerprofil
Anmeldungsdatum: 19.10.2001
Beiträge: 19109
Beitrag SideWinder Moderator 15:58:00 25.05.2002   Titel:              Zitieren

Yo, sicherlich aber ich warte noch auf weitere Verbesserungsvorschläge zu Mynonas und AJs Klasse.

Nur perfekt ist gut genug ;).

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 Zurück  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.