PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USB Datenempfang funktioniert nicht (c++, win xp sp3, LibUSB)



arc
17.10.2012, 07:40
Hallo zusammen,

ich habe diese Frage schon in einem anderem Forum gepostet aber leider keine
Antwort bekommen. Ich denke einfach, das war das falsche Forum. Hier meine Problem:

Ich habe hier einen Nibo2 der über ein XBee Modul Daten a ein UCOM-XBee
Modul (inkl. XBeee Modul) an meinen PC schickt. Das UCOM-XBee Modul steckt
also in meinem PC. Die empfangenen Daten kann ich mit der Software X-CTU (vom Hersteller)
auch problemlos auslesen.

Nun will ich mir eine Anwendung unter Verwendung von libusb-win32
schreiben damit ich die einkommenden Daten weiter verarbeite kann.

Ich muss dazu sagen dass ich mich noch im "Anänger-Bereich" in C++
Programmierung befinde und ich noch etwas Schwierigkeiten damit habe.

Nun habe ich folgendes Programm,(Windows XP SP3):

#include <stdio.h>
#include "libusb_download\include\lusb0_usb.h"
struct usb_bus *busses;
struct usb_bus *bus;
struct usb_device *dev;
struct usb_dev_handle *xbee;
int returncode;

void init()
{

for (bus = busses; bus; bus = bus->next) {
for (dev = bus->devices; dev; dev = dev->next) {
if (dev->descriptor.iSerialNumber == 220){

if (xbee=usb_open(dev)) {
printf("Device opened \n");
}
else{
printf("Device NOT opened = \n");
}


if((returncode=usb_set_configuration(xbee, 1)) < 0){
printf("NO configuration \n");
}
else{
printf("Configuration = %d \n",returncode);
}


if((returncode=usb_claim_interface(xbee, 0)) < 0){
printf("NOT claimed \n");
}
else{
printf("Claimed = %d \n", returncode);
}


int main() {
usb_init();
usb_find_busses();
usb_find_devices();
busses = usb_get_busses();
init();

char buffer[8];
while (1)
{
returncode = usb_interrupt_read(xbee, 0x82, buffer, 8, 50);
printf ("bytes = %d Buffer=: %d%d%d%d%d%d%d%d \n", returncode,
buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5],
buffer[6], buffer[7]);
}
return 0;
}


Das Programm lässt sich ohne Fehler compilieren. Bei
usb_set_configuration und usb_set_configuration bekomme ich auch keine
Fehler. Bei usb_interrupt_read bekomme ich den Fehler -116. Ich bin der
Meinung das ist ein Timeout.

Hier noch die Configs meines USB Adapters:

DLL version: 1.2.6.0
Driver version: 1.2.6.0

bus/device idVendor/idProduct
bus-0/\\.\libusb0-0001--0x03eb-0x204b 03EB/204B
- Manufacturer : Dean Camera
- Product : LUFA USB-RS232 Adapter
- Serial Number: A48363536383511060C1
bLength: 18
bDescriptorType: 01h
bcdUSB: 0110h
bDeviceClass: 02h
bDeviceSubClass: 00h
bDeviceProtocol: 00h
bMaxPacketSize0: 08h
idVendor: 03EBh
idProduct: 204Bh
bcdDevice: 0001h
iManufacturer: 1
iProduct: 2
iSerialNumber: 220
bNumConfigurations: 1
wTotalLength: 62
bNumInterfaces: 2
bConfigurationValue: 1
iConfiguration: 0
bmAttributes: c0h
MaxPower: 250
bInterfaceNumber: 0
bAlternateSetting: 0
bNumEndpoints: 1
bInterfaceClass: 2
bInterfaceSubClass: 2
bInterfaceProtocol: 1
iInterface: 0
bEndpointAddress: 82h
bmAttributes: 03h
wMaxPacketSize: 8
bInterval: 255
bRefresh: 0
bSynchAddress: 0
bInterfaceNumber: 1
bAlternateSetting: 0
bNumEndpoints: 2
bInterfaceClass: 10
bInterfaceSubClass: 0
bInterfaceProtocol: 0
iInterface: 0
bEndpointAddress: 04h
bmAttributes: 02h
wMaxPacketSize: 16
bInterval: 1
bRefresh: 0
bSynchAddress: 0
bEndpointAddress: 83h
bmAttributes: 02h
wMaxPacketSize: 16
bInterval: 1
bRefresh: 0
bSynchAddress: 0

Ich kann diese Konfigurationen auch in meiner Anwendung auslesen, nur
dass ich die vom Nibo2 gesendeten Daten auf meinem PC Auslesen kann
funktioniert nicht.

So weit ich die Configs des USB Adapters interpretieren kann hat "bInterfaceNumber: 1"
2 Endpoints (0x04 und 0x83) die ich mit usb_bulk_read (0x83) und usb_bulk_write (0x04)
ansprechen können sollte. Der Code wurde dementsprechend verändert:

usb_claim_interface(xbee, 1)

char buffer[16];
usb_bulk_read(xbee, 0x83, buffer, sizeof(buffer), 500);
bzw.
usb_bulk_write(xbee, 0x04, buffer, sizeof(buffer), 500);


Auch dies funktioniert leider nicht. Nun stehe ich echt aufm Schlauch.
Was mache ich falsch? Ich bin über jeden Tipp dankbar. Wenn ihr noch Fragen hab, einfach
fragen.

Grüße, Marco

CCP1CON
21.11.2012, 09:55
Wenn ich das richtig gesehen habe benutzt UCOM_XBEE noch das USB 1.1 Protokoll.
Nicht sicher, inwieweit LibUSB richtig damit umgehen kann.
In der Dokumentation wird nur von USB 2.0 gesprochen.

Ja, -116 bedeutet „connection timed out“.

Vielleicht will das UCOM-XBEE die Daten gar nicht herausgeben?
Oder weißt Du, dass es möglich sein muss?

Ich würde einfach mal einen USB Analyzer (z.B. USBTrace), installieren und mal „mithören“, wie der originale Datentransfer abläuft.
Vielleicht macht der Treiber ja vorher was Spezielles um den Datenaustausch zu initialisieren.

Ich erinnere mich an den PS3 Controller, der auch ein spezielles Datenpacket erwartet hat, bevor er Daten rausrückt.

arc
21.11.2012, 13:11
Hallo CCP1CON,

vielen Dank für deine Antwort. Ich habe aber zum Glück das Problem schon gelöst. Ich war hier leider völlig auf dem Holzweg. Diese Information hat mir dann weiter geholfen:

"Der UCOM ist ein Standard USB CDC Gerät, das bedeutet, das er sich einfach über eine virtuelle serielle Schnittstelle ansprechen lässt. USB Verständnis/Details sind unnötig....
Du musst einfach nur den entsprechenden COM-Port öffnen. Danach kommt der serielle Datenstrom am XBee Modul an. "

Nachdem ich nun den UCOM als serielle Schnittstelle angesprochen habe, hat alles funktioniert.

Grüße, Marco