• Analyzujte aktivitu sériového portu

    Serial Port Monitor sa môže pripojiť k portu COM, aj keď je už otvorený nejakou aplikáciou, a okamžite ho začať monitorovať. Všetky dáta prechádzajúce cez monitorovaný COM port sa zobrazia v našom monitorovacom programe. Keďže sa všetko zaznamenáva v reálnom čase, budete môcť okamžite odhaliť problémy. Na porovnanie údajov existuje funkcia synchronizovaného výberu rovnakých IRP v rôznych zobrazeniach.

    Okrem toho môžete všetky monitorovacie údaje presmerovať do určeného súboru alebo skopírovať všetky zaznamenané údaje do schránky. Monitor sériového portu vám dáva možnosť zachytiť a zaznamenať všetky riadiace kódy vstupu/výstupu sériového portu (IOCTL), monitorovať všetky ich údaje a parametre. Môžete uložiť akúkoľvek reláciu monitorovania a v prípade potreby ju načítať nabudúce.

  • Monitorujte viacero portov v rámci jednej relácie

    Monitor sériového portu má unikát funkčnosť monitorovanie viacerých COM portov súčasne. Teraz môžete zbierať údaje o tom, ako aplikácie interagujú s dvoma alebo viacerými portami a paralelne s viacerými zariadeniami v rámci tej istej relácie. Prijaté a odoslané monitorovacie údaje budú prezentované (zaznamenané) v samostatnom protokole v poradí, v akom boli prijaté, čo značne zjednodušuje analýzu.

  • Rôzne možnosti zobrazenia prijatých údajov

    Údaje monitorovania si môžete prezerať v 4 režimoch naraz: tabuľka, riadok, výpis alebo terminál, pričom každý z nich ponúka iný spôsob prezentácie zaznamenaných sériových údajov. Serial Port Monitor vám umožňuje vybrať monitorovacie filtre, čím vám ušetrí čas a umožní vám sledovať iba udalosti, ktoré vás zaujímajú. V nastaveniach si môžete vybrať údaje na zobrazenie: binárne, ASCII, nakonfigurovať port. Akékoľvek nastavenia zobrazenia možno použiť priamo v aktuálnom procese monitorovania.

  • Emulovať prenos dát do sériového zariadenia

    Údaje môžete posielať na rôznych formátov(reťazcové, binárne, osmičkové, desiatkové, hexadecimálne, zmiešané) na monitorovaný sériový port, ako keby boli odoslané priamo riadenou aplikáciou pomocou funkcie Serial Port Monitor Terminal Mode. Týmto spôsobom môžete sledovať odozvu riadeného sériového zariadenia na niektoré špeciálne príkazy a dáta.

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

    Pomocou nových filtrov Serial Port Monitor budete môcť dešifrovať a analyzovať údaje Modbus. Program pomôže nielen nadviazať spojenie medzi zariadeniami RS485/422/232, ale aj vykonávať efektívnu analýzu odovzdávaných dát.

  • Prehrajte a porovnajte monitorovacie relácie

    Monitor sériového portu poskytuje jedinečnú schopnosť prehrať reláciu z aplikácie na port najlepšia analýza prebiehajúce procesy. Budete môcť sledovať reakciu sériového portu na prechod rovnakých údajov, čím sa zvýši efektivita monitorovania. Máte tiež možnosť porovnať viaceré monitorovacie relácie a automaticky sledovať rozdiel medzi nimi.

Dnes počítačové vírusy doslova zaplavili svet a voľne sa pohybujú po internete, takže keď sa povie porty, väčšina používateľov si často predstaví logické porty, ktoré sa v sieťových technológiách ako TCP/IP či UDP používajú na organizáciu komunikačných kanálov a zabúdajú na fyzické porty. na pripojenie externých zariadení. Aj na pripojenie tlačiarní sa však čoraz častejšie používajú myši a klávesnice vysokorýchlostné USB porty a čoraz menej často - staré dobré COM a LPT (sériové a paralelné porty). Posledné menované sú však dostupné aj v najmodernejších počítačoch a možno nastal čas použiť ich na iný účel (povedzme na ovládanie jedného alebo druhého špecializovaného zariadenia).

Na sledovanie výmeny medzi počítačom a nejakým zariadením sú potrebné programy na analýzu portov.

V predaji sú samozrejme aj špeciálne zariadenia (sondy) na monitorovanie analógových a digitálnych signálov (vrátane analyzátorov USB, LPT a COM), ale ako každý profesionálne vybavenie sú dosť drahé.

Riadenie sériového portu počítača (COM)

Jeden z programov na analýzu sériového portu napísal Valery Kovtun (http://valery-us4leh.narod.ru/). Ďakujeme za skvelý nástroj!

Program sa nazýva Com Port Visual Control (http://valery-us4leh.narod.ru/ComVC.html), je distribuovaný bezplatne a je určený na vizuálnu kontrolu, dokumentovanie výmeny dát a štúdium procesov vyskytujúcich sa v UART transceiveri. počas prevádzky aplikácií využívajúcich COM port osobný počítač. Tento program funguje v Prostredie Windows 9x/Me/NT/2000/XP a vykonáva nepretržité prezeranie (monitorovanie) všetkých registrov čipu UART. Radič má formát 8x8 (osem registrov po osem bitov) a pre každý register samostatne zobrazuje: aktuálny stav (súčasne v desiatkovom a hexadecimálnom formáte), ako aj logický stav. Okrem toho môže program zapisovať hodnoty do registrov (aj v desiatkovom aj hexadecimálnom formáte) a podľa toho spravovať logický stav. Okrem toho sleduje zmeny v registroch a vedie protokol (LOG) podľa príkazov transceivera čipu UART a vedie aj protokol prijatých a prenášaných dát na úrovni strojových kódov. Po práci program prezerá a ukladá LOG-súbory a môže v nich vyhľadávať potrebné informácie.

Com Port Visual Control má vstavaný transceiver pre štandardné nastavenie režimy portov: dátové bity, stop bity, rýchlosť, parita, kontrola chýb, schopnosť prijímať a prenášať textové dáta a príkazy modemu, ako aj indikátor na monitorovanie aktívneho stavu príkazov UART (podporovaných je 17 základných príkazov). Okrem toho sa monitorujú porty počítača so súčasným zobrazením skupiny registrov a stavových bitov a udržiava sa protokol na zmenu údajov v základnom registri.

Medzi takéto programy patrí bezplatná pomôcka ComLite32 od Realtime Communications (RTCOMM, http://www.rtcomm.com/), napísaný pre Windows 95 a jeho prémiová platená verzia ComLab32 (http://www.rtcard.com/comlab32.html).

Tieto programy sú výkonné analyzátory komunikácie v reálnom čase, ktoré vám umožňujú preskúmať výmenu cez port COM a pochopiť, ako konkrétne zariadenie funguje, aj keď k nemu neexistuje žiadna dokumentácia. Program je pohodlný a intuitívny prehľadné rozhranie, ktorý uľahčuje monitorovanie výmeny, správu I/O portov a poskytovanie podrobnej online dokumentácie.

Programy ComLite32 a ComLab32 pracujú s portami RS-232, RS-422, RS-485 a RTX485 (pričom posledný port je len na čítanie) a umožňujú s týmito portami komunikovať v oboch smeroch. Požiadavky na systém Programy ComLite32 sú minimálne: iba 8 MB RAM, 6 MB miesto na disku a aspoň jedno zariadenie, ktoré pracuje so sériovým portom (vrátane modemov PCMCIA pre laptopy).

A nakoniec by som rád poznamenal programy Advanced Serial Port Monitor a Advanced Serial Data Logger od AGG Software (http://www.aggsoft.ru). Advanced Serial Data Logger spracováva dáta prijaté cez RS-232 a odosiela ich excelový súbor, Access alebo nejaká iná aplikácia Windows. Program poskytuje možnosť zbierať dáta z akéhokoľvek zariadenia v reálnom čase, ako aj prijímať a prenášať dáta cez rozhranie RS-232 alebo cez rozhranie RS-485, ak je k dispozícii hardvérový prevodník. Advanced Serial Data Logger zbiera dáta zo sériového portu, spracováva ich podľa potrieb užívateľa, extrahuje bloky dát zo všeobecného streamu a následne dáta prenáša do ľubovoľnej Windows alebo DOS aplikácie - stlačením príslušných kláves v aplikácii okno. Dáta sa prenášajú cez DDE (Dynamic Data Exchange), ODBC, OLE atď. Toto riešenie je možné použiť v automatizovaných systémoch zberu dát alebo v systémoch analýzy hovorov PBX.

Advanced Serial Data Logger môže tiež posielať požiadavky a príkazy cez sériový port na priame ovládanie zariadení cez ASCII (predvolené) alebo protokol MODBUS. Z programu Advanced Serial Data Logger sa tak stáva I/O server. Čo sa týka správy a nastavení, sú veľmi jednoduché a intuitívne. Dodatočné programovanie na zber údajov nie je potrebné.

Okrem toho môže Advanced Serial Data Logger fungovať ako služba pod Windows NT/2000/XP/2003, ktorá sa spustí pri štarte systému a zapíše dáta zo sériového portu do súboru na disku alebo na iné určené miesta ešte predtým, ako sa používateľ prihlási. do systému (a bude fungovať aj po skončení používateľskej relácie).

Program má schopnosť spúšťať viacero kópií na tom istom počítači, takže je možné prihlásiť viacero portov súčasne.

Pokiaľ ide o program Advanced Serial Port Monitor, môže byť užitočný pre začínajúcich používateľov aj profesionálov.

Advanced Serial Port Monitor možno použiť na monitorovanie prenosu údajov inými aplikáciami, ako aj na odosielanie a prijímanie údajov cez sériový port počítača (RS-232). Program poskytuje rôznymi spôsobmi ukladanie údajov do súboru alebo ich vizualizácia na obrazovke monitora.

Môžete tak pracovať s akýmikoľvek zariadeniami, ktoré pracujú cez rozhranie RS-232 alebo RS-485 (RS-422) s príslušným prevodníkom. Budete pozorovať výmenu údajov medzi ľubovoľnou aplikáciou Windows a externých zariadení pripojený k sériovému portu. Môže to byť buď meracie zariadenie, domáce rádio alebo iný počítač pripojený cez z-modem alebo kábel nulového modemu.

Advanced Serial Port Monitor podporuje plne duplexnú prevádzku, to znamená, že môžete monitorovať výmenu v oboch smeroch bez použitia iných programov a bez prerušenia iných aplikácií. Všetky informácie prechádzajúce cez sériový port sa zobrazujú na obrazovke v špeciálnom okne a je možné ich zapísať do súboru. Všetky zobrazené parametre je možné počas prevádzky meniť. Program zároveň podporuje dva režimy - automatický a manuálny, to znamená, že údaje môžete odoslať stlačením tlačidla "Odoslať" alebo sa budú odosielať automaticky v určitom intervale (od 10 do 10 000 ms).

Pomocou prídavných modulov môžete nielen prijímať dáta či odosielať príkazy, ale aj emulovať prácu niektorých konkrétne zariadenia, a v režime pozorovateľa (interceptor) - stačí sledovať výmenu dát medzi externým zariadením pripojeným k sériovému portu a niektorými Windows aplikácia. A nakoniec, Advanced Serial Port Monitor má svoj vlastný vstavaný skriptovací jazyk, pomocou ktorého môžete spúšťať program s prednastavenými možnosťami a akciami, ako aj spúšťať príkazy z modulov.

Riadenie paralelného portu počítača (LPT)

Valery Kovtun má ďalší užitočný komunikačný program - LPT 3D Hard Analyzer. Program je grafický analyzátor-osciloskop pamäte určený na zachytávanie digitálnych signálov a protokolov zariadení pripojených k paralelnému portu počítača vo Windows 95/98/Me/NT/2000/XP.

LPT 3D Hard Analyzer pracuje cez port LPT a umožňuje vám analyzovať päť vstupných liniek (kanálov) a 12 výstupných kanálov (t.j. digitálnych signálov z počítača) v režime SPP alebo manipulujte so štyrmi výstupmi a 14 vstupné parametre v režime EPP. Režim obojsmerného paralelného portu EPP je dostupný takmer na všetkých počítačoch vydaných po roku 1993. Niekedy však nie je štandardne povolená v systéme BIOS (toto je potrebné skontrolovať a ak je to možné, povoliť).

Pri práci v režime osciloskopu si program pamätá všetkých 17 grafov (čiar), hĺbka (zobrazená dĺžka grafu v čase) je obmedzená len voľnou pamäťou počítača (a s prihliadnutím na stránkovací súbor v OC Windows, bude to niekoľko stoviek megabajtov). K dispozícii je tiež možnosť automatického uloženia každého nová stránka v grafickom formáte.

Analyzátor-osciloskop LPT 3D Hard Analyzer zobrazuje zmeny údajov v dvojrozmernej a trojrozmernej forme a zobrazuje aj dva nezávislé diagramy: 17-kanálový osciloskop (bit na kanál) a graf portových registrov (vstup, výstup, ovládanie) . Dochádza k úprave rýchlosti analýzy a zobrazuje sa celkový počet cyklov za celé obdobie priebehu grafu. Môžete tiež naprogramovať počet cyklov s možnosťou kopírovania grafov do pamäte (hĺbka vykresľovania je obmedzená len dostupným RAM počítač). Program má nástroje na šetrenie systémových prostriedkov pri čítaní údajov z vysokorýchlostných zariadení pripojených k portu LPT a synchronizovaných s týmto programom (to znamená, že je možné ho použiť na relatívne slabých počítačoch). Keď vypnete režim grafického zobrazenia, grafika sa skopíruje iba do pamäte počítača – v dôsledku toho sa rýchlosť programu desaťnásobne zvýši. Na konci analýzy sa graf zobrazí rovnakým spôsobom, ako keby bol prepnutý do režimu grafického zobrazenia. Posúvanie grafov prebieha hladko a stránku po stránke ( kliknite pravým tlačidlom myši myši). Nechýba flexibilné nastavenie rýchlosti a kroku rolovania, ako aj možnosť automatickej kompresie celého grafu v rámci jednej stránky. Je možné uložiť snímky stavu vybranej stránky grafu formáty BMP a WMF (metasúbor Windows) alebo nastavte automatické ukladanie do samostatného súboru pre každú novú stránku. Na prezeranie má balík vstavaný prehliadač grafických súborov.

Modul riadenia portov je založený na základnom kóde iného programu od Valeryho Kovtuna - XP LPT, ktorý používa I/O ovládač LPT WDMIO.

Program XP LPT je určený na ovládanie paralelných portov počítača zo systému Windows 9x/2000/XP a má nasledujúce funkcie:

  • vykonáva automatickú registráciu ovládača v systéme Windows XP ako správca systému;
  • vedie automatická kontrola zavedené prístavy;
  • vykonáva simultánne čítanie dátových, riadiacich a stavových registrov zvoleného LPT portu;
  • zobrazuje obsah registrov súčasne v rôznych formátoch (desiatkový a hexadecimálny), čo eliminuje potrebu prepočtu.

Tento program má k dispozícii zdroj, popis, ako aj príklady tvorby programov na ovládanie externých zariadení cez paralelný port založený na tomto riešení.

Ako sme už spomenuli, program funguje prostredníctvom I/O ovládača LPT WDMIO a je určený špeciálne na školenie a ladenie programov vlastnej výroby na ovládanie externých zariadení cez paralelný port v prostredí Windows.

Valery Kovtun vytvoril aj program PortControl, ktorý slúži na ovládanie paralelného portu so 17-bitovým analyzátorom komunikačného protokolu pre zariadenia využívajúce LPT port počítača. Program je napísaný pre rodinu operačných systémov Windows a má nasledujúce funkcie:

  • existujú tri nezávislé kanály, ktoré možno použiť na zadanie adresy portu (registráciu), automatické čítanie údajov z portu, zápis údajov na port v desiatkovom a hexadecimálnom formáte a zobrazenie údajov vo formátoch bite, word a Dword;
  • zobrazuje sa stav každého zo 17 bitov LPT portu a výstupné bity sú riadené;
  • k dispozícii deväť programovateľných portov/dátových pamäťových bánk;
  • 17-kanálový analyzátor-osciloskop logického stavu každého bitu pracuje s možnosťou nastavenia rýchlosti analýzy (v čase), synchronizácia ktorýmkoľvek zo 17 bitov - podľa vysoký stupeň(1) a nízka (0), ako aj počítadlo prenesených údajov pre každý bit a mnoho ďalších funkcií pre jednoduchú kontrolu a ladenie digitálnych zariadení pripojený k počítaču.

Tento program je možné použiť ako digitálny viackanálový osciloskop, tak aj na ovládanie externých zariadení cez počítač.

Programy na analýzu a správu portov môžu mať rôzne aplikácie. Po prvé, dá sa na ne zvyknúť podrobná kontrola a testovanie výkonu paralelného portu počítača, napríklad na kontrolu výkonu LPT portu a systému ako celku pomocou režimu Test out. Navyše je pohodlné sledovať všetky operácie v čase pomocou vstavaného 17-kanálového analyzátora-osciloskopu s možnosťou flexibilného nastavenia pre určitý typ merania.

Na analýzu vysokorýchlostných digitálnych zberníc na prenos dát pripojených k počítaču rôznych rádioelektronických zariadení a mikroobvodov sa odporúča počítač s frekvenciou procesora najmenej 300 MHz. Ale pre nízkorýchlostné zariadenia viac ako slabé počítače pod Ovládanie Windows 95.

Po druhé, programy analyzátora možno použiť na riadenie, analýzu, konfiguráciu, vývoj, testovanie a opravu digitálnych rádiových elektronických obvodov ( jednotlivé moduly, bloky, riadiace zbernice, riadiace protokoly frekvenčných syntetizátorov, riadiace prvky digitálne indikátory, programátory ROM atď.), teda tam, kde sa bežne používajú digitálnych mikroobvodov, ktoré tvoria riadiace signály a nejako na ne reagujú.

Po tretie, programy na analyzovanie portov možno jednoducho použiť na čítanie výmenných protokolov. A synchronizáciou dátovej zbernice a riadiacich signálov zariadení na ukladanie informácií a identifikačných zariadení môžete dokonca čítať servisné signály a/alebo prístupové heslá zakódované v sekvenciách núl a jednotiek. Vo všeobecnosti sú tieto programy navrhnuté tak, aby umožnili rádioamatérom, elektronickým inžinierom alebo dizajnérom. Vizuálna štúdia prevádzkových protokolov rádiových elektronických zariadení môže byť užitočná aj pri vývoji vašich vlastných softvér ovládané rôznymi ovládačmi.

Po štvrté, analyzátorové programy budú veľmi užitočné pri opravách kancelárskych zariadení, ktoré nejakým spôsobom využívajú paralelný port počítača - rôzne tlačiarne, skenery, pokladne a ďalšie zariadenia.

Po piate, uvedené programy budú užitočné pre začínajúcich programátorov. Napríklad, ak sa rozhodnete písať malý program na ovládanie určitých externých zariadení cez paralelný port bude pre vás veľmi pohodlné vizuálne sledovať algoritmus vášho programu v multifunkčnom rozhraní PortControl. Vďaka tomu budete môcť včas odhaliť a odstrániť vzniknuté chyby bez použitia meracie prístroje na výstupe portu a bez zásahu do obvodov ovládaného zariadenia.

A nakoniec, pre paralelný prístav, navrhuje Valery Kovtun užitočný program PinRegistrator, určený na monitorovanie a registráciu logického stavu bitov portu LPT. Program bol napísaný pod Windows 95/98/Me a zaznamenáva stav paralelného portu automaticky alebo manuálne.

Ovládanie USB portu počítača

Spomínaná spoločnosť AGG Software má programy určené na analýzu a monitorovanie USB portov, zberníc, ovládačov a zariadení. Napríklad Advanced USB Monitor (http://www.aggsoft.ru/usb-monitor/index.htm) vám umožňuje zachytávať, analyzovať, prezerať a spracovávať USB prevádzku pre efektívne ladenie a testovanie USB zariadení. Podporované sú zariadenia, ktoré spĺňajú všetky špecifikácie: UHCI- (staré USB zariadenia 1.x zariadenia pracujúce rýchlosťou až 1,5 Mbps), OHCI- (zariadenia USB 1.x ďalšej generácie pracujúce rýchlosťou až 12 Mbps) a nakoniec zariadenia USB 2.0 EHCI (fungujúce rýchlosťou až 480 Mbps). Advanced USB Monitor vám umožňuje rozšíriť laboratórnu sadu nástrojov pre vývojárov USB zariadení aj pre pokročilých používateľov.

Advanced USB Monitor dokáže zobraziť prenášané dátové pakety čitateľným spôsobom, dekódovať deskriptory, zisťovať chyby paketov a merať výkon zariadenia. Počas zachytávania sa dátové pakety môžu zobrazovať v reálnom čase, čo vám umožňuje sledovať stav zariadení. Dátové pakety sa ukladajú v chronologickom poradí a obsahujú úplné informácie o adresách a koncových bodoch. Vďaka tomu je veľmi jednoduché identifikovať, filtrovať a vyhľadávať pakety. Program poskytuje niekoľko úrovní detailov pri zobrazovaní údajov. Rýchle dekódovanie USB prevádzky umožňuje pracovať aj s takým vysokorýchlostné zariadenia ako USB disky alebo USB fotoaparáty. Navyše, zachytávanie, monitorovanie a zaznamenávanie zachytených dát prebieha v reálnom čase. S Advanced USB Monitor môžete sledovať premávku tak, ako sa vyskytuje, a súčasne pre celý rad USB zariadení, pričom je súčasne otvorených viacero monitorovacích okien.

Používanie ovládača zachytávacieho jadra s podporou WDM, WMI, Power Management a PNP vám umožňuje dosiahnuť plnú kompatibilitu s operačný systém a USB zariadenia pre maximálny výkon.

Program vám tiež dáva možnosť merať výkon akéhokoľvek USB zariadenia. Pokročilý USB monitor ľahko prechádza topológiou USB zariadení a získava podrobné informácie technická informácia o zariadeniach, ako sú USB disky (rozhrania, koncové body, informácie z registra, informácie o triede a ďalšie). Na konci štúdie môžete získať hotovú správu o pripojených zariadeniach a prevádzke USB a na konci štúdie ju vytlačiť na tlačiarni. Okrem toho má program pokročilé funkcie na export údajov do PDF formáty, XML alebo Microsoft Word, čo umožňuje neobmedzovať proces následného spracovania údajov iba na tento jeden program.

USB osciloskopy (http://www.usb-osc.narod.ru/) pracujú na rovnakom princípe ako vyššie popísané analyzátory-osciloskopy pre paralelný port. USB osciloskop je primárne určený pre rádioamatérov, ktorí sa z povahy svojej práce stretávajú s potrebou analyzovať nízkofrekvenčné analógové signály, registrovať dlhodobo pomaly sa meniace procesy a tiež skúmať binárne signály z rôzne zariadenia. Okrem toho je možné USB osciloskop použiť ako jednoduchý dvojkanálový voltmeter pre napätie v rozsahu +/-20 V, frekvenčný čítač pre frekvencie signálu do 50 kHz alebo sondu so zvukovým upozornením.

Takže osciloskop USB poskytuje nasledujúce režimy prevádzky:

  • dvojkanálový osciloskop (meranie značiek, synchronizácia, meranie napätia a frekvencie signálu, filtrovanie atď.);
  • dvojkanálový spektrálny analyzátor (markerové merania, rôzne funkcie okien, filtrovanie atď.);
  • dvojkanálový záznamník (markerové merania, záznam signálu na niekoľko desiatok hodín a pod.);
  • 8/16-kanálový logický analyzátor (meranie značiek, synchronizácia, preskočenie daného počtu impulzov, hľadanie danej logickej kombinácie, dekódovanie rozhraní UART, SPI, I2C, 1-Wire atď.);
  • 8-kanálový logický generátor (nastavenie tabuľky signálov alebo priama konštrukcia časových diagramov pomocou myši atď.).

Okrem toho USB osciloskop umožňuje uložiť výsledky všetkých meraní vo forme vektorovej alebo rastrovej kresby pre neskorší import do iných programov alebo pre uloženie do súboru pre neskoršiu analýzu. Výsledky všetkých meraní je možné vytlačiť, skopírovať do schránky, ako aj nastaviť udalosti a sprevádzať ich zvukovým komentárom. Je možné vypočítať rôzne digitálne filtre a vykonať analógové filtrovanie a vyhladenie časovania osciloskopu. Zariadenie umožňuje zobraziť štatistiky pre všetky kanály logického analyzátora a generátora.

USB osciloskopy však už nie sú len programy, ale zariadenia vyrobené vo forme externých jednotiek s rozhraním USB a sprevádzané poskytovateľmi služieb. softvérové ​​moduly. Čiže ide o celý univerzálny merací komplex, pozostávajúci zo spínacieho nadstavca a počítača. Mimochodom, firmvér takéhoto zariadenia môžete aktualizovať cez USB zbernicu, ktorá vám umožní doplniť možnosti zariadenia o ľubovoľné vlastné funkcie.

Takéto zariadenia vyrába ukrajinská spoločnosť Da-Labs (http://www.da-labs.com/) a ruská spoločnosť"Trade-M" (http://motor-master.ru/index.htm/). Cena súpravy ruskej spoločnosti je 1850 rubľov. s výnimkou doručenia.

Takže, vyzbrojení potrebnými nástrojmi, máme teraz možnosť nezávisle písať riadiace programy pre rôzne externé zariadenia pomocou akýchkoľvek portov nášho počítača.

Sériové porty milujú vývojári pre ich jednoduchú údržbu a používanie.

A samozrejme, písanie do konzoly terminálového programu je všetko dobré, ale chcem svoju vlastnú aplikáciu, ktorá stlačením klávesu na obrazovke vykoná akcie, ktoré potrebujete;)

V tomto článku popíšem ako pracovať s com portom v jazyku C++.

Riešenie je jednoduché, ale z nejakého dôvodu sa pracovný príklad nenašiel okamžite. Pre sim to ukladám sem.

Samozrejme, môžete použiť multiplatformové riešenia ako QSerial – knižnicu v Qt, ja pravdepodobne budem, ale v budúcnosti. Teraz hovoríme o „čistom“ Windowse C++. Budeme písať vizuálne štúdio. Mám rok 2010, aj keď to nehrá žiadnu rolu ...

Vytvorte nový projekt konzoly Win32.

Zahrnúť hlavičkové súbory:

#include #include pomocou menného priestoru std;

Deklarujeme obslužný program com port:

RÚČKA hSériové;

Robím to globálne, takže sa nemusím starať o ukazovatele pri odovzdávaní funkcií.

int _tmain(int argc, _TCHAR* argv) (

Nemôžem vystáť Windows štýl programovania. Nazývali všetko svojim vlastným spôsobom a sedia a radujú sa ...

Teraz kúzlo deklarovania reťazca s názvom portu. Ide o to, že nie je schopný transformovať samotný char.

LPCTSTR sPortName = L"COM1";

Práca so sériovými portami vo Windows funguje ako so súborom. Otvorenie prvého com port pre zápis/čítanie:

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"; }

Teraz musíte nakonfigurovať parametre pripojenia:

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 sa odporúča najprv získať parametre a potom ich zmeniť. Stále sa učíme, takže robíme podľa požiadaviek.

Teraz deklarujme reťazec, ktorý prejdeme, a premenné potrebné na to:

Char data = "Ahoj z C++"; // reťazec na odovzdanie DWORD dwSize = sizeof(data); // veľkosť tohto reťazca DWORD dwBytesWritten; // tu bude počet skutočne prenesených bajtov

Odoslanie reťazca. Dovoľte mi pripomenúť, že príklad je najjednoduchší, takže nerobím žiadne špeciálne kontroly:

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

Rozhodol som sa tiež zobraziť veľkosť reťazca a počet bajtov odoslaných na kontrolu:

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

Na konci programu urobíme nekonečnú slučku čítania údajov:

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

Teraz funkcia čítania:

Void ReadCOM() ( DWORD iSize; char sReceivedChar; while (true) ( ​​​​ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0); // získať 1 bajt, ak (iSize > 0) // vytlačiť cout, ak sa niečo prijme<< sReceivedChar; } }

To je vlastne celý príklad.

O tom, ako krásne reprezentovať údaje odoslané Arduinom do Serial. Podľa môjho názoru chlapci ponúkli veľmi krásne riešenie, ktoré na jednej strane vyzerá celkom jednoducho a na druhej strane vám umožňuje dosiahnuť vynikajúci výsledok s minimálnym úsilím.

V komentároch k článku bolo poľutovaniahodné, že takéto riešenie nebude fungovať pod Firefoxom a zaznela myšlienka, že „na základe tejto veci sa stále dá napísať jednoduchý webový server s html výstupom“. Tento nápad ma „chytil“, rýchle vyhľadávanie na google nedalo hotové riešenie a rozhodol som sa nápad zrealizovať sám. A tu je to, čo z toho vyšlo.

POZOR! Navrhované riešenie by sa v žiadnom prípade nemalo považovať za úplné. Na rozdiel od Amperkovho sériového projektora ide o koncept, ukážku možného prístupu, funkčný prototyp a nič viac.

Pred časom som urobil projekt, v ktorom som použil vstavané akcelerometre v smartfóne s Androidom na ovládanie serv pripojených k Arduinu. Potom som na tieto účely použil projekty Scripting Layer pre Android (SL4A) a RemoteSensors. Ukazuje sa, že štandardná knižnica pythonu obsahuje balík BaseHTTPServer, pomocou ktorého je vytvorenie webovej služby v pythone úlohou v niekoľkých riadkoch kódu.

Pre Arduino neboli po ruke žiadne senzory, a tak som ako zdroj zobrazovaných informácií použil vnútorný teplomer zabudovaný v Arduino Uno. Pokiaľ som pochopil, nie je veľmi presný a vôbec nie je určený na meranie okolitej teploty, ale na prototypovanie postačí.

Po krátkom googlovaní je tu náčrt pre arduino:

// zdroj: https://code.google.com/p/tinkerit/wiki/SecretThermometer long readTemp() (dlhý výsledok; // Čítanie teplotného senzora oproti 1,1V referencii ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); delay(2); // Počkajte, kým Vref vyrovná ADCSRA |= _BV(ADSC); // Konvertujte zatiaľ (bit_is_set(ADCSRA,ADSC)); výsledok = ADCL; výsledok |= 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); }
Tento náčrt otvorí COM port, nastaví ho na 115200 baudov a potom doň každú sekundu zapíše aktuálnu hodnotu vstavaného teplomera. (Nepýtajte sa ma, v akých jednotkách je teplota udávaná - pre popísanú úlohu to nie je dôležité). Keďže sa hodnota nemení veľmi aktívne, pre lepšiu viditeľnosť zmien údajov je pred teplotou zobrazené číslo riadku.

Ak chcete skontrolovať, či webový server vydá iba celé riadky a nie ich časti, ako to číta z portu COM, riadok
Serial.println(s)
bol nahradený
for(int i=0; i< s.length(); i++){ Serial.print(s.charAt(i)); delay(200); } Serial.println("");
tie. vytvorený reťazec nie je vyvedený na sériový port celý, ale znak po znaku, s prestávkami 200 ms.

Na začiatok bol napísaný veľmi jednoduchý prototyp webového servera (nižšie je rozobraný na časti):
# -*- kódovanie: utf-8 -*- #-- na základe: 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) #-- riešenie na získanie IP adresy, na ktorú slúžiace importuje socket s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM) s.connect(("google.co.uk", 80)) sData = s.getsockname() print "Podávané 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ázať logovanie DNS vyhľadávaní 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() skúste: while True: new_serial_line = get_full_line_from_serial() ak new_serial_line nie je Žiadne: self.wfile.write(new_serial_line) self.wfile.write("\n") self.wfile.flush() okrem socket.error, e: print "Klient odpojený.\n" capture = "" def get_full_line_from_serial(): """ vracia celý riadok zo seriálu alebo None Používa globálne premenné "ser" a "captured" """ globálna zachytená časť = ser.readline() ak časť: zachytená += časť časti = zachytené.split("\n", 1); if len(časti) == 2: zachytené = časti vrátiť časti vrátiť Žiadne if __name__ == "__main__": main()
Poďme si scenár rozobrať kúsok po kúsku.

Keďže ide o prototyp, všetky hlavné parametre prevádzky (názov COM portu, jeho rýchlosť, ako aj číslo TCP portu, na ktorom bude webový server bežať) sú uvedené priamo v zdrojovom texte:
SERIAL_PORT_NAME="COM6" SERIAL_PORT_SPEED=115200 WEB_SERVER_PORT=8000
Samozrejme, môžete nastaviť čítanie týchto parametrov z príkazového riadku. Napríklad pomocou modulu argparse to ide veľmi rýchlo, jednoducho a flexibilne.

V tomto prípade musia používatelia Windows zistiť v správcovi zariadení názov COM portu, ku ktorému je Arduin pripojený. Pre mňa to bolo "COM6". Používatelia iných operačných systémov musia používať nástroje svojho OS. S MacOS nemam vobec ziadne skusenosti a s COM portami som na Linuxe tiez nepracoval, ale tam to bude s najvacsou pravdepodobnostou nieco ako "/dev/ttySn".

Ďalej nasleduje definícia globálnej premennej, ku ktorej bude viazaná inštancia triedy Serial, ktorá je v pythone zodpovedná za prácu s COM portom:
ser = Žiadne
V rade
httpd = BaseHTTPServer.HTTPServer(("", WEB_SERVER_PORT), Handler)
vytvorí sa webový server, ktorý bude načúvať požiadavkám na zadanom porte WEB_SERVER_PORT. A tieto požiadavky budú spracované inštanciou triedy Handler, ktorá je popísaná nižšie.

Nasledujúce riadky sú malým „hackom“ na zobrazenie IP adresy, na ktorej skutočne beží spustený webový server:
#-- náhradné riešenie na získanie adresy IP, z ktorej slúžiace importuje soket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("google.co.uk", 80)) sData = s.getsockname() print "Podávame na "%s:%s"" % (sData, WEB_SERVER_PORT)
Pokiaľ som pochopil, neexistuje iný spôsob, ako zistiť túto IP. A bez týchto znalostí, ako budeme pristupovať k nášmu serveru z prehliadača?

Preto musíte otvoriť zásuvku a pripojiť sa na stránku Google, aby ste z atribútov tejto zásuvky získali informácie o svojej vlastnej IP adrese.

O niečo nižšie sa otvorí port COM a skutočne sa spustí webový server:
ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, timeout=0) httpd.serve_forever()
Nasleduje popis triedy, ktorá je zodpovedná za spracovanie požiadaviek prijatých spusteným webovým serverom:
class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
Ide o dediča triedy zabudovanej do modulu BaseHTTPServer, v ktorom stačí prepísať iba metódu do_GET

Keďže ide stále o prototyp, server bude „spokojný“ s akoukoľvek požiadavkou – bez ohľadu na to, aká URL je od neho požadovaná, klientovi poskytne všetky dáta načítané z COM portu. Preto v Handler.do_GET okamžite odpovie kódom úspechu a potrebnými hlavičkami:
self.send_response(200) self.send_header("Typ obsahu", "application/x-javascript; charset=utf-8") self.end_headers()
po ktorej sa spustí nekonečná slučka, v ktorej sa vykoná pokus prečítať celý riadok z COM portu a ak bol tento pokus úspešný, preniesť ho do webového klienta:
pričom True: new_serial_line = get_full_line_from_serial() ak new_serial_line nie je Žiadne: self.wfile.write(new_serial_line) self.wfile.write("\n") self.wfile.flush()
V projekte, ktorý bol braný ako základ, bola táto nekonečná slučka „zabalená“ do pokusu ... okrem bloku, pomocou ktorého mala opatrne zvládnuť prerušenie spojenia. Možno v systéme Android (základný projekt bol preň vyvinutý) to funguje dobre, ale v systéme Windows XP mi to nefungovalo - keď sa spojenie prerušilo, vyskytla sa iná výnimka, ktorú som sa nikdy nenaučil zachytiť. Našťastie to však nebránilo tomu, aby webový server normálne fungoval a prijímal nasledujúce požiadavky.

Funkcia získania celého reťazca z COM portu funguje na rovnakom princípe ako tvorcovia sériového projektora:

  • existuje nejaká globálna vyrovnávacia pamäť, ktorá ukladá všetko, čo sa číta z portu COM
  • pri každom volaní funkcie sa pokúsi niečo prečítať z COM portu
  • ak sa jej to podarí, tak
    • pridá to, čo bolo práve načítané, do špecifikovanej globálnej vyrovnávacej pamäte
    • sa snaží rozdeliť globálnu vyrovnávaciu pamäť na maximálne dve časti znakom konca riadka
    • ak uspeje, vráti prvú časť volajúcej procedúre a druhú časť použije ako novú hodnotu globálnej vyrovnávacej pamäte
  • ak v porte COM nie sú žiadne nové údaje alebo sa nenájde znak konca riadka, funkcia vráti Žiadne:
capture = "" def get_full_line_from_serial(): """ vracia celý riadok zo seriálu alebo None Používa globálne premenné "ser" a "captured" """ globálna zachytená časť = ser.readline() ak časť: zachytená += časť časti = zachytené.split("\n", 1); if len(časti) == 2: zachytené = časti vrátiť časti vrátiť Žiadne
V dôsledku toho to dopadlo takto:

Je vidieť, že v prehliadači sa objavujú riadky, ktoré sa čítajú z COM portu. Webovému frontendu nerozumiem nič: JavaScript, Ajax, CSS a DOM sú pre mňa temný les. Zdá sa mi však, že programátorom tvoriacim webové rozhrania by to malo stačiť na to, aby tento výstup previedli na rovnaký krásny obraz, aký vytvára Sériový projektor Amperky. Úlohou je podľa mňa vytvoriť javascriptový skript, ktorý pristúpi na webový server, načíta z neho stream a posledný prečítaný riadok vypíše na správne miesto na stránke.

Pre každý prípad som sa rozhodol hrať na istotu a pokúsil som sa urobiť prvú aproximáciu sám. Nie príliš hlboké vyhľadávanie Google naznačilo, že v skutočnosti sa na takéto účely používali prinajmenšom WebSockets alebo Server-Sent Events. Našiel som to, čo sa mi zdalo ako dobré využitie serverových udalostí, a rozhodol som sa použiť túto technológiu.

Poznámka! Nezdá sa to byť najlepšie riešenie, pretože táto technológia nefungovala v Internet Exploreri 8, ani v prehliadači zabudovanom v Androide 2.3.5. Ale fungovalo to aspoň vo Firefoxe 39.0, takže som sa ďalej „nehrabal“.

Z pohľadu python skriptu sú zmeny v časti Server-Sent Events úplne menšie:

  • je potrebné nahradiť typ údajov poskytnutých klientovi:
    riadok
    self.send_header("Typ obsahu", "application/x-javascript; charset=utf-8")
    nahradené
    self.send_header("Typ obsahu", "text/stream-udalosti")
  • a tiež pred riadok načítaný z COM portu vložte predponu "data:" a pridajte ďalší znak nového riadku:
    linky
    self.wfile.write(new_serial_line) self.wfile.write("\n")
    nahradené
    self.wfile.write("data: " + nový_sériový_riadok) self.wfile.write("\n\n")

Všetko ostatné by pravdepodobne mohlo zostať nezmenené, ale...

Najprv som vytvoril súbor index.html s nasledujúcim obsahom:

hlavička


Najzaujímavejšia je v nej línia
ktorý tvorí miesto pre výstup ďalšieho riadku z COM portu a javascriptový skript

ktorý skutočne načíta stream z webového servera a odošle načítané informácie na zadané miesto.

Chcel som tento súbor otvoriť v prehliadači, napríklad z disku alebo z iného webového servera, ale nefungovalo to: pri otváraní stránky z disku skript JavaScript raz pristúpil na spustený webový server Python a okamžite sa odpojil. Nerozumel som, prečo sa to deje, a navrhol som, že to môže byť nejaký druh ochrany prehliadača pred rôznymi útokmi. Pravdepodobne sa mu nepáči, že samotná stránka je otvorená z jedného zdroja a skript číta údaje z iného zdroja.

Preto bolo rozhodnuté zmeniť webový server Python tak, aby obsluhoval aj túto html stránku. Potom by sa ukázalo, že stránka aj stream sa čítajú z rovnakého zdroja. Neviem, či sa môj predpoklad o bezpečnosti ukázal ako správny, alebo niečo iné, ale s touto implementáciou všetko fungovalo tak, ako malo.

Samozrejme, stačí zmeniť triedu obsluhy požiadaviek Handler:
class Handler(BaseHTTPServer.BaseHTTPRequestHandler): # Zakázať protokolovanie DNS vyhľadávaní def address_string(self): return str(self.client_address) def do_GET(self): if self.path == "/" alebo 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/stream-udalosti") self.end_headers() skúste: while True: new_serial_line = get_full_line_from_serial() ak new_serial_line nie je Žiadny: self.wfile.write("data: " + new_serial_line) self.wfile.write("\n\n") self.wfile.flush() okrem socket.error, e : print "Klient odpojený.\n" def process_unknown(self): self.send_response(404)
Táto možnosť predpokladá, že webový server odpovie iba na dve požiadavky: „/index.html“ (poskytne html kód stránky) a „/get_serial“ (poskytne nekonečný prúd reťazcov načítaných z portu COM). Všetky ostatné žiadosti budú zodpovedané kódom 404.

Keďže index.html je obsluhovaný webovým serverom Python, možno ho mierne upraviť zadaním relatívnej namiesto absolútnej adresy reťazcového prúdu z portu COM:
reťazec
var source = new EventSource("http://192.168.1.207:8000/")
nahradené
var source = new EventSource("/get_serial")
V dôsledku toho to dopadlo takto:

Tu som sa rozhodol zastaviť. Zdá sa mi, že krásne navrhnúť stránku by už malo byť celkom jednoduché. Ale ja nie som zbehlý v HTML ani CSS, tak nech to urobí niekto iný. Svoju úlohu som videl v tom, aby som ukázal, že vytvoriť webovú službu, ktorá odosiela dáta z COM portu, nie je, zdá sa, vôbec ťažké.

Opakujem ešte raz: predložený kód nie je úplným riešením, ktoré možno „uviesť do výroby“. Toto je len prototyp, ktorý ukazuje zásadný prístup k riešeniu problému.

Na čom sa dá ešte popracovať:

  • po prvé, čítanie údajov z COM portu v python skripte sa robí veľmi "nemotorne" - v skutočnosti neustále prebieha dopytovanie "je niečo čerstvé?". Tento prístup samozrejme zaťažuje procesor a jedno jadro na mojom počítači je obsadené na 100%.
    Ako riešenie možno použiť blokovacie čítanie s časovým limitom. Na to stačí zadať nenulovú hodnotu (v sekundách) ako časový limit pri otvorení portu COM, napríklad:
    ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, časový limit=0,03)
    Okrem toho sú v popise modulu pySerial tri príklady vytvorenia mosta: „TCP/IP – sériový most“, „Jednoportový TCP/IP – sériový most (RFC 2217)“ a „Multiportový TCP /IP - sériový most (RFC 2217)" - môžete vidieť, ako profesionáli riešia takéto problémy.
  • po druhé, iba jeden klient môže prijímať dáta. Kým sa stránka nezatvorí na prvom klientovi, nemôžete sa pripojiť k tomuto serveru a získať hodnoty na druhom počítači. Na jednej strane je to pravdepodobne správne: existuje iba jeden port COM a existuje niekoľko spotrebiteľov - ktorý z nich by mal dať riadok na čítanie? Ak si myslíte, že odpoveď na túto otázku by mala byť „každý“, tu sú moje myšlienky na túto vec. Zdá sa mi, že problém sa nedá vyriešiť iba použitím "poctivého" viacvláknového web servera (napríklad nejaké Tornado alebo Flask), ktorý dokáže obsluhovať požiadavky viacerých webových klientov súčasne. Pretože nemôžete otvoriť COM port z každého vlákna a čítať z neho - v tomto prípade dáta z COM portu pôjdu len do jedného vlákna/procesu. Preto je podľa môjho názoru potrebné rozdeliť serverovú časť na dve časti:
    • zmq server, ktorý pracuje s COM portom, číta z neho riadky a posiela ich cez PUB socket všetkým zainteresovaným spotrebiteľom
    • Webový server python sa namiesto pripojenia k portu COM pripája k serveru zmq a prijíma z neho údaje
    Ak nie ste oboznámení s knižnicou ZMQ (ZeroMQ), môžete namiesto toho použiť bežné TCP / IP alebo UDP sockety, ale dôrazne by som odporučil zoznámiť sa so ZMQ, pretože táto knižnica veľmi uľahčuje riešenie takýchto problémov. Zdá sa mi, že pomocou ZMQ sa riešenie zmestí maximálne do 20 riadkov. (Nedá mi nenapísať: aj keď neplánujete riešiť opísanú úlohu, ale vaša práca súvisí s viacvláknovým / viacprocesovým programovaním s výmenou dát medzi vláknami / procesmi, pozrite sa bližšie na túto knižnicu - možno je to to, o čom ste tak dlho snívali)
  • dátový tok je stále jednosmerný – z COM portu do webového prehliadača. Zatiaľ nemôžete odosielať údaje z prehliadača do Arduina. Zdá sa mi, že táto úloha tiež nie je veľmi náročná a na rozdiel od predchádzajúcej je možné ju vyriešiť iba
    • pomocou viacvláknového servera
    • spresnenie metódy Handler.do_GET tak, aby prijímala požiadavky GET s parametrami a odosielala hodnoty niektorých z nich na port COM
    Podľa môjho názoru, ak chcete napísať plnohodnotný analóg webového monitora sériového portu zabudovaného do Arduino IDE, nie je to také ťažké. Osobne za seba vidím problém len vo vytvorení normálneho frontendu.
  • cez prehliadač zatiaľ nie je možné nastaviť názov COM portu a parametre jeho fungovania. Na jednej strane sa to zdá logické: ako môže používateľ na druhej strane našej planéty vedieť, ku ktorému portu COM a akou rýchlosťou je arduino pripojené? Ale webový server Python bežiaci na tom istom počítači to vie určite. Ak je však stále žiaduce dať používateľovi možnosť zmeniť názov portu COM alebo parametre jeho prevádzky, opäť sa to dá ľahko vyriešiť vylepšením metódy Handler.do_GET
  • python je potrebný na spustenie servera. Vo všeobecnosti to nie je ťažké, ale ak to z nejakého dôvodu nemožno urobiť alebo nechcete, potom môže prísť na pomoc pyInstaller. Pomocou neho je možné skompilovať skript Python do jedného spustiteľného súboru (v prípade Windows - v .exe), ktorý je možné jednoducho skopírovať do počítača, ku ktorému je arduino pripojené.
    Možno najlepším riešením by bolo v tomto prípade použiť jazyk Go. Pokial viem, tak to lepsie riesi problem s vytvaranim suboru na "distribuciu".
Na záver: môže vyvstať otázka: „Nie je jednoduchšie vyriešiť tento problém pomocou nejakého hotového cloudu?“. Prečo nezverejniť dáta čitateľné z COM portu v cloude a na klientoch jednoducho pristupovať k príslušnej službe v cloude? Takéto riešenie má pravdepodobne tiež právo na existenciu, ale pred použitím takéhoto riešenia je potrebné zodpovedať nasledujúce otázky:
  • Existujú hotové webové služby, ktoré mi umožňujú zverejňovať údaje rýchlosťou/frekvenciou, ktorú potrebujem? Sú medzi nimi bezplatné alebo ste pripravení zaplatiť zodpovedajúce peniaze?
  • si pripravený na to, že v prípade pádu cloudu alebo pripojenia k nemu ostaneš bez dát
  • Neprekáža vám, že na prenos dát z jednej miestnosti do druhej prejdú dvakrát oceán alebo pol kontinentu?

Tak sme sa dostali k portu COM. Ale s ním nie je všetko také jednoduché ako pri LPT a jeho plné využitie si bude vyžadovať oveľa viac úsilia. Hlavným zádrhelom je jeho hlavná výhoda – prenos dát v sériovej podobe. Ak sa v LPT prenáša dátový bajt cez 8 riadkov, každý bit, a stav každého riadku je možné ľahko zobraziť, potom v COM porte sa dátové bajty prenášajú bit po bite pozdĺž jedného vedenia (samozrejme vo vzťahu k zemi ) a uvidíte, čo sa prenáša z LED samotných nebude fungovať. K tomu potrebujete špeciálne zariadenie – prevodník sériového dátového toku na paralelný, tzv. USART (Universal Synchronous/Asynchronous Receiver Transmitter). Napríklad je súčasťou základnej dosky počítača vybaveného portom COM v akomkoľvek vážnejšom mikrokontroléri.


Dúfam, že vás stále odrádza osvojenie si COM portu. Všetko nie je také pochmúrne. Niektoré výsledky je možné získať aj bez USART. Sformulujme úlohu, ktorú implementujeme v počiatočnej fáze práce s COM portom:


"Chcem, aby bola k počítaču pripojená LED cez COM port. Spustím program. V tomto programe urobím nejakú akciu, LED sa rozsvieti, urobím niečo iné - LED zhasne."


Úloha je dosť špecifická (vzhľadom na to, že sa nepoužíva USART) a je čisto „vlastná“, ale celkom realizovateľná a realizovateľná. Začnime to implementovať.


1.COM port

Opäť vezmeme systémovú jednotku vášho počítača a pozrieme sa na zadnú stranu. Všimli sme si 9-pinový konektor - toto je COM port. V skutočnosti ich môže byť niekoľko (až 4). Môj počítač má dva COM porty (viď foto).


2. Rozšírenie COM portu


3. Hardvér

Budeme sa musieť „pohrať“ aj s hardvérovou časťou v tom zmysle, že to bude náročnejšie ako pri prvom zariadení pre LPT port. Faktom je, že protokol RS-232, cez ktorý sa vymieňajú dáta v COM porte, má trochu iný pomer logického stavu - napätia. Ak je to zvyčajne logické 0 0 V, logické 1 + 5 V, potom v RS-232 je tento pomer nasledovný: logický 0 + 12 V, logický 1 -12 V.

A napríklad po prijatí -12 V nie je okamžite jasné, čo robiť s týmto napätím. Zvyčajne sa úrovne RS-232 konvertujú na TTL (0,5 V). Najjednoduchšou možnosťou sú zenerove diódy. Navrhujem však vytvoriť tento prevodník na špeciálnom mikroobvode. Volá sa MAX232.

Teraz sa pozrime, aké signály z COM portu môžeme vidieť na LED diódach? V skutočnosti je v porte COM až 6 nezávislých riadkov, ktoré sú zaujímavé pre vývojárov zariadení rozhrania. Dve z nich nám zatiaľ nie sú dostupné – sériové dátové linky. Ale zvyšné 4 sú určené na riadenie a indikáciu procesu prenosu dát a budeme si ich môcť „preniesť“ tak, aby vyhovovali našim potrebám. Dva z nich sú určené na ovládanie externým zariadením a zatiaľ sa ich nedotkneme, no využijeme teraz posledné dva zostávajúce riadky. Volajú sa:

  • RTS- Žiadosť o prevod. Interakčná čiara, ktorá označuje, že počítač je pripravený prijímať údaje.
  • DTR- Počítač je pripravený. Interakčná čiara, ktorá označuje, že počítač je zapnutý a pripravený komunikovať.

Teraz trochu pominieme ich účel a k nim pripojené LED diódy buď zhasnú alebo sa rozsvietia, v závislosti od akcií v našom vlastnom programe.

Poďme teda zostaviť schému, ktorá nám umožní vykonať plánované akcie.

A tu je jeho praktická realizácia. Myslím, že mi odpustíte, že som to vyrobil v takej hlúpej verzii, pretože nechcem robiť dosku pre taký "vysoko produktívny" okruh.


4. Softvérová časť

Všetko je tu rýchlejšie. Vytvorme Windows aplikáciu v Microsoft Visual C++ 6.0 založenú na MFC na správu dvoch komunikačných liniek COM portu. Ak to chcete urobiť, vytvorte nový projekt MFC a pomenujte ho, napr. TestCOM. Ďalej zvolíme možnosť budovania na základe dialógu.

Dajte vzhľad dialógového okna nášho programu, ako na obr. nižšie, konkrétne pridajte štyri tlačidlá, dve pre každý z riadkov. Jeden z nich je potrebný na „splatenie“ linky, druhý na „nastavenie“ na jednotku.

Trieda CTestCOMDlg: public CDialog ( // Verejná konštrukcia: CTestCOMDlg(CWnd* pParent = NULL); // štandardný konštruktor HANDLE hFile;

Aby náš program spravoval linky COM portu, musí byť najprv otvorený. Napíšme kód zodpovedný za otvorenie portu pri načítaní programu.

HFfile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) ( MessageBox("Nepodarilo sa otvoriť port!", "Chyba", MB_ICONERROR); ) else ( MessageBox("Port úspešne otvorený", "Ok", MB_OK); )

Pomocou štandardnej funkcie Win API CreateFile() otvorte COM port COM2. Ďalej skontrolujeme úspešnosť otvorenia výstupom informačnej správy. Tu je potrebné urobiť dôležitú poznámku: COM2 je v mojom počítači a na vašom počítači ho môžete pripojiť k inému portu COM. V súlade s tým musí byť jeho názov zmenený na port, ktorý používate. Ak chcete zistiť, ktoré čísla portov máte na svojom počítači, postupujte takto: Štart -> Nastavenia -> Ovládací panel -> Systém -> Hardvér -> Správca zariadení -> Porty (COM a LPT).

Nakoniec funkcia CTestCOMDlg::OnInitDialog() nachádza v súbore TestCOMDlg.cpp, naša trieda dialógov by mala mať tvar:

BOOL CTestCOMDlg::OnInitDialog() ( CDialog::OnInitDialog(); // Pridanie položky ponuky „About...“ do systémovej ponuky. // IDM_ABOUTBOX musí byť v rozsahu systémových príkazov. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); ) ) // Nastavenie ikony pre toto dialógové okno. Framework to robí automaticky // keď hlavné okno aplikácie nie je dialógové okno SetIcon(m_hIcon, TRUE); // Nastaviť veľkú ikonu SetIcon(m_hIcon, FALSE); // Nastaviť malú ikonu // TODO: Sem pridajte ďalšiu inicializáciu hFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0,NULL); if(hFile==INVALID_HANDLE_VALUE) ( MessageBox("Nepodarilo sa otvoriť port!", "Chyba", MB_ICONERROR); ) else ( MessageBox("Port úspešne otvorený", "Ok", MB_OK); ) návrat TRUE; // návrat TRUE, pokiaľ nenastavíte zameranie na ovládací prvok )

Teraz pridajme ovládače tlačidiel na ovládanie riadkov. Dal som im príslušné mená: funkcia, ktorá nastaví riadok DTR na 1, je OnDTR1(), 0 je OnDTR0(). Pre linku RTS, resp. Pripomínam, že handler sa vytvorí, keď dvakrát kliknete na tlačidlo. V dôsledku toho by tieto štyri funkcie mali mať podobu:

Void CTestCOMDlg::OnDTR1() ( // TODO: Sem pridajte kód obsluhy kontrolných upozornení EscapeCommFunction(hFile, 6); ) void CTestCOMDlg::OnDTR0() ( // TODO: Sem pridajte kód obsluhy kontrolných upozornení EscapeCommFunction(hFile, 5); ) void CTestCOMDlg::OnRTS1() ( // TODO: Sem pridajte kód obsluhy kontrolných upozornení EscapeCommFunction(hFile, 4); ) void CTestCOMDlg::OnRTS0() ( // TODO: Sem pridajte kód obsluhy kontrolných upozornení EscapeCommFunction(hFile, 3); )

Dovoľte mi trochu vysvetliť, ako fungujú. Ako vidíte, vo vnútri obsahujú volanie rovnakej funkcie Win API EscapeCommFunction() s dvomi možnosťami. Prvým z nich je rukoväť (HANDLE) do otvoreného portu, druhým je špeciálny akčný kód zodpovedajúci požadovanému stavu linky.

Všetko, skompilovať, spustiť. Ak je všetko v poriadku, mali by ste vidieť správu o úspešnom otvorení portu. Ďalej stlačením príslušných tlačidiel zablikáme LED diódy pripojené k portu COM.

© Ivanov Dmitrij
decembra 2006