c# USBHID komutları yardım

Başlatan Gökhan BEKEN, 15 Ağustos 2011, 17:40:27

Gökhan BEKEN

Değerli arkadaşlar gelin şu komutları analiz edelim,
İnternette o kadar bakmama ramen Türkçe bir anlatım yok, Adil Fatih KİREMİTCİ nin çok güzel bir kitabı var ama visual basic için anlatmış.
İnternetteki paylaşılan programlar karışık geldi.
Sıfır bilgisi olanlar için hangi komut ne işe yarar, bağlantı kurarken hangi komutlar kullanılır, veri alma ve veri gönderme için hangi komutlar kullanılır bunlar için çok küçük program parçaları olsa yeter.
USB HID kullanmayı düşünüyorum dll yi nereye yazacağız, hangi protokolü kullanmamız gerektiğini nereye yazacağız.
visual c# 2008 kullanılıyorum
Yardımcı olursanız sevinirim.
Özel mesaj okumuyorum, lütfen göndermeyin.

t2

Hazır yapılmışı burda.
http://www.codeproject.com/KB/cs/USB_HID.aspx

Bu da karışık gelirse daha basiti olmaz.

hangi komut ne işe yarar, bağlantı kurarken hangi komutlar kullanılır bunlar gayet karışık şeylerdir. herkes uğraşmaz ve anlamaz. bunun yerine hazır yapılmış dosyalar  kullanılır.

Gökhan BEKEN

#2
Teşekkürler, inceliyorum
Özel mesaj okumuyorum, lütfen göndermeyin.

Gökhan BEKEN

#3
Yazdığım program: http://hotfile.com/dl/126913342/b350000/mgb_usb_led_kontrol.rar.html
USB dışında herşey hazır, 0 ila 255 arasındaki sayıları alıp gönderecek yapmak istediğim bu.
Şu an butonlar için 255 a kadar verilen bir sayıyı bitlere ayırıp gösteriyor, yani sayıyı el ile giriyorum bunu cihazdan okuyacak,
diğer kısım ise checkbox ile tıklanan bitleri decimal sayıya çeviriyor bu çevrilen sayı ise cihaza gönderilecek.

Sizin dediğiniz projeyi indirdim öncelikle visualstudio 2008 ile derleyemedim, hata veriyor. Projenin komutlarını inceledim ama pek anlamadım, Bana sadece bağlantı için olan gerekli kısmın komutları ve bu komutların hangi kısma yazılması gerektiği lazım şimdilik.
Bağlantı kuruldu veya kurulamadı diye geri bildirim yapacak. Bu kısmı hallettikten sonra data alışverişine geçeceğim. Hazır proje bendede çok var ama hepsi ayrı telden, bana c# lazım genelde visual basic kullanmışlar,c# olanların ise çoğunun sürümü farklı olduğu için derlemiyor,
Hazır program yerine kodlarda yardımcı olur musunuz?

yaptığım programdan görüntü:

image uploader
Özel mesaj okumuyorum, lütfen göndermeyin.

t2

#4
Profesyonel amaç yoksa, hobi işi ise, bu yukarıdaki gibi örneklerle idare edebilirsin.
Bağlantı kuruldu veya kurulamadı diye geri bildirim yapacak
Eğer ticari bir iş ise,  HID cihaz kullananlar için aynen söylediğin gibi çalışan hap gibi activex nesnesi yapıyorum. Güzel çalışıyor. Bunu yazarken bazı ticari hazır kod parçacıkları kullandığım için derin ksımını ben de bilmiyorum. Ama netice güzel ve sağlam.

Benim nesnede C# örneği vs 2008 veya 2010 fark etmez. delphi vb 6 ile de çalışır. Activex süper. Tavsiye ederim. Kullanılacak activex nesnesi multithread çalışmalı programına hiç sıkıntı vermemeli.

Böyle ücretsiz bir nesne varsa bulabilirsen onu da kullanabilirsin.  Bedava mcHID.dll mi ne vardı. o da işini görebilir. activex değildir. birçok özelliği yoktur. kendin yapmalısın.

Gönderdiğin datanın veya cihazdan gelen datanın yerine cuk diye oturması için hid report  kullanılır. Bununla bit düzeyinde komut gönderebilirsin. yani 512 tane ledin olsun hangisinin yanıp hangisinin söneceğini 1ms içinde gönderebilirsin. Komutu alan  HID cihaz bunu yorumlar ledleri yakar veya söndürür.

bybik

http://hotfile.com/dl/85692660/446242d/usb-uygulamalari-bilgiler-ccs-c18.rar.html

Eğer Türkçe kaynak istersen linkteki dosyayı biraz inceleyebilirsin.Usb hakkında hid dahil olmak üzere bir çok deteya girilmiş.Ayrıca örnek kodlarda dosyanın içerisinde mevcut.

Gökhan BEKEN

@t2 hocam bu proje için çalışacağım bütün çalışmalara ramen sonuç alamazsam sizden bahsettiğiniz yazılım desteğini alırız artık.
@bybik hocam o linkteki dosya bende zaten vardı.   Kullandıkları dil  Visual C++, bana Visual C# lazım. Ayrıca içindeki uygulamaların çoğu çalışmıyor.

Gelin şimdiye kadarki yapılan projeleri bir kenara bırakalım, sıfırdan yapalım şu projeyi. Türkiyede bu konuda döküman az. Döküman yazmasakta neyin ne olduğu anlaşılabilen, Türkçe açıklama satırları olan basit bir program yazalım.

Sıfırdan alalım. Öncelikle hid.dll yi projeye dahil etmek için, normal dll dosyalarını eklediğimiz gibi mi ekliyoruz. Yoksa windowsun kendi dll si olduğundan buna gerek yok mu? İncelediğim hid projelerinde hid.dll yi eklememişler ya da ben göremedim. İlk aşama olarak bunu yapalım ne dersiniz?
Özel mesaj okumuyorum, lütfen göndermeyin.

t2

#7
benim verdiğim c# örneği çalışıyordu. exesini denedim. vstudio 2008 de çalışması için ufak tefek değişiklik lazımdır.
Ayrıca cihaz varsa vendor id  product id? bunları girmezsen cihazı bulamaz. usb mouse ile deneme yapılmaz. Led yakıp söndürecek kart gibi, özel usb hid aygıt lazım.


hid.dll benim kendi kullandığım kodların derinliklerinde yazıyor. kullanmışlar eklemişler. zaten mecburi gibi bir şey. hidle ilgili bilgiler  hid.dll ve hidparse.dll gibi windows DLL lerinden geçecek.

şu açık kodları öncelikle vs2008 ile derlenebilir hale getirmelisiniz. Sonra çalışan proje üzerine led buton ekleyip cihaza komut göndertme işini yapabilirsiniz.  Cihazdan bilgi geldiğinde tetiklenen bir olay vardır.  Fakat kendi projenize USB katmak daha zor olsa gerek.

elinzide usb aygıt olmalı ki kodu deneyebilesiniz.  aygıt sizin gönderdiğinzi led yak söndür komutlarını nerden bilsin?   PC uygulamasına uygun bir usb aygıt yani hazır çalışan bir proje denemelisiniz.



Gökhan BEKEN

PIC4550 ile bir devre yaptım üstünde 8 tane led var, birde eeprom var. Gerekirse kaydederim diye eklemiştim. Ama devreyi denemek için yazılım yüklemem lazım. Dediğiniz gibi sıfırdan başlarsam uğraştırır beni, ama hazırları da ben editleyemedim nedense karışık geldi. Tek istediğim 0 ila 255 arasındaki sayıyı pice göndermek. Sonrada tam tersi picten pc ye göndermek. Boş zamanınızda sadece bunu yapan bir dosya paylaşır mısınız? PIC kısmı için proteus kullanıyorum gerçek devreye atsam entegre sök tak uğraştırır diye önce proteusta virtual usb ile deneyip sorun çıkmazsa gerçek devreye atacağım.
Özel mesaj okumuyorum, lütfen göndermeyin.

t2

#9
Örnekleri anlamak zor geldiyse  daha kolay örnek  için mesela şöyle bir yol izlenir.

  • Proteusta deneyebilmeniziçin  0 ila 255 arasındaki sayıyı pcye gönderen devre dosyaları
  • 0 ila 255 arasındaki sayıyı pice  gönderen  ve picden  geleni gösteren v.studio 2008 c# pc programı  ve kodları
  • Uygulamada kullanılacak HID activex nesnesi (yeni yapılacak)
  • Kapora alınır başlanır. Teslimat süresi 5 gün. Bitince demo yapılır. Beğenmezsen almazsın


Gökhan BEKEN

Hocam para ile proje yaptıracak bütçem yok. Yeni mezunum, Kasım 2011 de askere gideceğimden bir maaşlı işte çalışmıyorum böyle konuları öğrenmeye çalışıyorum.
Özel mesaj okumuyorum, lütfen göndermeyin.

Gökhan BEKEN

usb_wait_for_enumeration();         //Cihaz, hazır olana kadar bekle

komutu yanıt vermiyor neden olabilir acaba?
Çalışıp çalışmadığını anlamak için bu komutun bir üstünde e1 pinini high yaptım
ve bu komutun  usb_wait_for_enumeration(); peşine e1 pinini low yaptım ama
e1 high kalıyor yani bu komutta takılı kaldığı için bir sonraki satıra geçmiyor.

Dene yaptığım program:
#include <18F4550.h>
#fuses HSPLL,USBDIV,PLL5,PUT,CPUDIV1,VREGEN,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOMCLR
#use delay(clock=48000000)

#define USB_HID_DEVICE     TRUE             
#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT //Uçnokta1'de Kesme transferi aktif
#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT    
#define USB_EP1_TX_SIZE    64                 //Uçnokta1 için maksimum alınacak ve gonderilecek
#define USB_EP1_RX_SIZE    64                 //veri boyutu (64 byte)

#include <pic18_usb.h>     
#include <USB_Konfigurasyon.h>                //USB konfigurasyon bilgileri bu dosyadadır.
#include <usb.c>   


#define UcNokta1       1 
#define Komut          gelen_paket[0]

//Yazılım (Firmware) Sürüm no
#define surum_no1      0x00            //surum_no2.surum_no1 ornek: 1.0
#define surum_no2      0x01  


void main(void)
{  
        
   byte sayac=0;
   byte gelen_paket[64];               //gelen paket
   byte gond_paket[64];                //gönderilecek paket
 
 //Sistemi başlat                
   usb_init(); //USB hazirlaniyor                   
   usb_task();                      
   output_high(PIN_e1); delay_ms(100); //geri bildirim almak için koyduk
   usb_wait_for_enumeration();         //Cihaz, hazır olana kadar bekle
   output_low(PIN_e1);  delay_ms(100); //eğer led sönerse bir üstteki komut çalıştı demektir.   
   
   if(usb_enumerated()) //USB bağlantısı kurulduysa led ile göster
   {      
      output_b(0b01010101); delay_ms(200);           
   }
   else
   {
      output_b(0b10000001); delay_ms(200);           
   }
      
  
}









USB_Konfigurasyon.h dosyası:
                                                      

#IFNDEF __USB_DESCRIPTORS__
#DEFINE __USB_DESCRIPTORS__

#include <usb.h>

     const char USB_CLASS_SPECIFIC_DESC[] = {
      6, 0, 255,    // Usage Page = Vendor Defined
      9, 1,            // Usage = IO device
      0xa1, 1,       // Collection = Application
      0x19, 0,        // Usage minimum
      0x29, 800,        // Usage maximum

      0x15, 0x00,        // Logical minimum (-128)
      0x25, 0xFF,        // Logical maximum (127)

      0x75, 8,        // Report size = 8 (bits)
      0x95, 64,        // Report count = 16 bits (2 bytes)
      0x81, 2,        // Input (Data, Var, Abs)
      0x19, 0,        // Usage minimum
      0x29, 800,        // Usage maximum
      0x75, 8,        // Report size = 8 (bits)
      0x95, 64,        // Report count = 16 bits (2 bytes)
      0x91, 2,        // Output (Data, Var, Abs)
      0xc0            // End Collection
   };


   //if a class has an extra descriptor not part of the config descriptor,
   // this lookup table defines where to look for it in the const
   // USB_CLASS_SPECIFIC_DESC[] array.
   //first element is the config number (if your device has more than one config)
   //second element is which interface number
   //set element to 0xFFFF if this config/interface combo doesn't exist
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP[USB_NUM_CONFIGURATIONS][1] =
   {
   //config 1
      //interface 0
         0
   };

   //if a class has an extra descriptor not part of the config descriptor,
   // this lookup table defines the size of that descriptor.
   //first element is the config number (if your device has more than one config)
   //second element is which interface number
   //set element to 0xFFFF if this config/interface combo doesn't exist
   const int16 USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[USB_NUM_CONFIGURATIONS][1] =
   {
   //config 1
      //interface 0
         32
   };


//////////////////////////////////////////////////////////////////
///
///   start config descriptor
///   right now we only support one configuration descriptor.
///   the config, interface, class, and endpoint goes into this array.
///
//////////////////////////////////////////////////////////////////

   #DEFINE USB_TOTAL_CONFIG_LEN      41  //config+interface+class+endpoint+endpoint (2 endpoints)

   const char USB_CONFIG_DESC[] = {
   //IN ORDER TO COMPLY WITH WINDOWS HOSTS, THE ORDER OF THIS ARRAY MUST BE:
      //    config(s)
      //    interface(s)
      //    class(es)
      //    endpoint(s)

   //config_descriptor for config index 1
         USB_DESC_CONFIG_LEN, //length of descriptor size          ==1
         USB_DESC_CONFIG_TYPE, //constant CONFIGURATION (CONFIGURATION 0x02)     ==2
         USB_TOTAL_CONFIG_LEN,0, //size of all data returned for this config      ==3,4
         1, //number of interfaces this device supports       ==5
         0x01, //identifier for this configuration.  (IF we had more than one configurations)      ==6
         0x00, //index of string descriptor for this configuration      ==7
         0x80, //bit 6=1 if self powered, bit 5=1 if supports remote wakeup (we don't), bits 0-4 unused and bit7=1         ==8
         50, //maximum bus power required (maximum milliamperes/2)  (100mA)

   //interface descriptor 1
         USB_DESC_INTERFACE_LEN, //length of descriptor      =10
         USB_DESC_INTERFACE_TYPE, //constant INTERFACE (INTERFACE 0x04)       =11
         0x00, //number defining this interface (IF we had more than one interface)    ==12
         0x00, //alternate setting     ==13
         2, //number of endpoins, except 0 (pic167xx has 3, but we dont have to use all).       ==14
         0x03, //class code, 03 = HID     ==15
         0x00, //subclass code //boot     ==16
         0x00, //protocol code      ==17
         0x00, //index of string descriptor for interface      ==18

   //class descriptor 1  (HID)
         USB_DESC_CLASS_LEN, //length of descriptor    ==19
         USB_DESC_CLASS_TYPE, //dscriptor type (0x21 == HID)      ==20
         0x11,0x01, //hid class release number (1.0) (try 1.10)      ==21,22
         0x00, //localized country code (0 = none)       ==23
         0x01, //number of hid class descrptors that follow (1)      ==24
         0x22, //report descriptor type (0x22 == HID)                ==25
         USB_CLASS_SPECIFIC_DESC_LOOKUP_SIZE[0][0], 0x00, //length of report descriptor            ==26,27

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                   ==28
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)          ==29
         0x81, //endpoint number and direction (0x81 = EP1 IN)       ==30
         0x03, //transfer type supported (0x03 is interrupt)         ==31
         USB_EP1_TX_SIZE,0x00, //maximum packet size supported                  ==32,33
         10,  //polling interval, in ms.  (cant be smaller than 10)      ==34

   //endpoint descriptor
         USB_DESC_ENDPOINT_LEN, //length of descriptor                   ==35
         USB_DESC_ENDPOINT_TYPE, //constant ENDPOINT (ENDPOINT 0x05)          ==36
         0x01, //endpoint number and direction (0x01 = EP1 OUT)      ==37
         0x03, //transfer type supported (0x03 is interrupt)         ==38
         USB_EP1_RX_SIZE,0x00, //maximum packet size supported                  ==39,40
         10 //polling interval, in ms.  (cant be smaller than 10)    ==41
   };

   //****** BEGIN CONFIG DESCRIPTOR LOOKUP TABLES ********
   //since we can't make pointers to constants in certain pic16s, this is an offset table to find
   //  a specific descriptor in the above table.

   //NOTE: DO TO A LIMITATION OF THE CCS CODE, ALL HID INTERFACES MUST START AT 0 AND BE SEQUENTIAL
   //      FOR EXAMPLE, IF YOU HAVE 2 HID INTERFACES THEY MUST BE INTERFACE 0 AND INTERFACE 1
   #define USB_NUM_HID_INTERFACES   1

   //the maximum number of interfaces seen on any config
   //for example, if config 1 has 1 interface and config 2 has 2 interfaces you must define this as 2
   #define USB_MAX_NUM_INTERFACES   1

   //define how many interfaces there are per config.  [0] is the first config, etc.
   const char USB_NUM_INTERFACES[USB_NUM_CONFIGURATIONS]={1};

   //define where to find class descriptors
   //first dimension is the config number
   //second dimension specifies which interface
   //last dimension specifies which class in this interface to get, but most will only have 1 class per interface
   //if a class descriptor is not valid, set the value to 0xFFFF
   const int16 USB_CLASS_DESCRIPTORS[USB_NUM_CONFIGURATIONS][1][1]=
   {
   //config 1
      //interface 0
         //class 1
         18
   };

   #if (sizeof(USB_CONFIG_DESC) != USB_TOTAL_CONFIG_LEN)
      #error USB_TOTAL_CONFIG_LEN not defined correctly
   #endif


//////////////////////////////////////////////////////////////////
///
///   start device descriptors
///
//////////////////////////////////////////////////////////////////

   const char USB_DEVICE_DESC[USB_DESC_DEVICE_LEN] ={
      //starts of with device configuration. only one possible
         USB_DESC_DEVICE_LEN, //the length of this report   ==1
         0x01, //the constant DEVICE (DEVICE 0x01)  ==2
         0x00,0x02, //usb version in bcd 
         0x00, //class code ==5
         0x00, //subclass code ==6
         0x00, //protocol code ==7
         USB_MAX_EP0_PACKET_LENGTH, //max packet size for endpoint 0. (SLOW SPEED SPECIFIES 8) ==8
         0xD8,0x04, //vendor id (0x04D8 is Microchip, or is it 0x0461 ??)
         0x00,0x0E, //product id   ==11,12  //don't use ffff says usb-by-example guy.  oops
         0x00,0x01, //device release number  ==13,14
         0x01, //index of string description of manufacturer. therefore we point to string_1 array (see below)  ==15
         0x02, //index of string descriptor of the product  ==16
         0x00, //index of string descriptor of serial number  ==17
         USB_NUM_CONFIGURATIONS  //number of possible configurations  ==18
   };


//////////////////////////////////////////////////////////////////
///
///   start string descriptors
///   String 0 is a special language string, and must be defined.  People in U.S.A. can leave this alone.
///
///   You must define the length else get_next_string_character() will not see the string
///   Current code only supports 10 strings (0 thru 9)
///
//////////////////////////////////////////////////////////////////

//the offset of the starting location of each string.  offset[0] is the start of string 0, offset[1] is the start of string 1, etc.
char USB_STRING_DESC_OFFSET[]={0,4,12};

char const USB_STRING_DESC[]={
   //string 0
         4, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         0x09,0x04,   //Microsoft Defined for US-English
   //string 1
         8, //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         't',0,
         'm',0,
         'c',0,
   //string 2
         58,                   //length of string index
         USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
         't',0,
         'm',0,
         'c',0,
         'o',0,
         'n',0,
         'e',0,
         ' ',0,
         '(',0,
         'C',0,
         ')',0,
         ' ',0,
         'U',0,
         's',0,
         'b',0,
         'H',0,
         'I',0,
         'D',0,
         ' ',0,
         'U',0,
         'y',0,
         'g',0,
         'u',0,
         'l',0,
         'a',0,
         'm',0,
         'a',0,
         's',0,
         'i',0,
         ' ',0
};

#ENDIF


Özel mesaj okumuyorum, lütfen göndermeyin.

t2

usb_wait_for_enumeration adından anlaşıldığı kadarıyla  aygıtın usb host tarafından algılanmasını bekliyor.demekki algılanmamış.

Ortada bir aygıt var mı? pcnin usb portuna bağlandı mı?  PC uygulaması ve Pic kodu ile birlikte komple bir örnek denemek lazım.

Gökhan BEKEN

Bu sorunun dışında bir de devreyi bilgisayara bağladığımda, windows "bilinmeyen aygıt" diye uyarı veriyor. Kullandığım dil ccs c, arayüz programından önce pic tarafını yapmaya başladım, arayüz programı olmasa bile devrede yazan yazıyı göstererek tanıması lazım diye biliyorum. Mesela  "usb deneme cihazı" diye tanımasını istiyorum bunun için ne yapmam lazım? USB_Konfigurasyon.h dosyasında yazılar var ama onları göstermiyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

t2

#14
kristal yanlış olabilir. kondansatörü eksiktir. ayrıca picin 3.3 V çıkıişı ile şase  arasına 470nF bağlamak gerekiyor. mclryi beslemeye bağlarsın. başka da pek kritik şey yok. usb aygıt örneğini çalışıyor  diye  yayınladılarsa  devre montajında usb kablosunda vs hata vardır. yoksa çalışması lazım.

Yok ben  projeyi sıfırdan yazdım. belgeleri kendim okudum ve yaptım diyorsan config, pll  vb bir ton hata olabilir. Bir maniniz yoksa çalışan hazır örneği deneyin.