Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

03.10.2015, 18:15

QT: Serialport verschluckt Daten

Servus,

ich arbeite derzeit mit Hilfe von QSerialPort an der USB-Kommunikation. Dabei ist mir was merkwürdiges aufgefallen: Während die Kommunikation am meinem PC normal klappt 'verschluckt' mein Laptop immer wieder Daten, die eigentlich ankommen. Beispiel: Der PC empfängt per USB "ELM327 v1.50". Führe ich das gleiche Programm bei meinem Laptop aus, sieht die Ausgabe beispielsweise so aus: "M327 v1.50", also die ersten Zeichen fehlen. Da ich keine Ahnung habe, woran dies liegen könnte, wende ich mich an euch.
Mein Code hierfür sieht folgendermaßen aus:

Initialisierung

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    QSerialPort moPort;
if (!moPort.open(QIODevice::ReadWrite)) {       
throw QString("Could not open port");   }   
if (!moPort.setDataBits(QSerialPort::Data8)) {      
throw QString("Could not set data bits");   
}   
if (!moPort.setStopBits(QSerialPort::OneStop)) {        
throw QString("Could not set stop bits");   
}   
if (!moPort.setParity(QSerialPort::NoParity)) {     
throw QString("Could not set parity");  
}   
if (!moPort.setFlowControl(QSerialPort::NoFlowControl)) {       
throw QString("Could not set flow control");    
}   
if (!moPort.setBaudRate(QSerialPort::Baud38400)) {      
throw QString("Could not set baud rate");   
}



Senden/Empfangen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    QByteArray ObdConnection::Send(const QString& sCmd) {       
moPort.write(sCmd.toLocal8Bit());
        QByteArray aBuffer;
        while(moPort.waitForReadyRead(5000)) {
            aBuffer += moPort.readAll();
            if (aBuffer.size()>2 && aBuffer[aBuffer.size() - 2] == '\r' && aBuffer[aBuffer.size() - 3] == '\r') break;
        }
        return aBuffer;
    }



Ideen, was an meinem Laptop anders laufen könnte als am PC?

MfG Kyle

PS: Wieso ist mein Code so furchtbar formatiert? Ich habe brav alles mit Zeilenumbrüchen reinkopiert.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »kylecorver« (05.10.2015, 18:31)


2

03.10.2015, 19:23

Beim Programmieren von µC war meist die Baudrate schuld, dass die Komunikation zwischen Computer und µC nicht richtig/garn nicht funktioniert hat.
Eventuell mal di Baudrate herab setzen und schauen was passiert eventuell ist die Baudrate am PC und LapTop unterschiedlich (Unterschiedliche USB-Version?).

Sind es denn immer nur die ersten Zeichen bei der Übertragung, oder auch mal zeichen mitten drin?
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

04.10.2015, 13:20

Ehrlich gesagt kann ich nicht ganz folgen:
Mit wem oder was willst du denn kommunzieren? Um welche Art von SerialPort handelt es sich? RS232? USB-UART-Bridge?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

4

04.10.2015, 18:41

Ich versuche mit einem OBD-Stecker zu kommunizieren, der einen ELM327 chip enthält (so wie ich das verstanden habe). Baudrate und ähnliches sind dabei vorgegeben, wenn ich die änder bekomme ich nur kryptische Antworten. Soviel ich weiß ist es ein RS232 Connector.

5

04.10.2015, 19:49

Sind es denn immer nur die ersten Zeichen bei der Übertragung, oder auch mal zeichen mitten drin?
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

6

04.10.2015, 20:19

Sind es denn immer nur die ersten Zeichen bei der Übertragung, oder auch mal zeichen mitten drin?
Sorry vergessen. Ja es sind immer nur die Zeichen am Anfang, die fehlen. Der Rest stimmt überein.

7

04.10.2015, 21:08

Also, ne gute Idee habe ich nicht. Hast du die Baudrate am PC und auf dem ODB geändert?
Wenn nein mach das mal (auf beiden), ich weiß nimmer genau ich glaub wir hatten eine Rate von 9600 Baud angefangen und dann die Rate gesteigert (Bei problemen).

Vielleicht auch mal mit nem Terminal programm verbinden, anstatt mit deiner Software und da testen ob das resultat das selbe ist.

Schon mal ein Blick ins Datenbalt vom Chip geworfen?
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

8

04.10.2015, 21:21

Jo mit den Baudraten habe ich rumgespielt, aber nur die wo ich jetzt habe liefert lesbare Ergebnisse.
Anhand von dem Datenblatt habe ich den ganzen Spaß im Prinzip verbunden.

Mich wunderts halt, dass es am PC richtigläuft, am Laptop aber nicht =/

9

04.10.2015, 21:27

Nur um sicher zu gehen das wir nicht an einander vorbei reden, damit die daten Richtig übertragen/empfangen werden, reicht es nicht aus nur die Übertragungs rate in deinem Programm zu ändern, die Baudrate muss auch auf dem Chip geändert werden.

Wie gesagt ich würde es mal mit einem Terminal-Programm probieren ob das Resultat das selbe ist am Laptop.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

10

05.10.2015, 07:58

Da du vermutlich eine USB-Serial Adapter benutzt weiß ich, dass die Teilweise ziemlich zickig sind. Sind die Treiber dafür auf Laptop/PC identisch konfiguriert?

Werbeanzeige