PIC'den USB'ye veri gönderme hatası

Başlatan cengav4r, 18 Kasım 2014, 15:03:31

cengav4r

Şimdi GPS den gelen datanın uzunluğu, GPS bağlanıyasıya kadar kafasına göre değişiyor. Gelen datayı USB ye göndermeye çalışıyorum(Kullandığım kütüphaneler pic18_usb.h, USB_Driver.h, usb.c).
64 bytelik veri gönderimi için
usb_put_packet(1,data ,64, USB_DTS_TOGGLE); // Data

kullandığımda elde ettiğim (eksik) data aşığıdaki gibidir.
GPRMC,111111.00,A,1111.11111,N,01111.11111,E,1.111,,123456,,,A* 


Hareket etmeye başladığımda, data formatı değişiyor (hava hızı falan ekleniyor. Ancak sadece ilk 64 bytelık veriyi okuyabiliyorum.Diğer veri kayboluyor.)
GPRMC,111111.00,A,1111.11111,N,01111.11111,E,11.111,11.11,12345


Eğer usb data (length) uzunluğunu 32 bytelık yaparsam ilk 32 bytelık veriyi alabiliyorum. Diğer veri kayboluyor.
usb_put_packet(1,data ,32, USB_DTS_TOGGLE); // Data
GPRMC,111111.00,A,1111.11100,N,



Son olarak usb data (length) uzunluğunu 128 byte lık yapmaya çalıştıpında <usb.c> driverinden "#error Packet size is too big" hatası alıyorum.
Driverin içinde tx>64byte rx>8 byte olarak sınırlandırılmış anladığım kadarıyla

#if (defined(USB_USE_FULL_SPEED) && (USB_USE_FULL_SPEED==1))
   #define USB_ISO_PACKET_MAX_SIZE     1023
   #define USB_NONISO_PACKET_MAX_SIZE  64
#else
   #define USB_ISO_PACKET_MAX_SIZE     1023
   #define USB_NONISO_PACKET_MAX_SIZE  8
#endif


Bunları değiştirsem hiç çalışmıyor.
En son olarak USB_Driver.h içinde Report count 128 olarak değiştirdim.
Sizden ricam PIC'den USB'ye 128 byte'lık veri nasıl gönderebilirim, yada hatam nerede, nereye bakmam lazım, teşekkürler?

baran123

"Sizden ricam PIC'den USB'ye 128 byte'lık veri nasıl gönderebilirim" veriyi ikiye bölme şansızınız barsa parça parça gçnderin zaten usb olduğu için hız problemı olmaz ama tam olarak nasıl data gelıyor bılmıyorum gps hıc denemedım bolme sansınız varsa bu sekıdle olabilir

cengav4r

#2
Hocam öncelikle cevap için teşekkürler, internetten baktığım kadarıyla 128 byte gönderen var ama nasıl göndermiş anlayamadım(#include <USB_Driver.h>  yerine farklı kütüphane kullanmışlar). Usb_Driver.h içindeki report count değiştirdim yine çalışmadı. GPS den gelen veriyi buffera atıp, ordan gönderiyorum.
data[i++]=c;
Biraz daha bakayım, olmazsa parça parça göndermeye çalışayım.
Ek olarak putc komutu gibi usb'de usb_putc komutu var mı acaba? (#include <usb_cdc.h> 'yi kullanmadığımdan usb_cdc_putc yi kullanamıyorum)

t2

#3
Aygıt HID ise her defasında en fazla 64 bayt gönderilir. Sayıları değiştirmekle,64 ü  128 yapmakla artmaz. 64ten düşük olur fazla olmaz. Belki de Hid değildir.

mesaj birleştirme:: 18 Kasım 2014, 18:42:12

Descriptor dosya varsa bakarak tavsiyede bulunabilirim

cengav4r

#4
@t2 hocam, evet araştırdığım kadarıyla HID ile max 64 byte gönderilebiliyor. Parça parça göndermeye çalışacağım.
Bu arada kullandığım descriptor,(64 byte (çalışan)- Report count 128 olunca çalışmıyor, usb.c içinde zaten 64 byte tanımlanmış)

#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
   };



Mesaja ek olarak; Daha önceden Proteus'da denemiştim, düzgün çalışmıştı.

M.s.d

Benim sorunum sanırım daha basit.
Ben pic den pc ye 35 byte data gönderirken pc den pice 3 byte data geliyor.
Data boyutunu aşağıdaki gibi değiştirdiğimde pc tarafında hata veriyor. 64 byte iken bir problem yok ancak boş data göndermek istemiyorum.

#define USB_EP1_TX_SIZE    35
#define USB_EP1_RX_SIZE    3

usb_put_packet(UcNokta1,usb_data,35, USB_DTS_TOGGLE);

usb_get_packet(UcNokta1,usb_data_rec,3);

Neyi eksik yapıyorum acaba?

ziyaretci

#6
Alıntı yapılan: M.s.d - 23 Temmuz 2015, 09:57:07
Benim sorunum sanırım daha basit.
Ben pic den pc ye 35 byte data gönderirken pc den pice 3 byte data geliyor.
Data boyutunu aşağıdaki gibi değiştirdiğimde pc tarafında hata veriyor. 64 byte iken bir problem yok ancak boş data göndermek istemiyorum.

#define USB_EP1_TX_SIZE    35
#define USB_EP1_RX_SIZE    3

usb_put_packet(UcNokta1,usb_data,35, USB_DTS_TOGGLE);

usb_get_packet(UcNokta1,usb_data_rec,3);

Neyi eksik yapıyorum acaba?

"HER YÖNÜYLE USB" kitabı sayfa 40, 4. paragraf; "Tam-hız cihazlarda veri paketlerinin maksimum büyüklükleri 8, 16, 32 ya da 64 bayt olabilir."
  Anlaşılıyor ki, sizlik bir iş yok. USB protokolü başta hazırlanırken bazı kurallar konulmuş, seçenekler sunulmuş. Size hangisi en uygunsa onu seçin. Boş kalan byte'lar  mecburen 0(sıfır) bilgisi taşıyacak.