<h2>Komunikujeme p°es sΘriovΘ rozhranφ v ASP.NET</h2>
<p id='prepend'>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Φ.</p>
<h3>Zapojenφ konektoru rozhranφ RS2323</h3>
<p>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φ:</p>
<p>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).</p>
<p>Pro <a href='http://www.hw.cz/projects/rs232/'>kompletnφ popis a zapojenφ konektor∙ rozhranφ RS 232</a> a ukßzky pou₧iteln²ch zapojenφ (nap°φklad <a href='http://www.hw.cz/constrc/teplomer_rs232c/teplomer_rs232c.html#4'>teplom∞r</a>) vßs odkazuji na server <a href='http://hw.cz'>hw.cz</a>, spoustu dalÜφch aplikacφ lze nalΘzt i t°eba pomocφ vyhledßvaΦ∙ a klφΦov²ch slov <em>rs232</em> a <em>serial port</em>. My si v ukßzce k tomuto Φlßnku vytvo°φme aplikaci, kterß p°eΦte a zobrazφ stav linky CTS.</p>
<p>P°φstup k sΘriovΘmu rozhranφ je ve Windows standardizovßn pomocφ <a href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/communications_functions.asp'>komunikaΦnφch funkcφ</a>, implementovan²ch jako API v knihovn∞ Kernel32.dll. V naÜφ aplikaci si <a href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp09192002.asp'>funkce Kernel32.dll jednoduÜe zp°φstupnφme</a> s vyu₧itφm prostoru nßzv∙ <a href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemruntimeinteropservices.asp'>System.Runtime.InteropServices</a>, kter² nabφzφ podporu pro prßci s takzvan²m unmanaged code, jak jsme ji₧ popsali v Φlßnku o vyu₧itφ funkcφ <a href='http://interval.cz/clanek.asp?article=2349' title='R∙₧iΦka, Pavel: Zprßvy v intranetu pomocφ NetApi32.dll v ASP.NET'>NetApi32.dll</a>.</p>
<h3>Knihovna pro prßci s rozhranφm RS232</h3>
<p>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φ <a href='http://msdn.microsoft.com/msdnmag/issues/02/10/NETSerialComm/default.aspx'>Base Class Library</a> - 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 <a href='http://www.codeworks.it/net/VBNetRs232.htm'>o komunikaci p°es RS232 ve VB.NET</a>, 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.</p>
<p>Ukßzka dopsanΘ vlastnosti pro Φtenφ linky CTS (knihovna je psßna v jazyce VB.NET):</p>
<div class='sample'>
Const MS_CTS_ON As Int32 = &H10
<br />
<br />Public ReadOnly Property Cts() As Boolean
<br /> Get
<br /> If Not mhRS = -1 Then
<br /> Dim inputLine As Int32
<br /> If GetCommModemStatus (mhRS, inputLine) Then
<br /> Return inputLine And MS_CTS_ON
<br /> Else
<br /> Return False
<br /> End If
<br /> Else
<br /> Return False
<br /> End If
<br /> End Get
<br />End Property
</div>
<p>Knihovnu prost∞ zkompilujeme a ulo₧φme do slo₧ky <em>Bin</em> 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>
<div class='sample'>
vbc.exe /t:library RS232.vb
</div>
<p>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 <em>Open()</em> 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>
<p>P°i ukonΦenφ aplikace je naprosto nezbytnΘ provedenφm metody <em>Close()</em> 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 <em>aspnet_wp.exe</em> portu "pustil", co₧ nenφ zrovna moc koÜer (jak to obejφt si ukß₧eme dßle).</p>
<h3>Ukßzkovß aplikace</h3>
<p>Ukßzkov² formulß° se zatrhßvacφm polφΦkem, kterΘ vyu₧ijeme pro zobrazenφ stavu linky CTS:</p>
<p>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 <em>try-catch</em> 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.</p>
<p>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.</p>
<h3>Jak ov∞°it funkci prakticky</h3>
<p>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!</p>
<p>Pro reßlnΘ testovßnφ je dobrΘ zakoupit si v <a href='http://adresar.hw.cz/hw/directory/branch.html?branchid=300001'>prodejnßch s radiosouΦßstkami</a> 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∞.</p>
<p>Pokud tedy na lince CTS bude oproti GND signßl logickΘ nuly (co₧ je pro <a href='http://www.hw.cz/projects/rs232/'>rozranφ RS232</a> 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φ <samp>moRS232.Dtr = true;</samp>. DalÜφm °eÜenφm m∙₧e b²t zapojenφ baterie o pat°iΦnΘm nap∞tφ mezi GND a CTS.</p>
<p>Ukßzkovou aplikaci vΦetn∞ zdroje knihovny RS232.dll si m∙₧ete stßhnout (<a href='podklady/ruzicka/742/readserial.zip'>zdrojov² k≤d</a>).</p>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3176'>E-mailov² klient pre webmail v PHP - odosielanie, Φφtanie a s¥ahovanie</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3174'>Strßnkovßnφ v ovlßdacφm prvku DataGrid</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=1312'>Statistika p°φstup∙ v PHP - vyhledßvacφ frßze</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3165' title='(34 komentß°∙)'>Nßh╛ady k obrßzkom generovanΘ v PHP</a></li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3166' title='(25 komentß°∙)'>Maguma Studio - freeware editor PHP skriptov</a></li>