Ahoj, potřeboval bych poradit jak vyřešit Brzdu při čekání na odpověď ze sériového portu.
Na obsluhu COM používám knihovnu Synaser,
Struktura: MainForm se SubFormuláři:
Form Obsluha měř.přístroje obsahuje i komunikaci a vyčítání dat
Form Detail měření s ručním doplňováním údajů k měření
Form s dbgridem s přehledem historie měření
Komunikace funguje obousměrně: odeslání Příkazu > přijem Odpověďi/í, každý příkaz má odpověď.
Současné řešení: smyčka max.počet odpovědí se Synaser.ReceiveString s timeoutem 500 nebo 1000, ošetření na 5 Timeoutů (=chyba komunikace) a existenci odpovědi, na konci smyčky je momentálně sleep(250) - pauza před dalším Receive. V okamžiku, kdy běží na přístroji měření je odezva pomalejší - tím pádem smyčka probíhá několikrát dle nastavení timeoutů u receive a počtu do chyby x Sleep, což výrazně brzdí odezvu v ostatních Subformech. Ostatní komunikace to tolik nebrzdí - na startu při inicializaci sériově několik příkazů/odpovědí zdržení neřeším (aspoň neutíká zobrazení statusu), stav měř.př. řeším přes timer v intervalech 5-10s.
Moje nápady na optimalizaci co nejmenší brzdy u čekání na odpověď, potřebuji poradit, který vybrat, případně návrh jiného řešení:
- nahradit Sleep prasárničkou Delay se smyčkou a App.ProcesMessages
- prodloužit Timeout u volání Synaser.ReceiveString (nevím jak funguje zda při příchodu odpovědi skončí hned nebo čeká po celý TOut)
- přesun Komunikace portu do Threadu, zde nevím, jak řešit čekání na konec jestli zas použít "Delay", nebo zda na to je nějaká funkce, případně řešení odpovědí přes backend proceduru.
Za rady a návrhy předem Děkuji