So, jetzt komm ich endlich wieder zum Programm, die letzten Tage waren bisserl stressig.
Okay, ich denke da muss ich noch ein wenig experimentieren wie ich das mache... eigentlich sollte in den Optionen nach dem Adapter gesucht werden, sobald eine Änderung an der Schnittstelle vorgenommen wurde. Aber ich glaube fast ich mache einen extra Button hin, mit dem man manuell auf einen angeschlossenen Adapter an der aktuellen Schnittstelle suchen kann - und wenn man mit OK aus dem Einstellungs-Dialog rausgeht, kann ich nochmal prüfen und eine Warnmeldung ausgeben, wenn nix gefunden wurde.
Aber ich glaube das wird etwas zu verzwickt, wenn ich bei jeder Änderung der Schnittstelle diese öffne, meinen "Ping" sende, eine Antwort oder ein Timeout abwarte, die Schnittstelle schliesse... wenn ein Benutzer schnell die Einstellungen durchgeht könnte es zum Chaos werden, also beispielsweise kommt das Antwortpaket vom Ping verzögert zurück, hat der Benutzer vielleicht schon eine andere Schnittstelle ausgewählt und das Programm meint, der Ping käme von dieser und nimmt fälschlicherweise an, dass die funktioniert... ne, ich glaub das bringt nix
Aber wieder zum eigentlichen Thema zurück: Bei meinen Tests habe ich festgestellt, dass irgendwo ein Puffer vollläuft. Und zwar sende ich CAN-Nachrichten über einen gekauften Analysator ins CAN-Netz, empfange die über einen eigens entwickelten uC-Adapter und der schickt die per RS232 weiter an den PC.
Lasse ich nun beispielsweise über den gekauften Analysator jede Milisekunde eine Nachricht raus und stoppe das Senden nach einiger Zeit, so trudeln in meinem Programm noch einige Sekunden später ein Haufen Nachrichten ein... es schaut also so aus als ob irgendwo ein Puffer vollgelaufen ist, der nun langsam wieder geleert wird.
Das Problem hat sich auch relativ schnell gefunden: Nach jedem empfangenen Zeichen habe ich den Thread eine Milisekunde in den Schlaf gelegt. Und klar - kommt jede Milisekunde eine Nachricht rein, gibts da Konflikte denn es geht ja noch Rechenzeit zur Auswertung verloren...
Allerdings: Wenn ich keine Wartezeit einplane, geht natürlich die Prozessorlast auf 100% hoch - nicht gerade das Wahre. Dieses Polling gefällt mir auch absolut nicht, und wenn ich die Empfangsroutine blockieren lasse habe ich das Problem wie oben - ich müsste im Prinzip den Thread von aussen überwachen und abschiessen, aber sehr sauber ist das ja auch nicht - allerdings evtl. doch die sinnvollste Lösung?
Listener wären mir im Prinzip am liebsten, aber da ich einen FT232 (also den Chip USB <-> RS232) ansteuern muss und die verwendete Lib (ftd2xxj) keine Listener unterstützt, bleibt mir wohl nur Polling übrig. Ausser ich finde eine andere Lib für den FT...
Aber egal wie die Daten reinkommen - ich muss diese ja irgendwo erst speichern, auswerten und dann die Events rausschicken. Ich glaube da kann man auch viel falsch machen, wie ist da die sinnvollste Vorgehensweise? Momentan empfange ich Zeichen für Zeichen, nach jedem überprüfe ich ob die empfangene Nachricht vollständig ist und wenn ja schicke ich sie per Event raus.
Zeichenweise muss ich leider überprüfen, da ich nur ein Startbyte habe und die Länge des Paketes dann vom Pakettyp (das Byte nach dem Startbyte) abhängt. Ich könnte zwar, sobald ich weiss wie lange das Paket wird, warten bis auch so viele Bytes da sind und die dann auswerten, aber da die Pakete nur so 5-10 Byte im Schnitt haben, denke ich dass das nicht so viel bringen würde...
Aber würde es vielleicht etwas bringen im Empfangsthread auf die Auswertung ganz zu verzichten, anstattdessen nur die empfangenen Daten in einen Puffer legen und die Auswertung übernimmt ein eigener Thread? Oder wäre das Overkill? Die Daten kommen auf jeden Fall mit einer maximalen Geschwindigkeit von 1MBit rein, sollten dann aber sauber empfangen werden können.
So, sorry jetzt habe ich extrem viel getextet, das nächste Mal wirds auf jeden Fall weniger, versprochen
@TheJadix: Was meintest du mit "PS : Freu mich auf den nächsten Thread ..." - ne implizite Aufforderung einen neuen Thread zu eröffnen?
Mach ich, aber das obige denk ich passt doch ganz gut hier rein...