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.
Viele Dinge können falsch liegen. Überprüfe du vor dem ersten Lesevorgang, ob der serielle Port offen ist? Verwenden Sie waitForReadyRead? –
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
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