Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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.

Předmět Autor Datum
identické s Microsoft Visual Studiem, ale je zdarma. • Protoze VS neni zadarmo? https://social.msd… nový
CoCoChanel 02.10.2015 15:10
CoCoChanel
Nebo je zdarma, nevím. To studio SharpDevelop jsem si stáhnul, protože jsme v něm dělali ve škole, b… nový
antibalda 02.10.2015 15:12
antibalda
• Ono, projed naké fora "VS", nebo "Microsoftu", daji se tam najit dobra vysvetleni a vetsinou vzdy… nový
CoCoChanel 02.10.2015 15:13
CoCoChanel
Aplikacia moze komunikovat len s ovladacom, ne so zariadenim. Ked chces komunikovat priamo so zariad… nový
MM.. 02.10.2015 15:15
MM..
Právě že to chci udělat ve třídě HID, kde ovladač netřeba, protože napsat si vlastní ovladač, na to… nový
antibalda 02.10.2015 15:19
antibalda
Jaky ovladac to teda aktualne pouziva? Viz spravca zariadeni. Vyrobca toho USB zariadenia k nemu nep… nový
MM.. 02.10.2015 15:26
MM..
Nene, výrobce k němu žádný ovladač neposkytuje, protože výrobce toho zařízení jsem já. Proto to mám… nový
antibalda 02.10.2015 15:29
antibalda
Ovladac pre to zariadenie sa nejaky nacitat musi. Viz spravcu zariadeni, ak nema vykricnik, tak tam… nový
MM.. 02.10.2015 15:32
MM..
Tjn, zařízení samotné problém není - na to jsem našel celkem dobrou knihovnu - V-USB. Jak říkám, pro… nový
antibalda 02.10.2015 15:35
antibalda
Uz som to pisal, v studiu komunikujes s ovladacom, a nemas ani ponatia ci to je na USB alebo na mimo… nový
MM.. 02.10.2015 15:46
MM..
Najjednoduchsie je urobit to USB zariadenie tak, aby sa hlasilo trebars ako com port, musi v nom byt… nový
MM.. 02.10.2015 15:28
MM..
To s tebou souhlasím, že je nejjednodušší, problém je v tom, že bych musel mít v zařízení převodník… nový
antibalda 02.10.2015 15:31
antibalda
1 vec je HW-level, to je len o tom jak kmitaju nejake piny. Druha vec je uroven USB stacku, to zname… nový
MM.. 02.10.2015 15:56
MM..
Hlavne, že sem dáš odkaz (ktorý si zrejme ani sám nečítal)... Odkazy a download -> Automator :i: nový
pme 02.10.2015 15:58
pme
Ano tam pekne vidno tu enumeraciu HID a hladanie podla vendor a device ID v subore "usb-windows.c" :… nový
MM.. 02.10.2015 16:04
MM..
Ten článek jsem samozřejmě četl. Automator jsem si stáhl také, pro inspiraci dobrý - je psaný v C++.… nový
antibalda 02.10.2015 19:20
antibalda
To si potom musis zistit komunikaciu so zariadenim. Ovladac pozna len VID a PID resp len to co ti ta… nový
MM.. 02.10.2015 19:26
MM..
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ří… nový
antibalda 02.10.2015 19:29
antibalda
Ak to su uplne stejne zariadenia tak programy zvycajne maju v nastaveniach alebo rovno v dialogu vyb… nový
MM.. 02.10.2015 19:34
MM..
Samozrejme, že zo C# ide volať WinAPI, viď DllImportAttribute Class. poslední
los 02.10.2015 20:17
los
Ta fcia vracia toto https://msdn.microsoft.com/en-us/library/windows/h ardware/ff538868%28v=vs.85%29… nový
MM.. 02.10.2015 19:40
MM..
Jasně, že nejlepší by bylo dát každému zařízení svoje PID, ale je to nějaké omezené, co jsem četl, n… nový
antibalda 02.10.2015 19:54
antibalda
Ano ta library moze byt tiez dobra. VID je vendor ID, malo by byt jedinecne vyrobca si to ma kdesi… nový
MM.. 02.10.2015 20:04
MM..
http://www.developerfusion.com/article/84338/makin g-usb-c-friendly/ nový
pme 02.10.2015 20:12
pme

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.

Ovladac pre to zariadenie sa nejaky nacitat musi. Viz spravcu zariadeni, ak nema vykricnik, tak tam mas nejaky MS ovladac nacitany. Komunikovat musis potom s tym ovladacom.

V tom zariadeni si napis firmware tak, aby sa s tym dalo komunikovat normalnejsie (musis v nom mat USB stack a fcionalitu naprogramovanu, samo od seba to komunikovat nebude)

Uz som to pisal, v studiu komunikujes s ovladacom, a nemas ani ponatia ci to je na USB alebo na mimozemskom interface, musis len vediet typ zariadenia ktore hladas (t.j. pouzity ovladac).
Ak to je nejake generic HID, tak budes hladat svoje HID device v systeme. Googlom sa da najst pre to napr. HidLibrary apod
(P.S: nepouzivam to, len vysvetlujem jak to je prinicpialne :)

1 vec je HW-level, to je len o tom jak kmitaju nejake piny. Druha vec je uroven USB stacku, to znamena reagovat na nejake IRQ a plnit niekde pamat paketom (pakety su v USB formate, ne uzivatelske data). Tretia vrstva dekoduje tie pakety a reaguje na nich, ta vrstva moze simulovat aj USB com port (tym ze zahlasi typ device seriovy port a bude dekodovat patricne pakety. Nemusis to robit tak (mozno by to ten atmel ani nestihal ked to robis softwarovo aj HWlevel, a lepsie je najst si to niekde hotove (atmel ma tusim nieco na webe pre chipy s HW USB portami), ptz programovat si to sam cele to by jedneho drblo :) Len pripominam ze z Win sa asi komunikuje najjednoduchsie ked to je USB COM port (potom len otvoris COM port pomocou CreateFile a komunikujes).

Ked to uz mas ako HID tak ok, musis si najst kniznicu pre pracu s hid device v systeme, viz co som daval vyssie. Zrejme to najprv najde vsetky (enumeracia) potom si ich vsetky prelezes a najdes si to svoje (asi pomocou vendor ID) a nasledne s nim pracujes.

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.

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++

Ta fcia vracia toto
https://msdn.microsoft.com/en-us/library/windows/h ardware/ff538868%28v=vs.85%29.aspx
VendorID
Specifies a HID device's vendor ID.
ProductID
Specifies a HID device's product ID.
VersionNumber
Specifies the manufacturer's revision number for a HIDClass device.
t.j. mozes si v roznych zariadeniach drbnut trebars roznu verziu, ak maju odlisnu funkcnost.

BTW. ta fcia neni nic ine ako poslatie kodu IOCTL_HID_GET_COLLECTION_INFORMATION ovladacu hidneco.sys, o tom som pisal na zaciatku, aby si mal predstavu ze kam to leze :) Tie IOCTL_ kody su specialne pre kazdy ovladac. hid ovladac pozna tieto (nalavo je zoznam) https://msdn.microsoft.com/en-us/library/windows/h ardware/ff541092%28v=vs.85%29.aspx

Co sa tyka C#, pozri si ten link na kniznicu C# co som daval vyssie, ak to musi byt v C# (ja s C# nerobim je to podla mna totalna kravina co potrebuje 500MB framework, podla mna aplikacia ma mat 100kB a nepotrebovat nic viac :)

Ano ta library moze byt tiez dobra.

VID je vendor ID, malo by byt jedinecne vyrobca si to ma kdesi asi registrovat u nejakej organizacie, PID si voli vyrobca sam (product ID). Za normalnych okolnosti sa uz nacitavanie ovladaca (.sys) riadi tymito dvomi vecami, ku kazdemu ovladacu (.sys) je aj .inf subor, v ktorom je napisane ze pre ktore VID a PID ten ovladac patri, a Win ked zdetekuje nove device hlada spravny ovladac ktory ma v .inf tieto hodnoty. Plati aj pre PCI zariadenia atd.

V pripade HID device neviem zhlavy jak Win zisti to, ze ma nacitat HID ovladac, zrejme aj u USB existuje nejake classID podobne jak u PCI, a podla toho Win vie ze to je HID device a ze staci nacitat univerzalny hid ovladac. A nemalo by to byt zavisle na VID a PID. Akurat by si nemal pouzivat nejake VID nejakeho intelu, aby win nenacitaval nejake divne ovladace :-D Principialne ale myslim ze PID mozes menit.
Dalsia vec ktoru urcite mozes menit je ta verzia, podla toho si mozes tiez odlisovat zariadenia, aj ked maju stejne VID a PID. Ta fcia HidD_GetAttributes ti vrati aj verziu (som ti daval link na tu strukturu teraz vyssie). Verziu a aj VID a PID si definujes v tom atmeli v USB stack kode kdesi bude urcite definicia na to. Tieto vsetky 3 jpodnoty vidis aj v spravci zariadeni, obrazok napr tu http://stackoverflow.com/questions/12567023/how-to -know-usb-device-hid-and-pid, si to mozes skontrolovat ze jak sa hlasi ten atmel aj bez aplikacie.

Zpět do poradny Odpovědět na původní otázku Nahoru