Komunikujeme přes sériové rozhraní v ASP.NET

5. února 2004

Pomocí .NET můžeme snadno vytvořit řadu zajímavých aplikací, komunikujících přes rozhraní systému. V tomto článku si ukážeme, jak pracovat se sériovým portem serveru i prostřednictví ASP.NET stránky – jednoduchá aplikace tak může přes internet ukázat, zda jsme například nezapomněli zapnutý spotřebič.

Zapojení konektoru rozhraní RS2323

Rozhraní RS232 je v počítačích typu PC realizováno jako takzvaný sériový port. Setkáváme se nejčastěji se dvěma variantami konektorů, 9-ti pinový (malý) a 25-ti pinový (velký). Vyjdeme z tabulky zapojení devítipinového konektoru, které nám zároveň poskytne obrázek o signálech, se kterými budeme mít dále co do činění:

Pin Signál Popis Směr
1 DCD Data Carrier Detect vstup
2 RxD Receive Data vstup
3 TxD Transmit Data výstup
4 DTR Data Terminal Ready výstup
5 GND Ground  
6 DSR Data Set Ready vstup
7 RTS Request To Send výstup
8 CTS Clear To Send vstup
9 RI Ring Indicator vstup

Takzvaný velký 25-ti pinový konektor ukazuje obrázek:

Zapojení konektoru RS 232

Jak vidíme, pro jednoduché čtení stavu (vypnuto/zapnuto) můžeme použít celkem 4 linky (CTS, DSR, DCD, RI) a pro zápis (nastavení) dva výstupy (DTR, RTS), případně ještě výstup TxD při nastavení stavu Break (popíšeme si později).

Pro kompletní popis a zapojení konektorů rozhraní RS 232 a ukázky použitelných zapojení (například teploměr) vás odkazuji na server hw.cz, spoustu dalších aplikací lze nalézt i třeba pomocí vyhledávačů a klíčových slov rs232 a serial port. My si v ukázce k tomuto článku vytvoříme aplikaci, která přečte a zobrazí stav linky CTS.

Přístup k sériovému rozhraní je ve Windows standardizován pomocí komunikačních funkcí, implementovaných jako API v knihovně Kernel32.dll. V naší aplikaci si funkce Kernel32.dll jednoduše zpřístupníme s využitím prostoru názvů System.Runtime.InteropServices, který nabízí podporu pro práci s takzvaným unmanaged code, jak jsme již popsali v článku o využití funkcí NetApi32.dll.

Knihovna pro práci s rozhraním RS232

Práce se sériovým rozhraním není úplně triviální, ovšem na stránkách MSDN lze nalézt nejen dostatek materiálů popisujících principy komunikace, ale najdeme tam také robustní a celkem komplexní Base Class Library – v té nalezneme prakticky všechny potřebné funkce a vlastnosti pro použití v .NET aplikaci. Jelikož se mi ale pro začátek, kdy chceme opravdu jen načíst stav jedné linky, zdála tato knihovna příliš nabubřelá, zkusil jsem hledat dál a nakonec jsem našel inspiraci na stránce Corrada Cavalliho o komunikaci přes RS232 ve VB.NET, jím vytvořená knihovna je o poznání kratší, nepodporuje všechny možnosti jako knihovna ze stránek MSDN, nicméně pro naši aplikaci plně postačí a hlavně je díky jednoduchosti snadno pochopitelné, jak to vlastně funguje. Jediné, co je potřeba do této knihovny dopsat, jsou vlastnosti, které zpřístupní vstupní linky portu, výstupní linky v knihovně již napsány jsou.

Ukázka dopsané vlastnosti pro čtení linky CTS (knihovna je psána v jazyce VB.NET):

Const MS_CTS_ON As Int32 = &H10
Public ReadOnly Property Cts() As Boolean
  Get
    If Not mhRS = -1 Then
      Dim inputLine As Int32
      If GetCommModemStatus (mhRS, inputLine) Then
        Return inputLine And MS_CTS_ON
      Else
        Return False
      End If
    Else
      Return False
    End If
  End Get
End Property

Knihovnu prostě zkompilujeme a uložíme do složky Bin v kořeni virtuální aplikace na serveru. Kompilaci můžeme provést i z příkazového řádku zadáním jednoduchého povelu:

vbc.exe /t:library RS232.vb

Před popisem aplikace si vysvětlíme princip práce se sériovým rozhraním. Knihovna RS232.dll nabízí pro práci s rozhraním třídu CMediaRs232 (není mi jasné, proč Corrado Cavalli volil tento název, ale budiž). V aplikaci si tedy vytvoříme její instanci, dále nastavíme potřebné vlastnosti (zejména číslo portu) i komunikační vlastnosti, jako například rychlost. Následně metodou Open() otevřeme port rozhraní. Pokud nedojde k chybě, máme vyhráno, zařízení je nyní jen naše a můžeme s ním komunikovat jak je libo. Pokud dojde k chybě, port je obsazen jiným zařízením nebo v systému vůbec není.

Při ukončení aplikace je naprosto nezbytné provedením metody Close() uvolnit rozhraní, jinak zůstane otevřený port „viset“ přidělený ke zprostředkovávajícímu IIS a nic s ním již nebude možné dělat. Stejně tak se může stát, že dojde k chybě v naší aplikaci, port pak bude nadále v „zajetí“ procesu, který zpracovává naši webovou aplikaci. Východiskem z této situace je pouze restart IIS, aby se proces aspnet_wp.exe portu „pustil“, což není zrovna moc košer (jak to obejít si ukážeme dále).

Ukázková aplikace

Ukázkový formulář se zatrhávacím políčkem, které využijeme pro zobrazení stavu linky CTS:

 <body>
  <form runat=“server“>
    <asp:CheckBox id=“chkCts“ Enabled=“False“ runat=“server“ Text=“CTS“ />
    <br /><br />
    <asp:Label Id=“lblError“ RunAt=“server“ />
  </form>
</body>

A obslužný skript:

<%@ Page Language=“C#“ Trace=“False“ Debug=“False“ %>
<%@ Assembly Name=“RS232″ %>
<script language=“C#“ runat=“server“>
void Page_Load(object sender, System.EventArgs e)
{
  CMediaRs232 moRS232 = new CMediaRs232();
  moRS232.Port = 2; // COM2
  try
  {
    moRS232.Open();
    chkCts.Checked = moRS232.Cts;
    moRS232.Close();
    chkCts.Visible = true;
    lblError.Visible = false;
  }
  catch (Exception eX)
  {
    chkCts.Visible = false;
    lblError.Text = „Chyba při práci se sériovým portem…“ + eX.ToString();
    lblError.Visible = true;
  }
}
</script>

V direktivě vidíme zavedenou knihovnu RS232. V obsluze události načtení stránky pak jednoduše vytvoříme instanci zmíněné CMediaRs232. Protože portem de facto nebudeme žádná sériová data přenášet, krom čísla portu (v naší ukázce COM2) není třeba žádné další vlastnosti nastavovat. V sekci try-catch se potom pokoušíme otevřít port a stav zatrhávacího políčka ve formuláři nastavit na stav signálové linky CTS. Následuje zavření portu, nastavení viditelnosti zatrhávacího políčka a skrytí labelu chybového hlášení. Pokud dojde k chybě, zatrhávací políčko skryjeme, nastavíme text chybového hlášení (přidáváme zde i text zachycené výjimky) a hlášení zviditelníme.

Načíst stav portu a tedy i našeho zařízení je možné kdykoli – otevřeme port, přečteme hodnotu a port můžeme opět zavřít. Pokud bychom chtěli k ovládání využít výstupní linky (DTR, RTS, TxD), je třeba si uvědomit, že uzavřením portu (uvolněním obsazených prostředků) se ztratí i údaje zapsané do rozhraní – znamená to, že není možné jednoduše například v ASP.NET stránce zatrhnout políčko formuláře a následně otevřít port, zapsat stav a port zavřít, zapsané hodnoty se zavřením vyresetují. Není možné ani nechat port neuzavřený a ukončit zpracování ASP.NET aplikace – údaje sice na výstupním zařízení setrvají, nicméně zařízení sériový port v tomto stavu má „přiřknut“ proces zpracovávající ASP.NET stránky a tak zůstane sériový port již trvale obsazen a do restartu služeb IIS s ním nebude možno pracovat.

Jak ověřit funkci prakticky

Před započetím pokusů s porty PC chci jen zdůraznit, že práce s HW počítače vyžaduje alespoň základní znalost elektrotechniky a pájení, pokud tomu nerozumíte, nešťourejte se v tom, nevhodný zásah může skončit nejen poškozením portů PC, ale i třeba základní desky a zdroje!

Pro reálné testování je dobré zakoupit si v prodejnách s radiosoučástkami konektor CANON s krytem (samec, 25 nebo 9 pin, podle toho, jaký konektor má sériový port vašeho PC), případně redukci „velkého na malý“ nebo obráceně.

Pokud tedy na lince CTS bude oproti GND signál logické nuly (což je pro rozraní RS232 napětí v rozmezí +3 V až +25 V), checkbox zůstane nezatržený. Takto bude vyhodnocen i stav linky, ke které není připojeno žádné zařízení (jde o klidový stav, tzv. marking state). Logická jednička je tedy indikována zápornou úrovní (tzv. space state), pokud bychom chtěli v naší aplikaci docílit zatržení checkboxu, bylo by potřeba linku CTS přivést napětí v rozmezí -3 V až -25 V. Dalo by se vzít z nějaké výstupní linky – kdo chce experimentovat, může vodičem přímo propojit linky CTS a třeba DTR – těsně před čtením stavu linky CTS je v aplikaci potřeba nastavit linku DTR pomocí moRS232.Dtr = true;. Dalším řešením může být zapojení baterie o patřičném napětí mezi GND a CTS.

Ukázkovou aplikaci včetně zdroje knihovny RS232.dll si můžete stáhnout (zdrojový kód).

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Další článek chytrevizitky.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *