Forum: Mikrocontroller und Digitale Elektronik QExtSerialPort + Arduino Problem nach 15 Sekunden


von raphael (Gast)


Lesenswert?

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 ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.