Ich habe gerade ein sehr merkwürdiges Problem, bei dem ich gerne auf die
fachkundige Hilfe hier zurückgreifen würde:
Ich lese Daten von einem Arduino ein, genauer gesagt verschiedene
Temperaturwerte und auch Schrittzahlen von einem Motor usw .... dafür
verwende ich die besagte Library in QT 5. Im wesentlichen stöpsle ich
alle Daten zu einem String zusammen, den ich dann per Serial.print() an
die GUI schicke, dort wird es QExtSerialPort abgefangen und eingelesen.
Jedoch funktioniert das nicht fehlerfrei - zumindest nicht über eine
längere Zeit.
Rufe ich mit dem seriellen Monitor der Arduino Umgebung die Daten ab,
dann passt alles. Lese ich sie aber mit der GUI aus, die ich in QT
geschrieben habe, so geht alles nur etwa 15 Sekunden lang gut - dann
fängt er an Daten zu schlucken. Ich habe nun schon den String im Arduino
nicht mehr "erzeugt" sondern einfach einen "123456789abcdefghij"
übertragen - Monitor: alles cool. GUI: Nur die ersten Sekunden ok.
Ich versuche mal einige essenzielle Codefragmente herauszugreifen, damit
das nicht in einer Leseorgie endet:
Arduino Code:
1 | string_outData = "A23.0000&-5.000&0.000X523.0000&-1.000&9.000Y";
|
2 | Serial.print(string_outData);
|
QT Code für Connect:
1 | foreach (QextPortInfo info, QextSerialEnumerator::getPorts()){
|
2 | if (info.portName != 0) {
|
3 | ui->portBox->addItem(info.portName);
|
4 | }
|
5 | }
|
6 |
|
7 | timer = new QTimer(this);
|
8 | timer->setInterval(40);
|
9 |
|
10 | port = new QextSerialPort;
|
11 | port->setPortName(ui->portBox->currentText());
|
12 | port->setQueryMode(QextSerialPort::EventDriven);
|
13 | port->setBaudRate(BAUD9600);
|
14 | port->setFlowControl(FLOW_OFF);
|
15 | port->setParity(PAR_NONE);
|
16 | port->setDataBits(DATA_8);
|
17 | port->setStopBits(STOP_1);
|
18 |
|
19 | connect(port, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
|
20 |
|
21 | enumerator = new QextSerialEnumerator(this);
|
22 | enumerator->setUpNotifications();
|
23 |
|
24 | connect(enumerator, SIGNAL(deviceDiscovered(QextPortInfo)), SLOT(onPortAddedOrRemoved()));
|
25 | connect(enumerator, SIGNAL(deviceRemoved(QextPortInfo)), SLOT(onPortAddedOrRemoved()));
|
26 | }
|
QT Code für ReadyRead:
1 | void MainWindow::onReadyRead()
|
2 | {
|
3 | if (port->bytesAvailable()) {
|
4 |
|
5 | ui->recv_text->moveCursor(QTextCursor::End);
|
6 | ui->recv_text->insertPlainText(QString::fromLatin1(port->readAll()));
|
7 |
|
8 | // Einkommenden Datenstring verarbeiten
|
9 | //QString incoming_string = QString::fromLatin1(port->readAll());
|
Den einkommenden Datenstrom hätte ich am liebsten als String eigentlich
zum weiterverarbeiten (wollte da dann mit string.split() wieder alles in
die einzelnen Werte zerlegen ...