Forum: PC-Programmierung Problem mit VUSB und HIDApi


von Thomas M. (thomasmaintz)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich möchte gerne für mein derzeitiges Projekt eine Verbindung zwischen 
eine Qt Programm und meinem Atmega via USB herstellen. Dazu habe ich 
VUSB auf den uC geflasht, dieser wird auch im Systemtool angezeigt und 
ohne Probleme erkannt.

Mit der USB HID Api von Signal11 (http://www.signal11.us/oss/hidapi/) 
habe ich einen "Plattformunabhängigen" USB Ansatz gefunden.

Nach dem Beispielprogramm von der Supportseite habe ich nun folgendes 
Testprogramm geschrieben

Inhalt des Testprogramms.cpp
1
#include <iostream>
2
#include "hidapi.h" // Download von http://www.signal11.us/oss/hidapi/
3
4
using namespace std;
5
6
int main()
7
{
8
    struct hid_device_info *devs, *cur_dev;
9
10
    devs = hid_enumerate(0x0, 0x0);
11
    cur_dev = devs;
12
    while (cur_dev) {
13
        cout << "Device Found\n  type: " << cur_dev->vendor_id << " " <<  cur_dev->product_id << endl 
14
             << "Path " << cur_dev->path << endl 
15
             << "Seriennummer " << cur_dev->serial_number<< endl;
16
        cout << " Hersteller: " << cur_dev->manufacturer_string << endl 
17
             << " Produkt: " << cur_dev->product_string << endl;
18
        cur_dev = cur_dev->next;
19
    }
20
    hid_free_enumeration(devs);
21
22
    hid_device* usb_device;
23
    hid_init();
24
    usb_device = hid_open(5824,1503,NULL);
25
26
    if(usb_device==NULL) {
27
        cout << "Konnte keine Verbindung herstellen";
28
    } else {
29
        cout << "Verbindung mit USB Geraet hergestellt!";
30
    }
31
32
    return 0;
33
}

Das Programm funktioniert ohne Probleme und ich kann die Verbindung zu 
meinem USB Gerät auch sicher herstellen. Dabei versagt das Programm 
auch, wenn ich z.B. die IDs ändere oder den Stecker ziehe.

Bis hierhin arbeitet also die Testumgebung einwandfrei.

Jetzt möchte ich gerne mit Datenbanken und Fenstern eine GUI aufbauen, 
die im Hintergrund auf die gleichen Funktionen zugreift. Dazu habe ich 
mir eine Klassenstruktur geschaffen, die das bewältigen soll. Die 
Klasse, welche hier die USB Verbindung verwaltet heisst CLCUSB.

Inhalt von clcusb.h
1
#pragma once
2
3
#include "definitionen.h" // Programmweite Definitionen
4
#include "hidapi.h" // Download von http://www.signal11.us/oss/hidapi/
5
6
class CLCUSB
7
{
8
public:
9
    CLCUSB();
10
11
    // Stelle die Verbindung her
12
    bool bConnect();
13
    // Löse die Verbindung auf
14
    void vDisconnect();
15
    // Stelle fest, ob schon eine Verbindung existiert
16
    bool bIsConnected();
17
18
    // Handler für das USB Gerät
19
    hid_device *usb_device;
20
    // Product und VendorID
21
    unsigned short VendorID, ProductID, SerialNumber;
22
    bool connected;
23
24
signals:
25
26
public slots:
27
};

Inhalt von clcusb.cpp
1
#include "clcusb.h"
2
3
CLCUSB::CLCUSB()
4
{
5
    this->connected = false;
6
    this->ProductID = 1503;
7
    this->VendorID = 5824;
8
    this->SerialNumber = NULL;
9
}
10
11
bool CLCUSB::bConnect() {
12
    hid_init();
13
14
    this->usb_device = hid_open(this->VendorID,this->ProductID,NULL);
15
16
    if(this->usb_device == NULL)
17
        return false;
18
    this->connected = true;
19
    return true;
20
}
21
22
void CLCUSB::vDisconnect() {
23
    hid_close(this->usb_device);
24
    this->connected = false;
25
}
26
27
bool CLCUSB::bIsConnected() {
28
    return this->connected;
29
}

Dabei habe ich leider ein Problem. Die Verbindung kann nicht korrekt 
hergestellt werden. Mittlerweile bin ich wohl "betriebsblind" geworden 
und sehe meinen Fehler einfach nicht mehr. Die Konsole gibt mir 
mittlerweile Ausgaben aus dem Programmstack aus. Inhalt der Ausgabe 
befindet sich im Anhang. Dabei ist anzumerken, dass mein Projekt den 
Kurznamen CLC erhalten hat (wird im Programmstack immer wieder 
auftreten, daher bitte nicht verwirren lassen).

Mein Problem ist nun, wie bekomme ich die USB Verbindung auch innerhalb 
meiner Klassenstruktur hin... Da habe ich leider gerade keine Idee. 
Gerne gebe ich auf Anfrage auch den kompletten Quellcode Preis.

von Thomas M. (thomasmaintz)


Angehängte Dateien:

Lesenswert?

Ich habe mittlerweile eine Vermutung, woran der Fehler liegen könnte:

Ich habe die Klasse in ein eigenständiges Programm ausgelagert und die 
Klasse tut hier exakt das, was sie tun soll. Die USB Verbindung habe ich 
ohne Probleme aufgebaut bekommen und ich kann auch Daten austauschen.

Sobald ich jedoch QApplication app(argc, argv); einfüge, erhalte ich den 
gleichen Fehler wie vorhin.

In der hochgeladenen main.cpp sieht der Funktionsaufruf folgendermaßen 
aus:
1
#include <QGuiApplication>
2
#include <QApplication>
3
4
#include "clcusb.h"
5
6
using namespace std;
7
8
int main(int argc, char *argv[])
9
{
10
    QApplication app(argc, argv);
11
    CLCUSB usb;
12
13
    usb.bConnect();
14
15
    if(usb.bIsConnected())
16
        cout << "Verbunden" << endl;
17
    else
18
        cout << "Nicht verbunden " << endl;
19
20
    return app.exec();
21
}

Das Programm funktioniert jedoch, sobald folgende Änderungen gemacht 
werden:
1
#include <QGuiApplication>
2
#include <QApplication>
3
4
#include "clcusb.h"
5
6
using namespace std;
7
8
int main(int argc, char *argv[])
9
{
10
//    QApplication app(argc, argv);
11
    CLCUSB usb;
12
13
    usb.bConnect();
14
15
    if(usb.bIsConnected())
16
        cout << "Verbunden" << endl;
17
    else
18
        cout << "Nicht verbunden " << endl;
19
20
    return 0;
21
//    return app.exec();
22
}

Hat jemand schon bereits einen ähnlichen Fehler gehabt?
Ich verwende Qt 5.5 und entwickle derzeit auf OSX Yosemite.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.