Obsługa USB.

W tym miejscu zadajemy pytania na temat języka C++, dzielimy się swoją wiedzą, udzielamy wsparcia, rozwiązujemy problemy programistyczne.
Awatar użytkownika
PROTON
Expert
Expert
Posty: 527
Rejestracja: czwartek 08 paź 2015, 18:35
Lokalizacja: Warszawa

Obsługa USB.

Postautor: PROTON » wtorek 13 paź 2015, 19:41

Tworząc urządzenie USB, trzeba je jakoś obsłużyć jakimś programem uruchomionym na komputerze PC.
Przedstawię prostą klasę w C++ wraz z przykładowym programem głównym.

Ściągamy i rozpakowujemy sterownik libusb-win32: http://sourceforge.net/projects/libusb-win32/

Podłączamy nasze urządzenie do komputera, w katalogu libusb-win32-bin-1.2.6.0/bin znajduje się inf-wizard.exe przy pomocy którego generujemy plik inf dla naszego urządzenia. Instalujemy wygenerowany sterownik, podłączamy jeszcze raz urządzenie, powinno zostać wykryte prawidłowo.

W środowisku Visual Studio tworzymy nowy projekt c++, na projekcie prawy myszy i Properties, Configuration Properties -> C/C++ -> General.
W Additional Include Directories dodajemy ścieżkę do include, w moim przypadku: C:\lib\libusb-win32-bin-1.2.6.0\include
Następnie: Configuration Properties -> Linker -> General W Additional Library Directories dodajemy ścieżkę do msvc, w moim przypadku: C:\lib\libusb-win32-bin-1.2.6.0\lib\msvc

Środowisko skonfigurowane możemy zająć się kodem.
app.h

Kod: Zaznacz cały

#pragma once

#include <lusb0_usb.h>
#include <iostream>

#define USB_CFG_VENDOR_ID   0x17c1
#define USB_CFG_DEVICE_ID   0x06ff

#define USB_LED_ON       0
#define USB_LED_OFF    1
#define USB_READ      2
#define USB_WRITE      3
#define USB_SAVE      4

class cApp{
private:
   //USB
   int vendor;
   int product;
   struct usb_bus *bus;
   struct usb_device *dev;
   usb_dev_handle *handle;

public:

   unsigned char buffer[3];
   
   void usbInit();
   bool findUSBdevice();
   bool USBread();
   bool USBwrite();
   bool USBsave();
   bool USBLEDON();
   bool USBLEDOFF();

   cApp() {};
   ~cApp() {};

};


app.cpp

Kod: Zaznacz cały

#include "app.h"
#include <iostream>

#pragma comment(lib, "libusb")

void cApp::usbInit(){
   usb_init();
   vendor = USB_CFG_VENDOR_ID;
   product = USB_CFG_DEVICE_ID;
   handle = NULL;
}

bool cApp::findUSBdevice(){
   usb_find_busses();
   usb_find_devices();

   for(bus = usb_get_busses(); bus; bus = bus->next){
      for(dev = bus->devices; dev; dev = dev->next){
         if(dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product){
            handle = usb_open(dev);
            return true;
         }
      }
   }
   return false;
}

bool cApp::USBread(){
   int r = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, USB_READ, 0, 0, (char *)buffer, sizeof(buffer),5000);
   return r >= 0;
}

bool cApp::USBwrite(){
   int r = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT, USB_WRITE, 0, 0, (char *)buffer, sizeof(buffer),5000);
   return r >= 0;
}

bool cApp::USBsave(){
   int r = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, USB_SAVE, 0, 0, (char *)buffer, sizeof(buffer), 5000);
   return r >= 0;
}

bool cApp::USBLEDON(){
   int r = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, USB_LED_ON, 0, 0, (char *)buffer, sizeof(buffer), 5000);
   return r >= 0;
}

bool cApp::USBLEDOFF(){
   int r = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, USB_LED_OFF, 0, 0, (char *)buffer, sizeof(buffer), 5000);
   return r >= 0;
}


main.cpp

Kod: Zaznacz cały

#include "app.h"

int main(int argc, char *argv[]) {

   cApp App;

   //inicjalizacja USB
   App.usbInit();

   if (!App.findUSBdevice()) {
      std::cout << "Nie znaleziono urządzenia USB\n";
      return 1;
   }

   //tutaj robisz co chcesz....
   //Ustawianie zawartości bufora i wysyłanie
   App.buffer[0] = 1;
   App.buffer[1] = 64;
   App.buffer[2] = 11;

   App.USBwrite();

   //włączenie LED
   App.USBLEDON();

   //wyłączenie LED
   App.USBLEDOFF();



   return 0;
}
Gott weiß ich will kein Engel sein.

Awatar użytkownika
RafPe
User
User
Posty: 177
Rejestracja: sobota 05 wrz 2015, 16:22

Re: Obsługa USB.

Postautor: RafPe » wtorek 13 paź 2015, 19:52

Bardzo fajnie opisane! Jak tylko bede mial chwile sam spobuje to odpalic u siebie

Awatar użytkownika
WoodPaker
User
User
Posty: 136
Rejestracja: czwartek 17 wrz 2015, 19:23
Lokalizacja: USA
Kontaktowanie:

Re: Obsługa USB.

Postautor: WoodPaker » środa 14 paź 2015, 18:16

Dokładnie w ten sposób obsługiwane jest środowisko V-USB spod PC. Chciałbym też doadć, że (na szczęście) biblioteki są dostępne zarówno spod Windowsa jak i Linuxa.

A przy okazji wytłumaczyc kilka rzeczy, których [b]PROTON[/] nie wytłumaczył.

Kod: Zaznacz cały

Funkcja [i]usb_control_msg[/i] ma następującą składnię.

int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout);
A w wyniku zwraca liczbę otrzymanych bajtów lub (-1) w przypadku błędu.


Pętla poniżej

Kod: Zaznacz cały

for(bus = usb_get_busses(); bus; bus = bus->next){
      for(dev = bus->devices; dev; dev = dev->next){
         if(dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product){
            handle = usb_open(dev);
            return true;
         }
      }
   }

ma za zadanie przeszukać całe drzewo urządzeń w celu sparwdzenia czy nasze urządzenie zostało podłączone już do komputera (system automatycznie odczytuje wszystkie potrzebne informacje o urządzeniu i wrzuca je do drzewa).
W przypadku powyżej pytamy systemu czy vendor (unikatowy numer producenta) oraz idProduct (unikatowy numer urządzenia) zastały już podłączone. Jeśli tak to system zwróci nam numer (handle) do obsługiwanego urządzenia. Jeśli nie to zwróci błąd.
Więcej można poczytac na tej stronie o V-USB. Lub na Stronie o V-USB po polsku. A i jeszcze http://4programmers.net/Z_pogranicza/Budowa_modu%C5%82u_kontrolnego_na_USB_przy_pomocy_mikrokontrolera_AVR jest ciekawą stroną.
Life is to short to eject USB safely


Wróć do „Pisanie programów w C++”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości