Beide Funktionen gefallen mir nicht.
In COMchild::ReceiveCallBackFunc sehe ich Probleme bei RX_BUFFER_SIZE >
100, dem Abschliessen mit Nullbyte, dem Verlust von value beim Verlassen
der Funktion sowie dem Brute-Force-Kopieren ungeachtet der tatsächlichen
Eingabelänge im rxbuffer. Abgesehen davon, dass Platz für pthis
verschwendet wird.
In COMchild::CheckForFrame gefällt mir die erste Prüfung auf
Vollgeschriebenen buf über len==100 nicht. Das wäre auch der erste
Punkt, der weg müsste, wenn die Zeilen unterschiedlich lang sind.
Um genauere Vorschläge zu machen, bräuchte man mehr Infos zum
Programmcode. Rel. einfach wäre es wenn z.B. in rxbuffer immer komplette
Zeilen (bis Zeilenende \n) stehen und dann COMchild::ReceiveCallBackFunc
aufgerufen würde. Ich würde dann die Funktion aufblasen:
1 | int COMchild::ReceiveCallBackFunc(void* _pthis, char* dest_line, size_t max_dest_len)
|
2 | {
|
3 | // Anzahl Zeichen im Zeileneingangspuffer+Nullbyte > max_dest_len
|
4 | // oder dest_line == NULL oder _pthis == NULL
|
5 | // return 0;
|
6 |
|
7 | // Zeichen im Zeileneingangspuffer+Nullbyte nach dest_line kopieren
|
8 | // return Anzahl Zeichen im Zeileneingangspuffer+Nullbyte;
|
9 | }
|
Mit den Daten daraus kannst du dann schon die Zeile prüfen
1 | int COMchild::CheckForFrame(char* buf, size_t len)
|
2 | {
|
3 | // Aufruf:
|
4 | // an buf wird dest_line übergeben
|
5 | // an len wird Anzahl Zeichen im Zeileneingangspuffer+Nullbyte übergeben
|
6 |
|
7 | // wenn len == 0 oder buf == NULL
|
8 | // return UNGUELTIG
|
9 |
|
10 | // Erweiterung:
|
11 | // wenn Anfang gleich $GRABC
|
12 | return IST_ABC_FRAME;
|
13 |
|
14 | // Erweiterung:
|
15 | // wenn Anfang gleich $GRXYZ
|
16 | return IST_XYZ_FRAME;
|
17 |
|
18 | // Erweiterung:
|
19 | // Nix erkannt...
|
20 | return IST_UNBEKANNTER_FRAME;
|
21 | }
|
Mit den FRAME_TYPEN könnte man dann eine Framezerschnippelfunktion
triggern, die die interessanten Daten aus den unterschiedlichen Frames
herausholt (Länge, Breite, Anzahl der Sats, Zeit...)