serielle Schnittstelle einlesen
-
Hallo zusammen,
ich habe mir ein Programm geschrieben, welches mit einem Thread Daten von der seriellen Schnittstelle in einem queue speichert und mit einem zweiten Thread die queue auswertet. Also nach der Startkennung sucht und die übertragenen Werte zu den richtigen Variablen zusammensetzt. Leider empfange ich schneller Daten, als ich diese verarbeiten kann. Die Queue wächst also ständig. Wo kann ich da noch etwas optimieren?
Ich sende
0xFF
0xFF
0xFF
als Startkennung
0x06
Anzahl Werte
0x01
0x02
0x03
0x04
0x05
0x06
Werte(z.B.)Das müsste der PC doch locker schaffen, oder?
viele Dank
-
Ich finde deine Frage zu allgemein gehalten, um konkrete Lösungen anzubieten.
Werden denn kontinuierlich Daten auf der seriellen Schnittstelle gesendet?
Du könntest ja einfach ein "Sleep(x)" in deinen Empfangsthread einbauen, um ein wenig zu warten.
Und ist deine Queue denn gelockt? Kann es also sein, daß der Queue-Lesethread immer blockiert ist?Ansonsten zeig mal ein bißchen exemplarischen Code...
-
Hallo Th69,
Es werden Daten zyklisch gesendet.
Der Lesethread liest diese zyklisch ein.void __fastcall TMyReadThread::Execute() { //---- Hier den Thread-Code plazieren---- while(1) { DWORD NumberOfBytesRead=ReceiveData(Buffer,2048); if (NumberOfBytesRead > 0) { for(unsigned int k = 0; k < NumberOfBytesRead;k++) q.push(Buffer[k]); } } }
Der andere Thread arbeitet den Queue ab. Aber leider nicht schnell genug.
void __fastcall RBThread::Execute() { //---- Hier den Thread-Code plazieren---- union { unsigned int wert; unsigned char highlow[2]; }zahlenwert; unsigned char temp; static unsigned char state = 0; while(1) { if(q.size()>10) { temp = q.front(); q.pop(); Form1->Label1->Caption = IntToStr(q.size()); switch(state) { case 0: if(temp == 0xFF) state = 1; break; case 1: if(temp == 0xFF) state = 2; else state = 0; break; case 2: if(temp == 0xFF) state = 3; else state = 0; break; case 3: zahlenwert.wert = 0; zahlenwert.highlow[0] = temp; zahlenwert.highlow[1] = q.front(); q.pop(); Form1->Label3->Caption = IntToStr(zahlenwert.wert); zahlenwert.wert = 0; zahlenwert.highlow[0] = q.front(); q.pop(); zahlenwert.highlow[1] = q.front(); q.pop(); Form1->Label4->Caption = IntToStr(zahlenwert.wert); zahlenwert.wert = 0; zahlenwert.highlow[0] = q.front(); q.pop(); zahlenwert.highlow[1] = q.front(); q.pop(); Form1->Label5->Caption = IntToStr(zahlenwert.wert); zahlenwert.wert = 0; zahlenwert.highlow[0] = q.front(); q.pop(); zahlenwert.highlow[1] = q.front(); q.pop(); Form1->Label6->Caption = IntToStr(zahlenwert.wert); state = 0; break; } } } }
-
Du mußt auf jeden Fall die Zugriffe auf die Form mittels "Synchronize" vor nehmen!
Und wie schon geschrieben, packe evtl. mal ein Sleep(x) in deinen ersten Thread.
-
Ohja, mit synchronize läuft das ganze echt stabiler.
Das mit dem sleep(x) probiere ich aus. Vielen Dank
-
Mit synchronize läuft das so gut, dass ich sleep nicht meh brauche.
Nur, wenn ich mein Programm von einem anderen Fenster verdecke stürzt
das Programm ab. Woran könnte das liegen?
-
Wie sieht denn dein GUI-Code aus, d.h. wie startest du die Threads und was kann der User während der Zwischenzeit in der GUI anstellen.
Kannst du z.B. das Fenster noch bewegen wärend die Threads laufen etc. ?
Du darfst die GUI auf keinen Fall blockieren!
-
Ich hatte noch ein Memo nicht über die Threads mit Synchronize aktualisiert. Nun funktioniert es.
Vielen Dank für die Hilfe
-
Bitte sehr, gern geschehen -)