2016-07-29 16 views
0

Ich schreibe ein Programm zum Lesen von QSerialPort. Das Programm scheint ungefähr 85% der Zeit zu funktionieren, aber es gibt eine merkwürdige Situation, in der Unsinn in meinen Puffer eingelesen wird.QSerialPort: Falsche Werte lesen

Manchmal stürzt das Programm beim Start aufgrund eines massiven Puffers von x00-Werten unerwartet ab. Dies ist nicht die Antwort von meinem Modul und scheint nur gelegentlich beim Start zu passieren.

Ich denke, es gibt ein Problem in der Art und Weise, wie ich meine Instanz von QSerialPort lösche, aber nicht finden kann.

Ich habe auch bemerkt, QSerialPort hat eine Funktion "sendBreak", die scheint zu tun, was mein Programm ist (massive Dampf von X00/X00/X00).

Meine Frage ist: Hat jemand dies schon einmal erlebt? Gibt es eine seltsame Möglichkeit meine QSerialPort :: read() - Funktion führt irgendwie einen "sendBreak" aus? Oder scheint dies ein Problem beim Löschen von Instanzen/Zeigern zu sein (Lesen von Daten von Adressen, die nicht ordnungsgemäß dekonstruiert wurden)?

Constructor:

serial = new QSerialPort; 
    serial->setPortName("/dev/ttyUSB0"); 
    serial->setBaudRate(QSerialPort::Baud9600); // 9600 
    serial->setDataBits(QSerialPort::Data8); 
    serial->setParity(QSerialPort::NoParity); 
    serial->setStopBits(QSerialPort::OneStop); 
    serial->setFlowControl(QSerialPort::NoFlowControl); 
    serial->open(QSerialPort::ReadWrite); 
    serial->clear(QSerialPort::AllDirections); 

Lesehafen:

readData.append(serial->read(50)); 

Destructor:

serial->clear(QSerialPort::AllDirections); 
serial->close(); 
delete serial; 

Ich weiß, das durchaus eine allgemeine Frage sein könnte, aber ich kann momentan nicht das Problem finden, so jede Hilfe würde geschätzt werden.

+0

Viele Dinge können falsch liegen. Überprüfe du vor dem ersten Lesevorgang, ob der serielle Port offen ist? Verwenden Sie waitForReadyRead? –

+0

Senden von NULL und ein 'break' sind nicht dasselbe. Ein "Bruch" ist, wenn die Linie für längere Zeit auf Null geht (mehr als ein paar Zeichen). Es gibt keine Start-Bits in einer Pause, daher sollte der Empfänger keine Zeichen sehen, auch nicht NULL. Um eine Folge von NULL-Zeichen zu sehen, benötigt jedes Zeichen ein zugeordnetes Start-Bit. Rauschen (das als falsche Start-Bits angezeigt wird) könnte zu Ihrem Problem oder einem Treiberproblem für den seriellen Anschluss führen, oder das andere Ende könnte tatsächlich eine NULL-Zeichenfolge senden. – Mark

+0

Ich benutze readyRead(), um zu wissen, wann ich vom Port lesen muss, aber nicht mit waitForReadyRead().Ich überprüfe nicht, ob der Serialport zuerst geöffnet ist, aber ich werde einen Fehler erhalten, wenn er nicht offen ist (was ich nicht bekomme). Vielen Dank für die Pause, habe die Operation nicht verstanden. Ich habe anscheinend kein Treiberproblem, von dem ich erzählen kann, und das Modul sollte diesen Datenstrom nicht senden (kontaktierte den Hersteller diesbezüglich). Nach diesen Kommentaren bin ich geneigt zu denken, dass es ein ReadyRead() Problem sein könnte ... Ich habe gehört, dass es problematisch sein kann. – SamMetix

Antwort

0

Ok, für was es wert ist, fand ich das Problem.

Nach dem erneuten Lesen Qt-Dokumentation auf QSerialPort und speziell die read() Funktionen heißt es:

„Mit dieser Funktion keine Möglichkeit, Fehler in der Berichterstattung hat, kann eine leere QByteArray Rückkehr entweder bedeutet, dass keine Daten zur Zeit verfügbar waren für Lesen, oder dass ein Fehler aufgetreten ist. "

Was scheint passiert zu sein ist, dass mein readyRead() Signal ausgelöst wird, auch wenn ich keine Daten zum Lesen hatte ?! Eine einfache if-Anweisung, die in meiner readPort-Methode nach bytesAvailable() sucht, bedeutet, dass ich nur lese, wenn ich Daten habe, die darauf warten, gelesen zu werden.

Ich bin sehr überrascht, dass diese Funktion liest unabhängig und fühlen kann dieses Problem mit besser hervorgehoben/gehandelt habe ....

EDIT: Fand das eigentliche Problem für dieses Problem. Ich benutzte readData.resize(), das das Array löschte, ohne es zu instanziieren. Deshalb, als ich es vor dem Lesen löschte (aber nicht initialisiert), las es eine Adresse.