getline hängt alles auf
-
Hi erst ma mein Quellcode:
#ifndef GETNCLASS_H #define GETCLASS_H #include <QString> #include <QWidget> #include <QObject> #include <QVBoxLayout> #include <fstream> #include <string> #include <QListWidget> #include <QLabel> #include <QPushButton> class GetClass : public QWidget { Q_OBJECT public: GetClass(QWidget *parent=0); private: QVBoxLayout *layout; QListWidget *list; QLabel *label; QPushButton *empfang; public slots: void getText(); }; #endif#include "getclass.h" GetClass::GetClass(QWidget *parent): QWidget(parent) { list = new QListWidget; label = new QLabel("Empfangen"); empfang = new QPushButton("empfang"); layout = new QVBoxLayout(this); layout->addWidget(label); layout->addWidget(list); layout->addWidget(empfang); setLayout(layout); connect( empfang, SIGNAL(clicked()), this, SLOT(getText()) ); } void GetClass::getText() { std::string a; std::ifstream get("/dev/ttyS0"); if (get) { if(!get.eof()) { getline(get,a); QString b(a.c_str()); list->addItem(b); } get.close(); } }Ja ich weiss hier ist nur nach Iso xD aber meine Frage bezieht sich auch auf diesen.
In der Funktion getText()
hab ich das Problem das wenn immer ich sie starte sich alles durch das getline aufhängt.
Wie verhindere ich das und wenn dies nicht geht gibt es alternativen???schon ma thx
Gruss Irods
-
Die Fehlerbeschreibung ist ein wenig dürftig. Kannst du die ein wenig näher erläutern?
Übrigens, die Methode
eof()gibt an, wann das Flageofbitgesetzt wurde.eofbitwird allerdings erst gesetzt, nachdem ein Versuch gestartet wurde, über das Ende hinaus zu lesen. Du solltest besser nach der Leseoperation prüfen, ob diese erfolgreich war. Am einfachsten geht das so:void GetClass::getText() { std::string a; std::ifstream get("/dev/ttyS0"); if(std::gelinte(get, a)) { // getline(get,a); <- Fehler von mir, im Edit rausgenommen QString b(a.c_str()); list->addItem(b); } }get.close()musst du auch nicht aufrufen, dass wird automatisch vom Destruktor vonstd::ifstreamerledigt.Grüssli
-
Hi Dravere,
schon mal danke für die schnelle Antwort.
Also ich hab das jetzt nach deiner Metode probiert also:void GetClass::getText() { std::string a; std::ifstream get("/dev/ttyS0"); if(std::getline(get, a)) { getline(get,a); QString b(a.c_str()); list->addItem(b); } }Jedoch tritt genau das selbe Problem wie bei mir auf.
Also wenn ich den Button "empfang" an klicke hängt sich alles auf und ich muss mein ganzes Programm killn.
Bei der Kompilierung meckert er nicht, deswegen geh ich von irgend einer Endlosschleife die irgend wo läuft z.B. in getline aus die das verursacht.
-
Irods schrieb:
..., deswegen geh ich von irgend einer Endlosschleife die irgend wo läuft z.B. in getline aus die das verursacht.
Also ist es eine reine Vermutung? Geh doch mal mit dem Debugger durch, dann sollte schnell klar werden, bei welcher Funktion der Code hängen bleibt.
Wenn es wirklich bei
getlineist, dann hängt dies mit dem OS zusammen. War/dev/ttyS0nicht ein File für ein IO Gerät? (Bin nicht so der Linux-Pro ;))
Dann wartet das OS womöglich auf Input von diesem Gerät, oder es kommt nie das Trennzeichen'\n'.Aber eben, prüfe zuerst mit dem Debugger nach, ob es wirklich an dieser Funktion hängt. Alternativ kannst du auch mit Meldungen im Code arbeiten, damit du einordnen kannst, bis wohin der Code ausgeführt wird. Die Verwendung eines Debuggers solltest du aber schon lernen, da er einem das Leben sehr vereinfachen kann.
Grüssli
-
also wenn ich beide getlines auskommentiere hängt sich nichts auf und ja sry das ichs vergessen hab zu sagen "/dev/ttyS0" is mein serieller port
also so hängt sich nichts auf:
void GetClass::getText() { std::string a; std::ifstream get("/dev/ttyS0"); // if(std::getline(get, a)) { // getline(get,a); QString b(a.c_str()); list->addItem(b); } }
-
So hab auch eben mal ausprobiert selbst wenn ich die Schnittstelle zu spam dann hängt er sich auf

-
Aber dein serieller Port ist kompatibel zu den C++-Streams?
-
Lies doch mal Zeichenweise zum Test.
-
Hab mal deinen Tipp ausprobiert
void GetClass::getText() { char a[5]; std::ifstream get("/dev/ttyS0"); if(get.getline(a, 5)) { get.getline(a, 5); // QString b(a.c_str()); QString b=a; list->addItem(b); } }leider mit dem selben Resultat wie vorher

-
@Irods,
1. Ich habe einen Fehler im Code gemacht. Habe ihn per Edit korrigiert. Das zweite getline ist unnötig, bzw. sogar falsch. Also weg damit. Aber das ist nur ein Fehler von mir und hängt nicht mit dem Problem zusammen, nehme ich zumindest an.
2. Wie spamst du die Sache denn zu? Was willst du überhaupt machen? Vielleicht liegt das Problem bei der falschen Verwendung. Gehört dann auch langsam ehers ins Linux Forum
Grüssli
-
Ah gar nicht gesehen jjjjop mein Port ist kompatibel zu denen strings sende auch mit denen und das funktioniert wunderbar.
-
hab deinen code so geändert:
void GetClass::getText() { char a[5]; std::ifstream get("/dev/ttyS0"); if(get.getline(a, 5)) { // QString b(a.c_str()); QString b=a; list->addItem(b); } }also ich Spam den über einen Mikrocontroller zu, von dem kann ich bei putty auch was empfangen und für diesen Zweck um mit dem zu kommunizieren wollte ich auch die Funktion schreiben. so als Test
-
Hi hab ma ne programm füre console gschrieben
#include <iostream> #include <fstream> #include <string> using namespace std; int main() { char empfangeneNachricht1[255]; ifstream empfaenger("/dev/ttyS0"); empfaenger.getline(empfangeneNachricht1, 4); cout<<endl<<empfangeneNachricht1<<endl; return 0; }das funktioniert komischerweise

-
hab die funktion jetzt mal so umgeschirben:
void GetClass::getText() { char empfangeneNachricht1[255]; std::ifstream empfaenger("/dev/ttyS0"); empfaenger.getline(empfangeneNachricht1, 10); QString b=empfangeneNachricht1; list->addItem(b); }jetzt kann ich was empfangen aber das nur wenn ich etwas empfangen kann sonst-> endlos schleife hängt sich auf und wenn ich was empfange dann hängt er sich auch kurz auf und wärden dessen kann ich das programm nicht nutzen.