Verwendung der Klasse zur Ansteuerung einzelner Leitungen der ser. Schnittstelle
-
Hallo,
ich möchte die Klasse cport.h aus der FAQ:
http://www.c-plusplus.net/forum/39312-10
verwenden und hab mir dazu folgenes Testprogramm geschrieben:#include <iostream> #include <conio.h> #include "cport.h" using namespace std; void puls(ComPort port, int millisekunden) { port.SetRTS(ComPort::ON); Sleep(millisekunden); port.SetRTS(ComPort::OFF); } int main() { ComPort SPI_Port; char pressed_key = '0'; if (SPI_Port.OpenCom(1) == ComPort::COMM_OK) { while (pressed_key != 'q' ) // Beenden der schleife wenn q gedrückt wurde { if (kbhit()) { puls(SPI_Port, 20); pressed_key = getch(); } } } else { cout << "Error: Comm not open" << flush; } return 0;
Jetzt mein Problem:
die Zeile puls(SPI_Port,20) wird beim ersten mal korrekt durchlaufen beim zweiten mal wird direkt nach dem ende dieser Funktion CloseCom() ausgeführt. Meine Untersuchungen erbrachten dass am Ende der zweiten Ausführung von von puls() der Destructor aufgerufen wird, welcher CloseCom() aufruft.
Welche Gründe kann es geben, dass mitten in der Programmausführung der Destruktor ausgeführt wird und welche Möglichkeiten gibt es diesem Problem näher auf den Grund zu gehen.Für Anregugnen und Tips schon jetzt recht herzlichen Dank.
Viele Grüße
Resetpin
PS. Comipler MinGW, IDE Code::Blocks
-
Du übergibst eine Kopie von ComPort, die nach dem Verlassen der Funktion wieder zerstört wird.
Du kannst das Problem vermutlich beheben, indem du Referenzen benutzt. Falls du nicht weißt was das ist solltest du dir dazu unbedingt was durchlesen.
Versuch es also mal so:
void puls(ComPort& port, int millisekunden) // Man beachte das hinzugefügte & { port.SetRTS(ComPort::ON); Sleep(millisekunden); port.SetRTS(ComPort::OFF); }
Übrigens ein Lob für deine gute Fehlerbeschreibung und deine Eigeninitiative bei der Suche des Fehlers.
Ich konnte den Fehler so schnell finden und dir diese Antwort präsentieren. Weiter so!
-
Hallo,
vielen Dank für die Hilfe und die gute Erklärung.
Nachdem ich zunächst ziemlich ratlos war führte ich mir nochmals vor Augen warum der Destruktor aufgerufen wird und wann denn soetwas passiert, doch nur wenn ein Objekt zerstört wird. Da ich in main() das Objekt noch nicht zerströte musste es in der Funktion pulse() geschehen und das erkannte ich dass ich eine Kopie des Objektes erzeugte und keine Übergabe per Referenz vorgenmommen hatte, ergo wurde nach dem Beenden der Funktion die Kopie zerstört und der Destruktor schlug zu.
Vielen Dank auch für Dein Lob bezüglich der Fehlerbeschreibung, hat mich sehr gefreut.
Viele Grüße
Resetpin