Ako nahradiť testovaciu slučku prerušením v C#

Ahojte, rád by som Vás požiadal o pomoc s nasledujúcim problémom:

Vo Visual C# 2010 chcem napísať program, ktorý komunikuje s AVR cez paralelný port (používam inpout32.dll a triedu PP). U AVR chcem využiť AD prevodníky s tým, že keď AVR vykoná AD prevod, nastaví pin paralelného portu na log1, čím dá PC vedieť, že môže načítavať dáta.
Jediný spôsob, ako by som to doteraz vedel urobiť je, že PC bude v slučke while kontrolovať, ťi je pin na log0 alebo log1.

nap. kontrola pinu LSB data:
while ((PP.PP_Data_In() & 0x01) == 0) {} //cakaj na nacitavanie
{
//nacitaj data
}

Tento spôsom mi však nevyhovuje kvôli vyťaženiu vlákna, a rád by som to nahradil nejakým ,kvázi hardwarovým" prerušením od pinu. V knihe Visual C# 2008 som sa dočítal, že by to mohlo ísť pomocou udalostí s použitím delegátov, ale priznám sa, že som to skoro vôbec nepochopil.
Dalo by sa to ešte spraviť nastavením časovača napr. na 1ms a v tomto čase kontrolovať stav, ale to už nie je pravé prerušenie od pinu.

Vedeli by Ste mi poradiť, čím konkrétne by sa dala táto slučka nahradiť, aby tento program naozaj plnil funkciu podobnú pin change interrupt u AVR?

Ďakujem za pomoc, nasmerovanie alebo užitočné pripomienky.
Súbor inpout32 môžete stiahnuť napr. tu (z originálnej adresy mi to nešlo stiahnuť).

:arrow_right: administrator: přesunuto z “Ostatní”

:arrow_right: administrator: přiloženy externí soubory
inpout32.dll.zip (11.7 KB)
PP.txt (1.57 KB)

Delegát je vpodstatě pointer na funkci. Událost je pak volání této funkce.
Když si např. vytvoříš instanci od System.IO.Ports.SerialPort zjistíž, že je obsahuje událost “DataReceived”. Této události můžeš přiřadit funkci (“xxx.DataReceived +=”, VS ti automaticky navrhne vytvoření obsluhy události, potvrdíš 2x TAB) a ta bude volána vždy, když dorazí data.
Dále je tam i událost “PinChanged”. Dají se tu najít C# kódy na jednoduchý uartový terminál. Tam je použitý i invoke (nutné protože asynchronní událost bývá na jiném vlákně).

Ta dll je však nejspíš v C++ a nemáš k ní toto sharpovské zapouzdření. S tím sis však už asi poradil když umíš číst/zapisovat data. Pokud to ta knihovna (a hw) vůbec umí - není tam funkce, která by právě požadovala pointer na funkci z tvého programu(obsluha události)?

Víc k tomu asi nenapíšu. Používám totiž pouze uart (pro jednoduchost obsluhy v C#) nebo wifi (v režimu vysílačky - udp pakety na broadcast).
Se C# problémy ovšem budeš mít asi větší šanci na úspěch na fóru builder.cz

Ďakujem piityy za tip, pozriem či v tejto .dll je možnosť vyvolania udalosti ako pin changed u sériového portu, avšak obávam sa že skôr asi nebude…