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φ:
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:
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):
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:
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:
<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:
<%@ 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).