Zdravím.
Podarilo sa mi konečne vytvoriť program v assembleri pre PIC16F1454, ktoré sa cez USB hlási v PC ako "zariadenie z rozhraním HID" -> "HID-compilant-device". Stláčaním tlačítka posielam 8 bajtov do PC a táto aplikácia je schopná v okienku "Received" moje čísla zobrazovať. Aplikácia je písaná v jazyku C#, ktorému nerozumiem. Preto som sa pustil do tvorby vlastného programu vo WinApi. Najprv získam HID Guid s využitím funkcie:
HidD_GetHidGuid(&hidGuid);
Potom naplním štruktúru SP_DEVICE_INTERFACE_DATA datami:
SP_DEVICE_INTERFACE_DATA deviceInfo;
deviceInfoList = SetupDiGetClassDevs(&hidGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
Potom v cykle plním štruktúru SP_DEVICE_INTERFACE_DETAIL_DATA postupne zo všetkých pripojených zariadení:
SP_DEVICE_INTERFACE_DETAIL_DATA *deviceDetails = NULL;
deviceDetails = (SP_DEVICE_INTERFACE_DETAIL_DATA *)malloc(size);
deviceDetails->cbSize = sizeof(*deviceDetails);
SetupDiEnumDeviceInterfaces(deviceInfoList, 0, &hidGuid, i, &deviceInfo)
SetupDiGetDeviceInterfaceDetail(deviceInfoList, &deviceInfo, deviceDetails, size, &size, NULL);
...kde v položke "deviceDetails->DevicePath" sa postupne nachádza absolútna adresa každého pripojeného USB zariadenia vrátane PID a VID. To svoje PID a VID si vyberiem tak, že najprv naplním štruktúru HIDD_ATTRIBUTES datami:
HIDD_ATTRIBUTES deviceAttributes;
deviceAttributes.Size = sizeof(deviceAttributes);
HidD_GetAttributes(handle, &deviceAttributes);
...V položkách "deviceAttributes.VendorID" a "deviceAttributes.ProductID" sa nachádzajú čísla PID a VID. (...čísla a tiež DevicePath, si nechávam aj zobrazovať cez printf(), aby som mal spätnú kontrolu...) -To svoje PID a VID dávam do podmienky a vyberiem si iba zariadenie PIC16F1454. Nakoniec získavam jeho handle pomocou:
handle = CreateFile(deviceDetails->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
Handle som si nechal aj preistotu zobraziť. Obyčajné číslo, ktoré sa zobrazí len vtedy, keď mám svoje zariadenie pripojené. Takže mám istotu, že handle získavam. Potom som sa pokúšal v obsluhe správy WM_TIMER nastavených na 10ms čítať data z USB pomocou ReadFile:
DWORD bytesRead;
BYTE RXbufer[1000]; (...skúšal som aj TCHAR. Pole je globálne...)
ReadFile(handle, RXbufer, 8, &bytesRead, NULL);
Ale nič sa nenačítava. Žiadne data do RXbufer neprichádzajú. Potom som vyskúšal funkciu:
HidD_GetFeature(handle, RXbufer, 8);
Takisto nič. Ešte som si overil, či dakde nerobím školácku chybu, tak som napísal:
RXbufer[0] = 1;
RXbufer[1] = 2;
.
.
To sa zobrazuje pekne, každých 10ms. Ale z ReadFile() žiadne čísla neprichádzajú. Dokonca návratová hodnota ReadFile je 0. Skúšal som aj WriteFile(). Takisto nič. Vedeli by ste mi prosím poradiť, kde robím chybu? Skúšal som už všetko možné. Hľadal na internete. Ale márne. Robím na tom projekte USB už 3 mesiace takmer v kuse. Postupne sa to učím. Išlo to všetko ako z chlpatej deky. Dobojoval som to až sem a nakoniec nemôžem so zariadením komunikovať cez svoj program.