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.