• Analyzujte aktivitu sériového portu

    Serial Port Monitor se může připojit k portu COM, i když je již otevřen nějakou aplikací, a okamžitě jej začít sledovat. Všechna data procházející sledovaným COM portem se zobrazí v našem monitorovacím programu. Vzhledem k tomu, že je vše zaznamenáváno v reálném čase, budete moci okamžitě rozpoznat problémy. Pro porovnání dat existuje funkce synchronizovaného výběru stejných IRP v různých pohledech.

    Kromě toho můžete všechna data sledování přesměrovat do určeného souboru nebo zkopírovat všechna zaznamenaná data do schránky. Sledování sériového portu vám dává možnost zachytit a zaznamenat všechny řídicí kódy vstupu/výstupu sériového portu (IOCTL), sledovat všechna jejich data a parametry. Libovolnou monitorovací relaci můžete uložit a v případě potřeby ji načíst příště.

  • Monitorujte více portů v rámci stejné relace

    Monitor sériového portu má unikátní funkčnost monitorování více COM portů současně. Nyní můžete shromažďovat data o tom, jak aplikace interagují se dvěma nebo více porty a paralelně s více zařízeními v rámci stejné relace. Přijatá a odeslaná monitorovací data budou prezentována (zaznamenávána) do samostatného protokolu v pořadí, v jakém byla přijata, což značně zjednodušuje analýzu.

  • Různé možnosti zobrazení přijatých dat

    Monitorovací data můžete prohlížet ve 4 režimech najednou: tabulka, řádek, výpis nebo terminál, z nichž každý nabízí jiný způsob prezentace zaznamenaných sériových dat. Serial Port Monitor vám umožňuje vybrat monitorovací filtry, čímž vám ušetří čas a umožní vám sledovat pouze události, které vás zajímají. V nastavení si můžete vybrat data k zobrazení: binární, ASCII, nakonfigurovat port. Jakékoli nastavení zobrazení lze použít přímo v aktuálním procesu monitorování.

  • Emulovat přenos dat do sériového zařízení

    Data můžete odeslat na různé formáty(řetězcové, binární, osmičkové, desítkové, hexadecimální, smíšené) na monitorovaný sériový port, jako by byly odeslány přímo řízenou aplikací pomocí funkce Serial Port Monitor Terminal Mode. Tímto způsobem můžete sledovat odezvu řízeného sériového zařízení na některé speciální příkazy a data.

  • Plná podpora datového protokolu Modbus (RTU a ASCII)

    S pomocí nových filtrů Serial Port Monitor budete schopni dešifrovat a analyzovat data Modbus. Program pomůže nejen navázat spojení mezi zařízeními RS485/422/232, ale také provést efektivní analýzu procházejících dat.

  • Přehrajte a porovnejte monitorovací relace

    Sledování sériového portu poskytuje jedinečnou možnost přehrát relaci z aplikace na port nejlepší analýza probíhající procesy. Budete moci sledovat reakci sériového portu na průchod stejných dat, čímž zvýšíte efektivitu monitorování. Máte také možnost porovnat více monitorovacích relací a automaticky sledovat rozdíl mezi nimi.

Dnes počítačové viry doslova zaplavily svět a volně se potulují po internetu, takže když se řekne porty, většina uživatelů si často vybaví logické porty, které se v síťových technologiích jako TCP/IP nebo UDP používají k organizaci komunikačních kanálů, a zapomínají na fyzické porty. pro připojení externích zařízení. I pro připojení tiskáren se však stále častěji používají myši a klávesnice vysokorychlostní USB porty a stále méně často - staré dobré COM a LPT (sériové a paralelní porty). Ty jsou však k dispozici i v nejmodernějších počítačích a možná nastal čas je využít k jinému účelu (řekněme k ovládání toho či onoho specializovaného zařízení).

Aby bylo možné sledovat výměnu mezi počítačem a některým zařízením, jsou právě potřebné programy pro analýzu portů.

V prodeji jsou samozřejmě i speciální zařízení (sondy) pro monitorování analogových a digitálních signálů (včetně analyzátorů USB, LPT a COM), nicméně jako každý profesionální vybavení jsou docela drahé.

Řízení sériového portu počítače (COM)

Jeden z programů pro analýzu sériových portů napsal Valery Kovtun (http://valery-us4leh.narod.ru/). Díky za skvělý nástroj!

Program se nazývá Com Port Visual Control (http://valery-us4leh.narod.ru/ComVC.html), je distribuován zdarma a je určen pro vizuální kontrolu, dokumentování výměny dat a studium procesů probíhajících v UART transceiveru. při provozu aplikací využívajících COM port osobní počítač. Tento program funguje v Prostředí Windows 9x/Me/NT/2000/XP a provádí průběžné prohlížení (monitorování) všech registrů čipu UART. Řadič má formát 8x8 (osm registrů po osmi bitech) a pro každý registr samostatně zobrazuje: aktuální stav (současně v desítkovém i hexadecimálním formátu) a také logický stav. Kromě toho může program zapisovat hodnoty do registrů (také v desítkovém i hexadecimálním formátu) a podle toho spravovat logický stav. Kromě toho hlídá změny v registrech a vede protokol (LOG) podle příkazů transceiveru čipu UART a také vede protokol přijatých a vysílaných dat na úrovni strojových kódů. Po práci program prohlíží a ukládá LOG-soubory a může v nich vyhledávat potřebné informace.

Com Port Visual Control má vestavěný transceiver pro standardní nastavení režimy portů: datové bity, stop bity, rychlost, parita, kontrola chyb, schopnost přijímat a přenášet textová data a příkazy modemu, stejně jako indikátor pro sledování aktivního stavu příkazů UART (podporováno 17 základních příkazů). Kromě toho jsou monitorovány porty počítače se současným zobrazením skupiny registrů a stavových bitů a je udržován protokol pro změnu dat v základním registru.

Mezi takové programy patří bezplatný nástroj ComLite32 od Realtime Communications (RTCOMM, http://www.rtcomm.com/), napsaný pro Windows 95 a jeho prémiová placená verze ComLab32 (http://www.rtcard.com/comlab32.html).

Tyto programy jsou výkonné analyzátory komunikace v reálném čase, které vám umožní prozkoumat výměnu přes COM port a pochopit, jak konkrétní zařízení funguje, i když k němu neexistuje žádná dokumentace. Program je pohodlný a intuitivní přehledné rozhraní, což usnadňuje monitorování výměny, správu I/O portů a poskytování podrobné online dokumentace.

Programy ComLite32 a ComLab32 pracují s porty RS-232, RS-422, RS-485 a RTX485 (přičemž poslední port je pouze pro čtení) a umožňují s těmito porty komunikovat v obou směrech. Požadavky na systém Programy ComLite32 jsou minimální: pouze 8 MB RAM, 6 MB místo na disku a alespoň jedno zařízení, které pracuje se sériovým portem (včetně modemů PCMCIA pro notebooky).

A nakonec bych rád poznamenal programy Advanced Serial Port Monitor a Advanced Serial Data Logger od AGG Software (http://www.aggsoft.ru). Advanced Serial Data Logger zpracovává data přijatá přes RS-232 a přenáší je do excelový soubor, Access nebo nějakou jinou aplikaci Windows. Program poskytuje možnost sbírat data z libovolného zařízení v reálném čase a také přijímat a přenášet data přes rozhraní RS-232 nebo přes rozhraní RS-485, pokud je k dispozici hardwarový převodník. Advanced Serial Data Logger shromažďuje data ze sériového portu, zpracovává je podle potřeb uživatele, extrahuje bloky dat z obecného streamu a poté data přenáší do libovolné aplikace Windows nebo DOS - stisknutím příslušných kláves v aplikaci okno. Data jsou přenášena prostřednictvím DDE (Dynamic Data Exchange), ODBC, OLE atd. Toto řešení lze použít v systémech automatizovaného sběru dat nebo v systémech analýzy hovorů PBX.

Advanced Serial Data Logger může také odesílat požadavky a příkazy přes sériový port k přímému ovládání zařízení přes ASCII (výchozí) nebo protokol MODBUS. Program Advanced Serial Data Logger se tak stává I/O serverem. Co se týče správy a nastavení, jsou velmi jednoduché a intuitivní. Dodatečné programování pro sběr dat není nutné.

Kromě toho může Advanced Serial Data Logger fungovat jako služba pod Windows NT/2000/XP/2003, která se spustí při spuštění systému a zapíše data ze sériového portu do souboru na disku nebo do jiných určených umístění ještě předtím, než se uživatel přihlásí. do systému (a bude fungovat i po skončení uživatelské relace).

Program má schopnost spouštět více kopií na stejném počítači, takže může být přihlášeno více portů současně.

Pokud jde o program Advanced Serial Port Monitor, může být užitečný jak pro začínající uživatele, tak pro profesionály.

Advanced Serial Port Monitor lze použít jak ke sledování přenosu dat jinými aplikacemi, tak k odesílání a přijímání dat přes sériový port počítače (RS-232). Program poskytuje různé cesty ukládání dat do souboru nebo jejich vizualizace na obrazovce monitoru.

Můžete tak pracovat s libovolnými zařízeními, která pracují přes rozhraní RS-232 nebo RS-485 (RS-422) s příslušným převodníkem. Budete pozorovat výměnu dat mezi jakoukoli aplikací Windows a externí zařízení připojený k sériovému portu. Může to být buď měřicí zařízení, domácí rádio nebo jiný počítač připojený přes z-modem nebo kabel nulového modemu.

Advanced Serial Port Monitor podporuje plně duplexní provoz, to znamená, že můžete sledovat výměnu v obou směrech bez použití jiných programů a bez přerušení jiných aplikací. Veškeré informace procházející sériovým portem se zobrazují na obrazovce ve speciálním okně a lze je zapsat do souboru. Všechny zobrazené parametry lze během provozu měnit. Program zároveň podporuje dva režimy - automatický a manuální, to znamená, že data můžete odeslat stisknutím tlačítka "Odeslat" nebo budou odesílána automaticky v určitém intervalu (od 10 do 10 000 ms).

Pomocí přídavných modulů můžete nejen přijímat data nebo odesílat příkazy, ale také emulovat práci některých konkrétní zařízení, a v režimu pozorovatele (interceptor) - stačí sledovat výměnu dat mezi externím zařízením připojeným k sériovému portu a některými Windows aplikace. A konečně, Advanced Serial Port Monitor má svůj vlastní vestavěný skriptovací jazyk, pomocí kterého můžete spouštět program s přednastavenými možnostmi a akcemi a také spouštět příkazy z modulů.

Řízení paralelního portu počítače (LPT)

Valery Kovtun má další užitečný komunikační program - LPT 3D Hard Analyzer. Program je grafický analyzátor-osciloskop paměti určený k zachycení digitálních signálů a protokolů zařízení připojených k paralelnímu portu počítače ve Windows 95/98/Me/NT/2000/XP.

LPT 3D Hard Analyzer pracuje přes port LPT a umožňuje analyzovat pět vstupních linek (kanálů) a 12 výstupních kanálů (tj. digitální signály z počítače) v režimu SPP nebo ovládat čtyři výstupy a 14 vstupní parametry v režimu EPP. Režim obousměrného paralelního portu EPP je k dispozici téměř na všech počítačích vydaných po roce 1993. Někdy však není ve výchozím nastavení v BIOSu povoleno (to je nutné zaškrtnout a pokud možno povolit).

Při práci v režimu osciloskopu si program pamatuje všech 17 grafů (čar), hloubka (zobrazená délka grafu v čase) je omezena pouze volnou pamětí počítače (a s přihlédnutím k stránkovacímu souboru v OC Windows, to bude několik set megabajtů). K dispozici je také možnost automatického uložení každého nová stránka v grafickém formátu.

Analyzátor-osciloskop LPT 3D Hard Analyzer vykresluje změny dat ve dvourozměrné a trojrozměrné podobě a také ukazuje dva nezávislé diagramy: 17kanálový osciloskop (bit na kanál) a graf portových registrů (vstup, výstup, ovládání) . Dochází k úpravě rychlosti analýzy a zobrazení celkového počtu cyklů za celou dobu průběhu grafu. Můžete také naprogramovat počet cyklů s možností kopírování grafů do paměti (hloubka vykreslování je omezena pouze dostupným RAM počítač). Program má nástroje pro úsporu systémových prostředků při čtení dat z vysokorychlostních zařízení připojených k portu LPT a synchronizovaných s tímto programem (tj. lze jej použít na relativně slabých počítačích). Když vypnete režim grafického zobrazení, grafika se zkopíruje pouze do paměti počítače – v důsledku toho se rychlost programu desetinásobně zvýší. Na konci analýzy je graf prohlížen stejným způsobem, jako kdyby byl přepnut do režimu grafického zobrazení. Posouvání grafů probíhá plynule a stránku po stránce ( klikněte pravým tlačítkem myši myši). K dispozici je flexibilní nastavení rychlosti a kroku rolování a také možnost automatické komprimace celého grafu v rámci jedné stránky. Snímky stavu vybrané stránky grafu lze ukládat formáty BMP a WMF (metasoubor Windows) nebo nastavit automatické ukládání do samostatného souboru pro každou novou stránku. Pro zobrazení má balíček vestavěný prohlížeč grafických souborů.

Modul řízení portů je založen na základním kódu jiného programu od Valeryho Kovtuna - XP LPT, který používá I/O ovladač LPT WDMIO.

Program XP LPT je určen k ovládání paralelních portů počítače z Windows 9x/2000/XP a má následující vlastnosti:

  • provádí automatickou registraci ovladače ve Windows XP jako správce systému;
  • vede automatická kontrola zavedené přístavy;
  • provádí simultánní čtení datových, řídicích a stavových registrů zvoleného LPT portu;
  • zobrazuje obsah registrů současně v různých formátech (desítkové a šestnáctkové), čímž odpadá nutnost přepočítávání.

Tento program má k dispozici zdroj, popis a také příklady tvorby programů pro ovládání externích zařízení přes paralelní port založený na tomto řešení.

Jak jsme již uvedli, program funguje prostřednictvím LPT WDMIO I/O ovladače a je navržen speciálně pro školení a ladění vlastních programů pro ovládání externích zařízení přes paralelní port v prostředí Windows.

Valery Kovtun také vytvořil program PortControl, který slouží k ovládání paralelního portu se 17bitovým analyzátorem komunikačního protokolu pro zařízení využívající LPT port počítače. Program je napsán pro rodinu operačních systémů Windows a má následující funkce:

  • existují tři nezávislé kanály, které lze použít pro zadání adresy portu (registru), automatické čtení dat z portu, zápis dat na port v desítkovém a hexadecimálním formátu a zobrazení dat ve formátech bite, word a Dword;
  • je zobrazen stav každého ze 17 bitů LPT portu a výstupní bity jsou řízeny;
  • k dispozici devět programovatelných portů/datových paměťových bank;
  • 17kanálový analyzátor-osciloskop logického stavu každého bitu pracuje s možností nastavení rychlosti analýzy (v čase), synchronizace kterýmkoli ze 17 bitů - dle vysoká úroveň(1) a low (0), stejně jako počítadlo přenesených dat pro každý bit a mnoho dalších funkcí pro snadnou kontrolu a ladění digitální zařízení připojený k počítači.

Tento program lze použít jak jako digitální vícekanálový osciloskop, tak pro ovládání externích zařízení přes počítač.

Programy pro analýzu a správu portů mohou mít různé aplikace. Za prvé, dá se na ně zvyknout podrobná kontrola a testování výkonu paralelního portu počítače, například pro kontrolu výkonu LPT portu a systému jako celku pomocí režimu Test out. Navíc je pohodlné sledovat všechny operace v čase pomocí vestavěného 17kanálového analyzátoru-osciloskopu s možností flexibilního nastavení pro určitý typ měření.

Pro analýzu vysokorychlostních sběrnic digitálního přenosu dat připojených k počítači různých radioelektronických zařízení a mikroobvodů se doporučuje počítač s frekvencí procesoru alespoň 300 MHz. Ale u nízkorychlostních zařízení více než slabé počítače pod Ovládání Windows 95.

Za druhé, programy analyzátoru lze použít k ovládání, analýze, konfiguraci, vývoji, testování a opravě digitálních rádiových elektronických obvodů ( jednotlivé moduly, bloky, řídicí sběrnice, řídicí protokoly frekvenčního syntezátoru, řídicí prvky digitální indikátory, programátory ROM atd.), tedy tam, kde jsou široce používány digitální mikroobvody, které tvoří řídicí signály a nějak na ně reagují.

Za třetí, programy pro analýzu portů lze jednoduše použít ke čtení protokolů výměny. A synchronizací datové sběrnice a řídicích signálů zařízení pro ukládání informací a identifikaci můžete dokonce číst servisní signály a/nebo přístupová hesla zakódovaná v sekvencích nul a jedniček. Obecně jsou tyto programy navrženy tak, aby umožnily radioamatérům, elektrotechnikům nebo konstruktérům. Vizuální studie provozních protokolů rádiových elektronických zařízení může být také užitečná při vývoji vlastních software ovládané různými ovladači.

Za čtvrté, analyzační programy budou velmi užitečné pro opravy kancelářského vybavení, které nějakým způsobem využívá paralelní port počítače - různé tiskárny, skenery, pokladny a další zařízení.

Za páté, uvedené programy budou užitečné pro začínající programátory. Pokud se například rozhodnete psát malý program pro ovládání určitých externích zařízení přes paralelní port pro vás bude velmi pohodlné vizuálně sledovat algoritmus vašeho programu v multifunkčním rozhraní PortControl. Díky tomu budete schopni včas odhalit a odstranit vzniklé chyby bez použití měřící nástroje na výstupu portu a bez zásahu do obvodů ovládaného zařízení.

A nakonec, pro paralelní port, navrhuje Valery Kovtun užitečný program PinRegistrator, určený ke sledování a registraci logického stavu bitů portu LPT. Program byl napsán pod Windows 95/98/Me a zaznamenává stav paralelního portu automaticky nebo ručně.

Ovládání USB portu počítače

Výše zmíněná společnost AGG Software má programy určené k analýze a monitorování USB portů, sběrnic, řadičů a zařízení. Například Advanced USB Monitor (http://www.aggsoft.ru/usb-monitor/index.htm) umožňuje zachytit, analyzovat, zobrazit a zpracovat USB provoz pro efektivní ladění a testování USB zařízení. Jsou podporována zařízení, která splňují všechny specifikace: UHCI- (staré USB zařízení 1.x zařízení pracující rychlostí až 1,5 Mbps), OHCI- (příští generace USB 1.x zařízení pracující rychlostí až 12 Mbps) a konečně zařízení USB 2.0 EHCI (fungující rychlostí až 480 Mbps). Advanced USB Monitor umožňuje rozšířit laboratorní sadu nástrojů jak pro vývojáře USB zařízení, tak pro pokročilé uživatele.

Advanced USB Monitor dokáže zobrazit přenášené datové pakety čitelným způsobem, dekódovat deskriptory, detekovat chyby paketů a měřit výkon zařízení. Během zachycení mohou být datové pakety zobrazeny v reálném čase, což vám umožní sledovat stav zařízení. Datové pakety jsou uloženy v chronologickém pořadí a obsahují úplné informace o adresách a koncových bodech. Díky tomu je velmi snadné identifikovat, filtrovat a vyhledávat pakety. Program poskytuje několik úrovní detailů při zobrazování dat. Rychlé dekódování USB provozu umožňuje pracovat i s takovým vysokorychlostní zařízení jako USB disky nebo USB fotoaparáty. Kromě toho dochází k zachycení, sledování a záznamu zachycených dat v reálném čase. S Advanced USB Monitor můžete sledovat provoz tak, jak k němu dochází, a současně pro celou řadu USB zařízení, přičemž je současně otevřeno několik monitorovacích oken.

Použití ovladače pro zachycení jádra s podporou WDM, WMI, Power Management a PNP vám umožní dosáhnout plné kompatibility s operační systém a USB zařízení pro maximální výkon.

Program vám také dává možnost měřit výkon jakéhokoli zařízení USB. Advanced USB Monitor snadno projde topologií USB zařízení a získá podrobné informace technické informace o zařízeních, jako jsou USB disky (rozhraní, koncové body, informace z registru, informace o třídě a další). Na konci studie můžete získat hotovou zprávu o připojených zařízeních a provozu USB a na konci studie ji vytisknout na tiskárně. Kromě toho má program pokročilé funkce pro export dat do PDF formáty, XML nebo Microsoft Word, což umožňuje neomezovat proces následného zpracování dat pouze na tento jeden program.

USB osciloskopy (http://www.usb-osc.narod.ru/) pracují na stejném principu jako výše popsané analyzátory-osciloskopy pro paralelní port. USB osciloskop je primárně určen pro radioamatéry, kteří se z povahy své práce potýkají s potřebou analyzovat nízkofrekvenční analogové signály, registrovat dlouhodobě pomalu se měnící procesy a také zkoumat binární signály z různá zařízení. USB osciloskop lze navíc použít jako jednoduchý dvoukanálový voltmetr pro napětí v rozsahu +/-20 V, frekvenční čítač pro frekvence signálu do 50 kHz nebo sondu se zvukovou výstrahou.

Takže osciloskop USB poskytuje následující režimy provozu:

  • dvoukanálový osciloskop (měření značek, synchronizace, měření napětí a frekvence signálu, filtrace atd.);
  • dvoukanálový spektrální analyzátor (měření značek, různé funkce oken, filtrování atd.);
  • dvoukanálový záznamník (marker měření, záznam signálu na několik desítek hodin atd.);
  • 8/16kanálový logický analyzátor (měření značek, synchronizace, přeskakování daného počtu pulsů, hledání dané logické kombinace, dekódovací rozhraní UART, SPI, I2C, 1-Wire atd.);
  • 8-kanálový logický generátor (nastavení tabulky signálů nebo přímá konstrukce časových diagramů pomocí myši atd.).

USB osciloskop navíc umožňuje uložit výsledky všech měření ve formě vektorového nebo rastrového výkresu pro pozdější import do jiných programů nebo pro uložení do souboru pro pozdější analýzu. Výsledky všech měření lze vytisknout, zkopírovat do schránky, stejně jako nastavit události a doprovázet je zvukovým komentářem. Lze vypočítat různé digitální filtry a provést analogové filtrování a vyhlazování časování osciloskopu. Zařízení umožňuje zobrazit statistiky pro všechny kanály logického analyzátoru a generátoru.

USB osciloskopy však již nejsou jen programy, ale zařízení vyrobená ve formě externích jednotek s rozhraním USB a doprovázená poskytovateli služeb. softwarových modulů. Tedy jde o celý univerzální měřicí komplex, skládající se ze spínacího nástavce a počítače. Firmware takového zařízení můžete mimochodem aktualizovat přes USB sběrnici, která umožňuje doplnit možnosti zařízení o libovolné vlastní funkce.

Taková zařízení vyrábí ukrajinská společnost Da-Labs (http://www.da-labs.com/) a ruská společnost"Trade-M" (http://motor-master.ru/index.htm/). Cena sady ruské společnosti je 1850 rublů. s výjimkou doručení.

Takže vyzbrojeni potřebnými nástroji máme nyní možnost nezávisle psát ovládací programy pro různá externí zařízení pomocí libovolných portů našeho počítače.

Sériové porty milují vývojáři pro jejich snadnou údržbu a použití.

A samozřejmě, zápis do konzole terminálového programu je všechno dobré, ale chci svou vlastní aplikaci, která stisknutím klávesy na obrazovce provede akce, které potřebujete;)

V tomto článku popíšu jak pracovat s com portem v jazyce C++.

Řešení je jednoduché, ale z nějakého důvodu nebyl okamžitě nalezen funkční příklad. Pro sim to ukládám sem.

Samozřejmě můžete použít multiplatformní řešení, jako je QSerial - knihovna v Qt, pravděpodobně budu, ale v budoucnu. Nyní se bavíme o „čistých“ Windows C++. Budeme psát do vizuální studio. Mám rok 2010, i když to nehraje žádnou roli...

Vytvořte nový projekt konzoly Win32.

Zahrnout hlavičkové soubory:

#zahrnout #zahrnout pomocí jmenného prostoru std;

Deklarujeme obslužný program com portu:

RUKOJEŤ hSerial;

Dělám to globálně, takže se nemusím starat o ukazatele při předávání funkcím.

int _tmain(int argc, _TCHAR* argv) (

Nemůžu vystát styl programování Windows. Nazvali vše svým vlastním způsobem a sedí a radují se ...

Nyní kouzlo deklarování řetězce s názvem portu. Jde o to, že není schopen transformovat samotný char.

LPCTSTR název_portu = L"COM1";

Práce se sériovými porty ve Windows funguje jako se souborem. Otevření prvního com port pro zápis/čtení:

HSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

Kontrola funkčnosti:

If(hSerial==INVALID_HANDLE_VALUE) ( if(GetLastError()==ERROR_FILE_NOT_FOUND) ( cout<< "serial port does not exist.\n"; } cout << "some other error occurred.\n"; }

Nyní musíte nakonfigurovat parametry připojení:

DCB dcbSerialParams = (0); dcbSerialParams.DCBlength=sizeof(dcbSerialParams); if (!GetCommState(hSerial, &dcbSerialParams)) ( cout<< "getting state error\n"; } dcbSerialParams.BaudRate=CBR_9600; dcbSerialParams.ByteSize=8; dcbSerialParams.StopBits=ONESTOPBIT; dcbSerialParams.Parity=NOPARITY; if(!SetCommState(hSerial, &dcbSerialParams)) { cout << "error setting serial port state\n"; }

Na msdn se doporučuje nejprve získat parametry a poté je změnit. Stále se učíme, takže děláme, jak je požadováno.

Nyní deklarujme řetězec, který předáme, a proměnné potřebné k tomu:

Char data = "Ahoj z C++"; // řetězec pro předání DWORD dwSize = sizeof(data); // velikost tohoto řetězce DWORD dwBytesWritten; // zde bude počet skutečně přenesených bajtů

Odeslání řetězce. Dovolte mi připomenout, že příklad je nejjednodušší, takže neprovádím žádné zvláštní kontroly:

BOOL iRet = WriteFile(hSerial,data,dwSize,&dwBytesWritten,NULL);

Také jsem se rozhodl zobrazit velikost řetězce a počet bajtů odeslaných k ovládání:

Cout<< dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl;

Na konci programu vytvoříme nekonečnou smyčku čtení dat:

While(1) ( ReadCOM(); ) return 0; )

Nyní funkce čtení:

Void ReadCOM() ( DWORD iSize; char sReceivedChar; while (true) ( ​​​​ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0); // získat 1 bajt, pokud (iSize > 0) // vytisknout cout, pokud je něco přijato<< sReceivedChar; } }

To je vlastně celý příklad.

O tom, jak krásně reprezentovat data odesílaná Arduinem do Serialu. Podle mého názoru kluci nabídli velmi krásné řešení, které na jedné straně vypadá docela jednoduše a na druhé straně vám umožňuje získat vynikající výsledek s minimálním úsilím.

V komentářích k článku bylo litováno, že takové řešení nebude fungovat pod Firefoxem, a zazněla myšlenka, že „na základě této věci stále můžete napsat jednoduchý webový server s html výstupem“. Tento nápad mě „chytil“, rychlé hledání na googlu nedalo hotové řešení a rozhodl jsem se nápad realizovat sám. A tady je to, co z toho vzešlo.

Varování! Navržené řešení by v žádném případě nemělo být považováno za úplné. Na rozdíl od Amperky Serial Projector jde o koncept, ukázku možného přístupu, fungující prototyp a nic víc.

Před časem jsem udělal projekt, ve kterém jsem použil vestavěné akcelerometry ve smartphonu Android k ovládání serv připojených k Arduinu. Poté jsem pro tyto účely použil projekty Scripting Layer pro Android (SL4A) a RemoteSensors. Ukázalo se, že standardní knihovna pythonu obsahuje balíček BaseHTTPServer, pomocí kterého je vytvoření webové služby v pythonu úkolem v několika řádcích kódu.

Pro Arduino nebyly po ruce žádné senzory, a tak jsem jako zdroj zobrazovaných informací použil interní teploměr zabudovaný v Arduinu Uno. Pokud jsem pochopil, není příliš přesný a vůbec není určen pro měření okolní teploty, ale pro prototypování postačí.

Po krátkém googlování je zde skica pro arduino:

// zdroj: https://code.google.com/p/tinkerit/wiki/SecretThermometer long readTemp() (dlouhý výsledek; // Čtení teplotního senzoru proti 1,1V referenci ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); delay(2); // Počkejte, až Vref vyrovná ADCSRA |= _BV(ADSC); // Převést while (bit_is_set(ADCSRA,ADSC)); výsledek = ADCL; výsledek |= ADCH<<8; result = (result - 125) * 1075; return result; } void setup() { Serial.begin(115200); } int count = 0; void loop() { String s = String(count++, DEC) + ": " + String(readTemp(), DEC); Serial.println(s) delay(1000); }
Tato skica otevře COM port, nastaví jej na 115200 baudů a pak do něj každou sekundu zapíše aktuální hodnotu vestavěného teploměru. (Neptejte se mě, v jakých jednotkách se udává teplota - pro popsanou úlohu to není důležité). Protože se hodnota nemění příliš aktivně, pro lepší viditelnost změn dat je číslo řádku zobrazeno před teplotou.

Chcete-li zkontrolovat, zda webový server vydá pouze celé řádky, a ne jejich části, jak čte z COM portu, řádek
Serial.println(y)
byl nahrazen
for(int i=0; i< s.length(); i++){ Serial.print(s.charAt(i)); delay(200); } Serial.println("");
těch. vytvořený řetězec není odeslán na sériový port celý, ale znak po znaku, s pauzami 200 ms.

Nejprve byl napsán velmi jednoduchý prototyp webového serveru (níže je rozebrán na části):
# -*- kódování: utf-8 -*- #-- na základě: https://raw.githubusercontent.com/Jonty/RemoteSensors/master/remoteSensors.py SERIAL_PORT_NAME = "COM6" SERIAL_PORT_SPEED = 115200 WEB_SERVER_PORT čas importu = 800 , BaseHTTPServer, urlparse import serial ser = None def main(): global ser httpd = BaseHTTPServer.HTTPServer(("", WEB_SERVER_PORT), Handler) #-- řešení pro získání IP adresy, na které obsluhující import soket s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM) s.connect(("google.co.uk", 80)) sData = s.getsockname() print "Poskytuje se na "%s:%s"" % (sData, WEB_SERVER_PORT) ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, timeout=0) httpd.serve_forever() class Handler(BaseHTTPServer.BaseHTTPRequestHandler): # Zakázat protokolování DNS vyhledávání def address_string(self): return str(self.client_address) def do_GET(self): self.send_response(200) self.send_header("Typ obsahu", "application/x-javascript; charset=utf-8") self.end_headers() zkuste: while True: new_serial_line = get_full_line_from_serial() pokud new_serial_line není Žádný: self.wfile.write(new_serial_line) self.wfile.write("\n") self.wfile.flush() kromě socket.error, e: print "Klient odpojen.\n" capture = "" def get_full_line_from_serial(): """ vrací celý řádek ze seriálu nebo Žádné Používá globální proměnné "ser" a "captured" """ globální zachycená část = ser.readline() pokud část: zachycená += část části = capture.split("\n", 1); if len(parts) == 2: capture = parts return parts return None if __name__ == "__main__": main()
Pojďme si scénář rozebrat kousek po kousku.

Vzhledem k tomu, že se jedná o prototyp, jsou všechny hlavní provozní parametry (název COM portu, jeho rychlost a také číslo TCP portu, na kterém poběží webový server) uvedeny přímo ve zdrojovém textu:
SERIAL_PORT_NAME="COM6" SERIAL_PORT_SPEED=115200 WEB_SERVER_PORT=8000
Samozřejmě můžete zařídit čtení těchto parametrů z příkazového řádku. Například s pomocí modulu argparse to jde velmi rychle, jednoduše a flexibilně.

V tomto případě musí uživatelé Windows zjistit ve správci zařízení název COM portu, ke kterému je Arduin připojen. Pro mě to bylo "COM6". Uživatelé jiných operačních systémů musí používat nástroje svého OS. S MacOS nemám vůbec žádné zkušenosti a s COM porty jsem na Linuxu taky nepracoval, ale tam to s největší pravděpodobností bude něco jako "/dev/ttySn".

Dále následuje definice globální proměnné, na kterou bude vázána instance třídy Serial, která je v pythonu zodpovědná za práci s COM portem:
ser = Žádný
V souladu
httpd = BaseHTTPServer.HTTPServer(("", WEB_SERVER_PORT), Handler)
je vytvořen webový server, který bude naslouchat požadavkům na zadaném portu WEB_SERVER_PORT. A tyto požadavky budou zpracovány instancí třídy Handler, popsané níže.

Následující řádky jsou malým „hackem“ pro zobrazení IP adresy, na které běží běžící webový server:
#-- zástupné řešení pro získání IP adresy, ze které sloužící import soketu s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("google.co.uk", 80)) sData = s.getsockname() tisknout "Podáváme na "%s:%s"" % (sData, WEB_SERVER_PORT)
Pokud tomu dobře rozumím, neexistuje žádný jiný způsob, jak tuto IP zjistit. A jak bez těchto znalostí přistoupíme na náš server z prohlížeče?

Proto musíte otevřít soket a připojit se k webu Google, abyste z atributů tohoto soketu získali informace o své vlastní IP adrese.

O něco níže se otevře COM port a webový server se skutečně spustí:
ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, timeout=0) httpd.serve_forever()
Následuje popis třídy, která je zodpovědná za zpracování požadavků přijatých běžícím webovým serverem:
class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
Jedná se o dědice třídy zabudované v modulu BaseHTTPServer, ve kterém stačí přepsat pouze metodu do_GET

Vzhledem k tomu, že se stále jedná o prototyp, bude server „šťastný“ s jakýmkoli požadavkem – bez ohledu na to, jaké URL je od něj požadováno, poskytne klientovi všechna data načtená z COM portu. Proto v Handler.do_GET okamžitě odpoví kódem úspěchu a nezbytnými hlavičkami:
self.send_response(200) self.send_header("Typ obsahu", "application/x-javascript; charset=utf-8") self.end_headers()
načež se spustí nekonečná smyčka, ve které se pokusí přečíst celý řádek z COM portu a pokud byl tento pokus úspěšný, přenést jej do webového klienta:
zatímco True: new_serial_line = get_full_line_from_serial() if new_serial_line is not None: self.wfile.write(new_serial_line) self.wfile.write("\n") self.wfile.flush()
V projektu, který byl vzat jako základ, byla tato nekonečná smyčka „zabalena“ do pokusu ... kromě bloku, s jehož pomocí měla pečlivě zvládnout přerušení spojení. Možná v Androidu (pro něj byl vyvinut základní projekt) to funguje dobře, ale pod Windows XP mi to nefungovalo - když bylo spojení přerušeno, došlo k nějaké další výjimce, kterou jsem se nikdy nenaučil zachytit. To však naštěstí nezabránilo tomu, aby webový server fungoval normálně a přijímal následující požadavky.

Funkce získání celého řetězce z COM portu funguje na stejném principu jako tvůrci Serial Projector:

  • existuje nějaká globální vyrovnávací paměť, která ukládá vše, co je načteno z COM portu
  • při každém zavolání funkce se pokusí něco přečíst z COM portu
  • pokud uspěje, tak
    • přidá to, co bylo právě přečteno, do zadané globální vyrovnávací paměti
    • se snaží rozdělit globální vyrovnávací paměť na maximálně dvě části znakem konce řádku
    • pokud uspěje, vrátí první část volající proceduře a druhou část použije jako novou hodnotu globální vyrovnávací paměti
  • pokud v portu COM nejsou žádná nová data nebo nebyl nalezen znak konce řádku, vrátí funkce None:
capture = "" def get_full_line_from_serial(): """ vrací celý řádek ze seriálu nebo Žádné Používá globální proměnné "ser" a "captured" """ globální zachycená část = ser.readline() pokud část: zachycená += část části = capture.split("\n", 1); if len(parts) == 2: capture = parts return parts return None
Ve výsledku to dopadlo takto:

Je vidět, že se v prohlížeči objevují řádky, které se čtou z COM portu. Na webovém frontendu nic nechápu: JavaScript, Ajax, CSS a DOM jsou pro mě temný les. Ale zdá se mi, že programátorům vytvářejícím webová rozhraní by to mělo stačit k převedení tohoto výstupu do stejně krásného obrazu, jaký vytváří Sériový projektor Amperky. Úkolem je podle mého názoru vytvořit javascriptový skript, který přistoupí na webový server, přečte z něj stream a vypíše poslední přečtený řádek na správné místo na webové stránce.

Pro jistotu jsem se rozhodl hrát na jistotu a pokusil jsem se první přiblížení udělat sám. Nepříliš hluboké vyhledávání Google naznačilo, že ve skutečnosti se pro takové účely používaly přinejmenším WebSockets nebo Server-Sent Events. Našel jsem to, co se mi zdálo jako dobré využití Server-Sent Events, a rozhodl jsem se tuto technologii použít.

Poznámka! To se nejeví jako nejlepší řešení, protože tato technologie nefungovala v Internet Exploreru 8, ani v prohlížeči zabudovaném v Androidu 2.3.5. Fungovalo to ale minimálně ve Firefoxu 39.0, takže jsem dál „nehrabal“.

Z pohledu python skriptu jsou změny pod Server-Sent Events zcela malé:

  • je nutné nahradit typ údajů poskytnutých klientovi:
    čára
    self.send_header("Typ obsahu", "application/x-javascript; charset=utf-8")
    nahrazen
    self.send_header("Typ obsahu", "text/stream-události")
  • a také před řádek načtený z COM portu vložte předponu "data:" a přidejte další znak nového řádku:
    linky
    self.wfile.write(new_serial_line) self.wfile.write("\n")
    nahrazen
    self.wfile.write("data: " + nový_sériový_řádek) self.wfile.write("\n\n")

Vše ostatní by pravděpodobně mohlo zůstat beze změny, ale...

Nejprve jsem vytvořil soubor index.html s následujícím obsahem:

záhlaví


Nejzajímavější na něm je linie
který tvoří místo pro výstup dalšího řádku z COM portu a javascriptový skript

který ve skutečnosti čte stream z webového serveru a odešle přečtené informace na zadané místo.

Měl jsem v úmyslu otevřít tento soubor v prohlížeči, například z disku nebo z nějakého jiného webového serveru, ale to nefungovalo: při otevírání stránky z disku javascriptový skript jednou přistoupil na běžící webový server Pythonu a okamžitě se odpojil. Nechápal jsem, proč se to děje, a navrhl jsem, že by to mohla být nějaká ochrana prohlížeče proti různým útokům. Pravděpodobně se mu nelíbí, že samotná stránka je otevřena z jednoho zdroje a skript čte data z jiného zdroje.

Proto bylo rozhodnuto změnit webový server Pythonu tak, aby obsluhoval i tuto html stránku. Pak by se ukázalo, že stránka i stream jsou čteny ze stejného zdroje. Nevím, jestli se můj předpoklad o bezpečnosti ukázal jako správný, nebo něco jiného, ​​ale s touto implementací vše fungovalo, jak mělo.

Samozřejmě stačí změnit pouze třídu obsluhy požadavku Handler:
class Handler(BaseHTTPServer.BaseHTTPRequestHandler): # Zakázat protokolování DNS vyhledávání def address_string(self): return str(self.client_address) def do_GET(self): if self.path == "/" nebo self.path == "/index .html": self.process_index() elif self.path == "/get_serial": self.process_get_serial() else: self.process_unknown() def process_index(self): self.send_response(200) self.send_header("Obsah -type", "text/html; charset=utf-8") self.end_headers() self.wfile.write(open("index.html").read()) self.wfile.write("\n\ n") self.wfile.flush() def process_get_serial(self): self.send_response(200) self.send_header("Typ obsahu", "text/proud událostí") self.end_headers() zkuste: while True: new_serial_line = get_full_line_from_serial() if new_serial_line is not None: self.wfile.write("data: " + new_serial_line) self.wfile.write("\n\n") self.wfile.flush() kromě socket.error, e : print "Klient odpojen.\n" def process_unknown(self): self.send_response(404)
Tato volba předpokládá, že webový server odpoví pouze na dva požadavky: "/index.html" (poskytne html kód stránky) a "/get_serial" (poskytne nekonečný proud řetězců načtených z COM portu). Všechny ostatní požadavky budou zodpovězeny kódem 404.

Protože index.html je obsluhován webovým serverem Python, lze jej mírně upravit zadáním relativní místo absolutní adresy řetězcového proudu z portu COM:
tětiva
var source = new EventSource("http://192.168.1.207:8000/")
nahrazen
var source = new EventSource("/get_serial")
Ve výsledku to dopadlo takto:

Tady jsem se rozhodl zastavit. Zdá se mi, že krásně navrhnout stránku by už mělo být docela jednoduché. Ale nejsem zběhlý v HTML ani CSS, tak ať to udělá někdo jiný. Svůj úkol jsem viděl v tom, abych ukázal, že vytvořit webovou službu, která odesílá data z COM portu, zdá se, není vůbec těžké.

Ještě jednou opakuji: předložený kód není kompletní řešení, které lze „uvést do výroby“. Jedná se pouze o prototyp, který ukazuje zásadní přístup k řešení problému.

Na čem se dá ještě pracovat:

  • za prvé, čtení dat z COM portu v python skriptu probíhá velmi „nemotorně“ – ve skutečnosti dochází k neustálému dotazování „je něco čerstvého?“. Tento přístup samozřejmě zatěžuje procesor a jedno jádro na mém počítači mám 100% vytížené.
    Jako řešení lze použít blokovací čtení s časovým limitem. K tomu stačí zadat nenulovou hodnotu (v sekundách) jako časový limit při otevření COM portu, například:
    ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, časový limit=0,03)
    V popisu modulu pySerial jsou navíc tři příklady vytvoření mostu: "TCP/IP - sériový most", "Jednoportový TCP/IP - sériový most (RFC 2217)" a "Multiport TCP /IP - sériový most (RFC 2217)" - můžete vidět, jak takové problémy řeší profesionálové.
  • za druhé, pouze jeden klient může přijímat data. Dokud se stránka nezavře na prvním klientovi, nemůžete se připojit k tomuto serveru a získat hodnoty na druhém počítači. Na jedné straně je to pravděpodobně správně: existuje pouze jeden port COM a existuje několik spotřebitelů - který z nich by měl poskytnout čtecí řádek? Pokud si myslíte, že odpověď na tuto otázku by měla být „všichni“, pak zde jsou mé myšlenky na tuto věc. Zdá se mi, že problém nelze vyřešit pouze použitím "poctivého" vícevláknového webového serveru (například nějaké Tornado nebo Flask), který dokáže obsluhovat požadavky více webových klientů současně. Protože nemůžete otevřít COM port z každého vlákna a číst z něj - v tomto případě data z COM portu půjdou pouze do jednoho vlákna / procesu. Proto je podle mého názoru nutné serverovou část rozdělit na dvě části:
    • zmq server, který pracuje s COM portem, čte z něj řádky a posílá je přes PUB socket všem zainteresovaným spotřebitelům
    • Webový server python se místo připojení k portu COM připojí k serveru zmq a přijímá z něj data
    Pokud neznáte knihovnu ZMQ (ZeroMQ), můžete místo ní použít běžné TCP / IP nebo UDP sokety, ale důrazně doporučuji seznámit se se ZMQ, protože tato knihovna velmi usnadňuje řešení takových problémů. Zdá se mi, že pomocí ZMQ se řešení vejde maximálně do 20 řádků. (Neodolám psaní: i když neplánujete řešit popsanou úlohu, ale vaše práce souvisí s vícevláknovým / víceprocesovým programováním s výměnou dat mezi vlákny / procesy, podívejte se blíže na tuto knihovnu - možná je to to, o čem jste tak dlouho snili)
  • datový tok je stále jednosměrný – z COM portu do webového prohlížeče. Zatím nemůžete odesílat data z prohlížeče do Arduina. Zdá se mi, že tento úkol také není příliš obtížný a na rozdíl od předchozího lze jej vyřešit pouze
    • pomocí vícevláknového serveru
    • upřesnění metody Handler.do_GET tak, aby přijímala požadavky GET s parametry a posílala hodnoty některých z nich na COM port
    Podle mého názoru, pokud chcete napsat plnohodnotnou analogii webového monitoru sériového portu zabudovaného do Arduino IDE, není to tak obtížné. Osobně za sebe vidím obtíž pouze ve vytvoření normálního frontendu.
  • přes prohlížeč zatím není možné nastavit název COM portu a parametry jeho provozu. Na jednu stranu to vypadá logicky: jak může uživatel na druhé straně naší planety vědět, ke kterému COM portu a jakou rychlostí je arduino připojeno? Ale webový server Python běžící na stejném počítači ví jistě. Pokud je ale stále žádoucí dát uživateli možnost změnit název COM portu nebo parametry jeho provozu, pak to lze opět snadno vyřešit upřesněním metody Handler.do_GET
  • python je nutný ke spuštění serveru. To obecně není obtížné, ale pokud to z nějakého důvodu nelze udělat nebo nechcete, pak může pyInstaller přijít na pomoc. S ním lze skript Python zkompilovat do jednoho spustitelného souboru (v případě Windows - v .exe), který lze snadno zkopírovat do počítače, ke kterému je arduino připojeno.
    Asi nejlepším řešením by v tomto případě bylo použít jazyk Go. Pokud vím, lépe řeší problém vytvoření souboru pro "distribuci".
Na závěr: může vyvstat otázka: „Není jednodušší vyřešit tento problém pomocí nějakého hotového cloudu?“. Proč nepublikovat data čitelná z COM portu v cloudu a na klientech jednoduše přistupovat k odpovídající službě v cloudu? Pravděpodobně má takové řešení také právo na existenci, ale před použitím takového řešení je třeba odpovědět na následující otázky:
  • Existují hotové webové služby, které mi umožňují publikovat data rychlostí / frekvencí, kterou potřebuji? Jsou mezi nimi bezplatné nebo jste připraveni zaplatit odpovídající peníze?
  • jste připraveni na to, že v případě pádu cloudu nebo připojení k němu zůstanete bez dat
  • Netrápí vás, že pro přenos dat z jedné místnosti do druhé přejedou dvakrát oceán nebo půl kontinentu?

Tak jsme se dostali k COM portu. S ním ale není vše tak jednoduché jako u LPT a jeho plné využití bude vyžadovat mnohem více úsilí. Hlavním zádrhelem je jeho hlavní výhoda – přenos dat v sériové podobě. Pokud se v LPT přenáší datový bajt přes 8 linek, každý bit, a stav každé linky lze snadno zobrazit, pak v COM portu jsou datové bajty přenášeny bit po bitu po jedné lince (samozřejmě vzhledem k zemi ) a uvidíte, co je přenášeno z LED samotných nebude fungovat. K tomu potřebujete speciální zařízení – převodník sériového datového toku na paralelní, tzv. USART (Universal Synchronous/Asynchronous Receiver Transmitter). Například je součástí základní desky počítače vybaveného portem COM v jakémkoli serióznějším mikrokontroléru.


Doufám, že vás stále odradí zvládnutí COM portu. Všechno není tak ponuré. Některé výsledky lze získat bez USART. Pojďme formulovat úlohu, kterou implementujeme v počáteční fázi práce s COM portem:


"Chci, aby byla k počítači připojena LED přes COM port. Spustím program. Provedu v tomto programu nějakou akci, LED se rozsvítí, udělám něco jiného - LED zhasne."


Úloha je poměrně specifická (vzhledem k tomu, že se nepoužívá USART) a je čistě "self-made", ale je vcelku proveditelná a proveditelná. Začněme to implementovat.


1.COM port

Opět vezmeme systémovou jednotku vašeho PC a podíváme se na zadní stranu. Zaznamenáváme zde 9pinový konektor - to je COM port. Ve skutečnosti jich může být několik (až 4). Můj počítač má dva COM porty (viz foto).


2. Rozšíření COM portu


3. Hardware

Budeme si muset „pohrát“ i s hardwarovou částí v tom smyslu, že to bude náročnější než u prvního zařízení pro LPT port. Faktem je, že protokol RS-232, přes který dochází k výměně dat v COM portu, má trochu jiný poměr logický stav - napětí. Pokud je to obvykle logická 0 0 V, logická 1 +5 V, pak v RS-232 je tento poměr následující: logická 0 +12 V, logická 1 -12 V.

A například po přijetí -12 V není okamžitě jasné, co dělat s tímto napětím. Obvykle jsou úrovně RS-232 převedeny na TTL (0,5 V). Nejjednodušší možností jsou zenerovy diody. Navrhuji však vyrobit tento převodník na speciálním mikroobvodu. Jmenuje se MAX232.

Nyní se podívejme, jaké signály z COM portu můžeme vidět na LED? Ve skutečnosti je v COM portu až 6 nezávislých linek, které jsou zajímavé pro vývojáře zařízení rozhraní. Dvě z nich nám zatím nejsou dostupné – sériové datové linky. Ale zbývající 4 jsou určeny k řízení a indikaci procesu přenosu dat a my je budeme moci „přenést“ tak, aby vyhovovaly našim potřebám. Dva z nich jsou určeny pro ovládání externím zařízením a prozatím se jich nedotkneme, ale použijeme nyní poslední dva zbývající řádky. Jmenují se:

  • RTS- Žádost o převod. Interakční čára, která označuje, že počítač je připraven přijímat data.
  • DTR- Počítač je připraven. Interakční čára, která označuje, že počítač je zapnutý a připravený ke komunikaci.

Nyní trochu pomineme jejich účel a k nim připojené LED diody buď zhasnou, nebo se rozsvítí, v závislosti na akcích v našem vlastním programu.

Pojďme tedy sestavit schéma, které nám umožní provádět plánované akce.

A zde je jeho praktická realizace. Myslím, že mi odpustíte, že jsem to udělal v takové pitomé verzi, protože nechci dělat desku pro tak "vysoce produktivní" obvod.


4. Softwarová část

Tady je všechno rychlejší. Vytvořme Windows aplikaci v Microsoft Visual C++ 6.0 založenou na MFC pro správu dvou komunikačních linek COM portu. Chcete-li to provést, vytvořte nový projekt MFC a pojmenujte jej, např. TestCOM. Dále zvolíme možnost stavět na základě dialogu.

Dejte vzhled dialogového okna našeho programu, jako na obr. níže, konkrétně přidejte čtyři tlačítka, dvě pro každý z řádků. Jeden z nich je nutný pro "splacení" linky, druhý pro "nastavení" na jedničku.

Třída CTestCOMDlg: public CDialog ( // Konstrukce public: CTestCOMDlg(CWnd* pParent = NULL); // standardní konstruktor HANDLE hFile;

Aby náš program mohl spravovat linky COM portu, musí být nejprve otevřen. Pojďme napsat kód zodpovědný za otevření portu při načtení programu.

HFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) ( MessageBox("Nepodařilo se otevřít port!", "Chyba", MB_ICONERROR); ) else ( MessageBox("Port úspěšně otevřen", "Ok", MB_OK); )

Pomocí standardní funkce Win API CreateFile() otevřete COM port COM2. Dále zkontrolujeme úspěšnost otevření výstupem informační zprávy. Zde je nutné učinit důležitou poznámku: COM2 je v mém počítači a na vašem počítači jej můžete připojit k jinému COM portu. Podle toho je třeba změnit jeho název na port, který používáte. Chcete-li zjistit, která čísla portů jsou na vašem počítači, můžete to udělat takto: Start -> Nastavení -> Ovládací panely -> Systém -> Hardware -> Správce zařízení -> Porty (COM a LPT).

Konečně funkce CTestCOMDlg::OnInitDialog() umístěný v souboru TestCOMDlg.cpp, naše třída dialogů by měla mít tvar:

BOOL CTestCOMDlg::OnInitDialog() ( CDialog::OnInitDialog(); // Přidat položku nabídky „O...“ do systémové nabídky. // IDM_ABOUTBOX musí být v rozsahu systémových příkazů. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); ) ) // Nastavení ikony pro tento dialog. Framework to dělá automaticky // když hlavní okno aplikace není dialog SetIcon(m_hIcon, TRUE); // Nastavit velkou ikonu SetIcon(m_hIcon, FALSE); // Nastavit malou ikonu // TODO: Zde přidejte další inicializaci hFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) ( MessageBox("Nepodařilo se otevřít port!", "Chyba", MB_ICONERROR); ) else ( MessageBox("Port úspěšně otevřen", "Ok", MB_OK); ) return TRUE; // vrátí TRUE, pokud nenastavíte fokus na ovládací prvek )

Nyní přidáme obslužné prvky tlačítka ovládání řádku. Dal jsem jim příslušná jména: funkce, která nastaví řádek DTR na 1, je OnDTR1(), 0 je OnDTR0(). Pro linku RTS, respektive podobným způsobem. Dovolte mi připomenout, že handler se vytvoří, když dvakrát kliknete na tlačítko. V důsledku toho by tyto čtyři funkce měly mít podobu:

Void CTestCOMDlg::OnDTR1() ( // TODO: Sem přidejte svůj kód obslužného rutiny ovládacích oznámení EscapeCommFunction(hFile, 6); ) void CTestCOMDlg::OnDTR0() ( // TODO: Sem přidejte kód manipulačního programu ovládacího oznámení EscapeCommFunction(hFile, 5); ) void CTestCOMDlg::OnRTS1() ( // TODO: Sem přidejte kód obslužného rutiny kontrolních upozornění EscapeCommFunction(hFile, 4); ) void CTestCOMDlg::OnRTS0() ( // TODO: Sem přidejte svůj kód obsluhy kontrolních upozornění EscapeCommFunction(hFile, 3); )

Dovolte mi trochu vysvětlit, jak fungují. Jak vidíte, uvnitř obsahují volání stejné funkce Win API EscapeCommFunction() se dvěma možnostmi. Prvním z nich je klika (HANDLE) do otevřeného portu, druhým je speciální akční kód odpovídající požadovanému stavu linky.

Vše, zkompilovat, spustit. Pokud je vše v pořádku, měla by se zobrazit zpráva o úspěšném otevření portu. Dále stisknutím příslušných tlačítek rozblikáme LED diody připojené k portu COM.

© Ivanov Dmitrij
prosince 2006