
Inicializace USB v C#
Zdravím,
před několika týdny jsem začal programovat pod Windowsem v NET Frameworku. Použitý jazyk je C# - mám poměrně dobrý znalosti klasického Cčka z mikrokontrolérů. Pro programování ve Windows používám IDE studio SharpDevelop, který je téměř identické s Microsoft Visual Studiem, ale je zdarma.
Můj problém tkví v použití a komunikaci se zařízením pomocí USB, kde nechápu jak zařízení v PC nají a jak s ním navázat spojení. Mé zařízení je ve třídě HID (nepotřebuji další ovladače). Na internetu jsem o tom nenašel moc informací, tak se chci zeptat tady, jestli někdo nedělá něco podobného a nepodělil se o své zkušenosti.
Děkuji za jakoukoliv reakci.
Aplikacia moze komunikovat len s ovladacom, ne so zariadenim. Ked chces komunikovat priamo so zariadenim, musis si napisat ovladac.
Ked ma zariadenie standardnu fcionalitu a teda aj standardny ovladac, napr. klavesnica, tak sa o vsetko stara Win, a aplikaciam dava len spravy o stlacenych klavesach, pricom je uplne jedno ci ta klavesnica je na USB alebo na mimozemskom interface, to je starost ovladaca.
Ak ovladac vytvara nejake standardne zariadenie, napr. UART, tak normalne otvoris UART pomocou CreateFile, zasa ta nezaujima ci ten UART je na PCI alebo USB alebo mimozemskom interface, to je problem ovladaca. Na strane aplikacie ten ovladac vytvoril standardne UART device.
Ak mas nejaky speci ovladac ktory nema standardnu fcionalitu, tak je treba najst si popis k danemu ovladacu a komunikovat s nim pomocou DeviceIoControl fcie a spravnych IOCTL_ kodov (ich definicia zavisi od ovladaca).
Právě že to chci udělat ve třídě HID, kde ovladač netřeba, protože napsat si vlastní ovladač, na to si opravdu netroufnu (zatím). Mě jde spíš o to, jak si v softu nalézt připojené USB zařízení a začít do něj odesílat data nebo je od něj přijímat. Nebude se jednat o závratný velikosti dat (na to ani není HID třída specifikovaná), komunikace bude jen s několika málo bity.
Najjednoduchsie je urobit to USB zariadenie tak, aby sa hlasilo trebars ako com port, musi v nom byt patricny firmware samozrejme s ktorym potom komunikujes. (normalne otvoris com port a posielas/citas data/commandy pre ten firmware)
To s tebou souhlasím, že je nejjednodušší, problém je v tom, že bych musel mít v zařízení převodník na COM (např. FT232), ale to já nechci. Chci zkusit něco jiného a to, že si do Atmelu softwarově naimplementuji USB.
Na tento způsob : http://www.hw.cz/navrh-obvodu/software/softwarova- implementace-usb-pro-mikrokontrolery-avr.html
Hlavne, že sem dáš odkaz (ktorý si zrejme ani sám nečítal)...
Odkazy a download -> Automator
Ten článek jsem samozřejmě četl. Automator jsem si stáhl také, pro inspiraci dobrý - je psaný v C++. Problém bych viděl spíš v hledání USB zařízení podle VID a PID, protože pokud budu mít k počítači ppřipojené dvě zařízení se stejným VID a PID, tak mi to jednoduše nerozpozná. Hledání podle VID a PID ano, ale hledat ještě podle nějakého dalšího parametru, třeba podle jména.
To si potom musis zistit komunikaciu so zariadenim. Ovladac pozna len VID a PID resp len to co ti tam tie WinAPI funkcie vratia. Mozes si tie fcie zadat do google a na MSDN je popis.
Ze je to v C alebo v C# je uplne jedno, budes liezt na WinAPI fcie.
Teď mě ještě napadl možný způsob jak to hledat. Nejdříve to najít podle VID a PID a následně se zařízením zakomunikovat, poslat do něj nějaký bit a čekat co se vrátí a podle toho zařízení přiřadit.
Ak to su uplne stejne zariadenia tak programy zvycajne maju v nastaveniach alebo rovno v dialogu vyber ze s ktorym sa ma pracovat (priklad program co daco robi s diskom - vyberes si najprv v programe ze ktory disk zo zdetekovanych).
Ak su to odlisne zariadenia (odlisna fcia) tak je lepsie dat im odlisne PID. Pripadne este za tym mozno je nejake subdevice ID ale neviem zhlavy co tam ma HID device jake moznosti.
To s tym C# a WinAPI som asi tresol blbost, z C# asi nemozes volat rovno WinAPI, nepouzivaj C# hovadinu ale rob to v C++
Samozrejme, že zo C# ide volať WinAPI, viď DllImportAttribute Class.