Zuerst mal, dass es hier keine Missverständnisse geben wird:
Blamaster hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.SendString(const S: String); var Time: Cardinal; begin SerialPortNG1.SendString(S + #$0D#$0A); Time := GetTickCount; while Time+Timeout > GetTickCount do if SendedString = '' then Break; if SendedString <> '' then raise ESerialPortError.Create('Gegenseite antwortet nicht'); end; | |
Die markierte Zeile solltest du um eine Stelle ausrücken, die gehört nicht in die Schleife, sonst bräuchtest du ja ein
begin ... end. In der Schleife wird einfach nur geprüft, ob der String inzwischen leer ist (also die Empfangs-Prozedur erfolgreich war). Weil ja auch ein Timeout auftreten kann (im Schleifenkopf definiert), muss am Schluss noch der Grund geprüft werden, warum die Schleife verlassen wurde. Sollte ein Timeout aufgetreten sein, ist ja die Variable noch nicht leer.
Blamaster hat folgendes geschrieben: |
Woran merkt den das programm momentan ob der µC die Daten auch verarbeitet hat und wieder empfangsbereit ist ? |
Der Microcontroller sendet die Daten doch erst wieder zurück, wenn er sie komplett ausgewertet hat, oder? Die Schleife wartet ja darauf, dass sie wieder zurückgesendet werden. Natürlich gehe ich davon aus, dass er dann wieder Aufnamefähig ist.
Vielleicht hilft ein
Application.ProcessMessages in der Schleife - das könntest du mal ausprobieren.