Szanowni Koledzy
Zastanawiam się nad realizacją pewnego problemu dotyczącego transmisji danych przez port COM z poziomu Delphi (korzystam z najnowszego 10.1 Berlin oraz pakietu AsyncPro).
O co chodzi? Chciałbym napisać program, który realizowałby taki algorytm:
- Wysyłam komendę na port COM;
- Czekam na informację zwrotną;
- Obrabiam informację zwrotną;
- Wysyłam następną komendę na port COM;
- Czekam na informację zwrotną;
- Obrabiam informację zwrotną;
- itd. jw.
- [...]
W mikrokontrolerze nie byłoby problemu - po prostu obsługuję UART w trybie pollingu + jakieś dodatki w postaci timeout'u po każdej wysłanej komendzie.
Można rzec, żeby powyższe zrealizować w taki sposób:
- Wyślij komendę 1;
- Wyślij komendę 2;
- Wyślij komendę 3;
- itd.
Czyli wysyłka danych hurtem co jakiś czas, np. co 1s odmierzaną timerem w zdarzeniu OnTimer.
I potem odbiór odpowiedzi hurtem w jednym zdarzeniu odbiorczym.
Nie chcę jednak robić tego w taki sposób, bo jakaś odpowiedź może przyjść uszkodzona (albo nie przyjść w ogóle). Co więcej, odpowiedzią może być surowa wartość liczbowa, więc nie zawiera w sobie informacji jakiego rozkazu dotyczy więc i żaden parser nie pomoże.
Po prostu każda dana musi być obrobiona na swój specyficzny sposób, tryb pollingu wyjątkowo wydaje się tu być przydatny.
Ale jak to przerzucić do Delphi, gdzie wszystko mam poupychane w procedury i wszystko działa podobnie jak na przerwaniach w mikrokontrolerze?
Proszę uprzejmie o wskazówki i pozdrawiam.
PS - w sumie to mam jeszcze jedno pytanie, rozważmy przykład:
Czy w Delphi (lub C++ Builder) jest tak, że najpierw wysyła 3 komendy i wychodzi z procedury, a jeśli odpowiedź przyjdzie w międzyczasie to trzyma dane w buforze i po wyjściu z tej procedury dopiero idzie do procedury odbiorczej czy może jest tak, że jak przyjdzie odpowiedź przed wysyłką drugiej komendy to idzie do procedury odbiorczej, tam robi swoje, a potem wraca do wysyłki drugiej komendy? Chodzi mi o to, czy działa to podobnie jak przerwania w mikrokontrolerze czy może nie opuszcza procedur przed ich całkowitym wykonaniem?

Zastanawiam się nad realizacją pewnego problemu dotyczącego transmisji danych przez port COM z poziomu Delphi (korzystam z najnowszego 10.1 Berlin oraz pakietu AsyncPro).
O co chodzi? Chciałbym napisać program, który realizowałby taki algorytm:
- Wysyłam komendę na port COM;
- Czekam na informację zwrotną;
- Obrabiam informację zwrotną;
- Wysyłam następną komendę na port COM;
- Czekam na informację zwrotną;
- Obrabiam informację zwrotną;
- itd. jw.
- [...]
W mikrokontrolerze nie byłoby problemu - po prostu obsługuję UART w trybie pollingu + jakieś dodatki w postaci timeout'u po każdej wysłanej komendzie.
Można rzec, żeby powyższe zrealizować w taki sposób:
- Wyślij komendę 1;
- Wyślij komendę 2;
- Wyślij komendę 3;
- itd.
Czyli wysyłka danych hurtem co jakiś czas, np. co 1s odmierzaną timerem w zdarzeniu OnTimer.
I potem odbiór odpowiedzi hurtem w jednym zdarzeniu odbiorczym.
Nie chcę jednak robić tego w taki sposób, bo jakaś odpowiedź może przyjść uszkodzona (albo nie przyjść w ogóle). Co więcej, odpowiedzią może być surowa wartość liczbowa, więc nie zawiera w sobie informacji jakiego rozkazu dotyczy więc i żaden parser nie pomoże.
Po prostu każda dana musi być obrobiona na swój specyficzny sposób, tryb pollingu wyjątkowo wydaje się tu być przydatny.
Ale jak to przerzucić do Delphi, gdzie wszystko mam poupychane w procedury i wszystko działa podobnie jak na przerwaniach w mikrokontrolerze?
Proszę uprzejmie o wskazówki i pozdrawiam.
PS - w sumie to mam jeszcze jedno pytanie, rozważmy przykład:
Code: delphi
Czy w Delphi (lub C++ Builder) jest tak, że najpierw wysyła 3 komendy i wychodzi z procedury, a jeśli odpowiedź przyjdzie w międzyczasie to trzyma dane w buforze i po wyjściu z tej procedury dopiero idzie do procedury odbiorczej czy może jest tak, że jak przyjdzie odpowiedź przed wysyłką drugiej komendy to idzie do procedury odbiorczej, tam robi swoje, a potem wraca do wysyłki drugiej komendy? Chodzi mi o to, czy działa to podobnie jak przerwania w mikrokontrolerze czy może nie opuszcza procedur przed ich całkowitym wykonaniem?