Navigace

Hlavnφ menu

 

Komunikujeme p°es sΘriovΘ rozhranφ v ASP.NET

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φ:

PinSignßlPopisSm∞r
1DCDData Carrier Detectvstup
2RxDReceive Datavstup
3TxDTransmit Datav²stup
4DTRData Terminal Readyv²stup
5GNDGround 
6DSRData Set Readyvstup
7RTSRequest To Sendv²stup
8CTSClear To Sendvstup
9RIRing Indicatorvstup

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).

R∙₧iΦka, Pavel (5. 2. 2004)
odborn² redaktor Interval.cz