www.mikrocontroller.net

Forum: PC-Programmierung AtUsbHid.dll mit c# verwenden


Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hat jemand schon mal versucht die dll von atmel für di kommunikation mit 
avrs einzubinden und damit was gemacht
weis dass das irgendwie mit p/invoke funktionieren muss aber hab 
vieleicht jemand ein kleines beispiel oder so danke

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin jetzt ein bischen weiter nur bekomme ich jetzt ne fehlermeldung
vieleicht kann mir ja jemand weiterhelfen
wäre cool
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("mein at 90 usb warper");
            at90usb.findHidDevice(0x046A, 0x0027);     // meine usb maus sollte ja acu erkannt werden
            Console.ReadKey();
            
        }
    }
    class at90usb
    {
        [DllImport("AtUsbHid.dll")]
        public static extern Boolean findHidDevice(uint VendorID, uint ProductID);
        [DllImport("AtUsbHid.dll")]
        public static extern void closeDevice();

    }
}

  

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und warum teilst du die Fehlermeldung nicht mit?

Marcus

Autor: Christian R. (mrrotzi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, wo ist das Problem?

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja sorry AccessViolationExeption

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit ner anderne vid pid bekomm ich schön ein false zurück

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vieleicht passst es ja ach weil in der orginal anwendung von atmel gibt 
acu einen programmabsturz

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hier mal die header datei
//  Closes the USB device and all handles before exiting the application.
ATUSBHID_API void    STDCALL closeDevice(void);

ATUSBHID_API BOOLEAN STDCALL writeData(UCHAR* buf);

ATUSBHID_API BOOLEAN STDCALL readData(UCHAR* buffer);

ATUSBHID_API int     STDCALL hidRegisterDeviceNotification(HWND hWnd);

ATUSBHID_API void    STDCALL hidUnregisterDeviceNotification(HWND hWnd);

ATUSBHID_API int     STDCALL isMyDeviceNotification(DWORD dwData);

ATUSBHID_API BOOLEAN STDCALL setFeature(UCHAR type,UCHAR direction, unsigned int length);

wo ich noch nicht weis wie ichs machen soll ist das mit dem 
writeData(UCHAR* buf);
wie ich meinem char arrey oder string einen pointer zuweise
daentypen dies nicht gibt müsten prinzipiell mit unmanaget type gehen
aber wie geht das hab leider noch nichts gefunden

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HWND hWnd
ist mir auch nicht kalr
danke für die mühe

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau doch mal in den Weiten des WWW, da werden Sie geholfen.

Marcus

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            

            
            Console.WriteLine("mein at 90 usb warper");
            at90usb.closeDevice();
            Console.WriteLine(at90usb.findHidDevice(0x046B, 0x0027));
            Console.ReadKey();
            
        }
    }
    class at90usb
    {
        [DllImport("AtUsbHid.dll")]
        public static extern Boolean findHidDevice(uint VendorID, uint ProductID);
        [DllImport("AtUsbHid.dll")]
        public static extern void closeDevice();
        [DllImport("AtUsbHid.dll")]
        public static extern Boolean writeData(UCHAR* buf);
        [DllImport("AtUsbHid.dll")]
        public static extern Boolean readData(UCHAR* buffer);
        [DllImport("AtUsbHid.dll")]
        public static extern int hidRegisterDeviceNotification(int hWnd);
        [DllImport("AtUsbHid.dll")]
        public static extern void hidUnregisterDeviceNotification(int hWnd);
        [DllImport("AtUsbHid.dll")]
        public static extern int isMyDeviceNotification(UInt32 dwData);
        [DllImport("AtUsbHid.dll")]
        public static extern Boolean setFeature(byte type,byte direction, UInt32 length);
    }
}


jetzt hab ich halt noch das pointer problem
wie ich das genau übergeben kann
pointer ist ja eine ein zeiger auf eine speicheradresse was ja 
anumführsich nicht in c# unterstützt wird aber es sollte doch irgendwie 
gehen oder?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> jetzt hab ich halt noch das pointer problem
> wie ich das genau übergeben kann
> pointer ist ja eine ein zeiger auf eine speicheradresse was ja
> anumführsich nicht in c# unterstützt wird aber es sollte doch irgendwie
> gehen oder?

http://www.google.com
"p/invoke string"

ist immer noch dein Freund.
Es gibt auch von Microsoft tonnenweise Doku darüber wie
man sowas macht.


Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab jetzt mal alles was ich so habe in in eine c# dll gepackt
vieleicht weis ja jemand weiter oder hat gar ein at90usbkey zum 
herumspielen
vieleicht meldet sich ja auch mal jemand mit konstruktifen hinweisen
und kann mir sagen was man noch anders machen muss
thx

meine c# dll
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace sharpAt90UsbLib
{

    public class At90Usb
    {
        private uint VendorID, ProductID;
        public uint Vendor_ID
        {
            get
            {
                return VendorID;
            }
            set
            {
                VendorID = value;
            }
        }
        public uint Product_ID
        {
            get
            {
                return ProductID;
            }
            set
            {
                ProductID = value;
            }
        }

        [DllImport("AtUsbHid.dll")]
        private static extern Boolean findHidDevice(uint VendorID, uint ProductID);
        public Boolean find_Hid_Device()
        {
            return findHidDevice(VendorID, ProductID);
           
        }


        [DllImport("AtUsbHid.dll")]
        private static extern void closeDevice();
        public void close_Device()
        {
            closeDevice();
        }

        [DllImport("AtUsbHid.dll")]
        public static extern Boolean writeData(byte[] buf);

        [DllImport("AtUsbHid.dll")]
        private static extern Boolean readData(ref byte buffer);

        [DllImport("AtUsbHid.dll")]
        private static extern int hidRegisterDeviceNotification(IntPtr hWnd);

        [DllImport("AtUsbHid.dll")]
        private static extern void hidUnregisterDeviceNotification(IntPtr hWnd);

        [DllImport("AtUsbHid.dll")]
        private static extern int isMyDeviceNotification(uint dwData);

        [DllImport("AtUsbHid.dll")]
        private static extern Boolean setFeature(byte type, byte direction, uint length);
    }
}


c++ header datei von atmel
 
#ifndef _ATUSBHID_H_
#define _ATUSBHID_H_

// Error codes.
#define ERROR_USB_DEVICE_NOT_FOUND          0xE0000001
#define ERROR_USB_DEVICE_NO_CAPABILITIES    0xE0000002

// name of the DLL to be loaded
#define AT_USB_HID_DLL "AtUsbHid"

// Implement the DLL export/import mechanism and allow a C-written program
// to use our DLL.
#ifdef ATUSBHID_EXPORTS
#define ATUSBHID_API extern "C" __declspec(dllexport)
#else
#define ATUSBHID_API extern "C" __declspec(dllimport)
#endif


// This macro function calls the C runtime's _beginthreadex function. 
// The C runtime library doesn't want to have any reliance on Windows' data 
// types such as HANDLE. This means that a Windows programmer needs to cast
// values when using _beginthreadex. Since this is terribly inconvenient, 
// this macro has been created to perform the casting.
typedef unsigned(__stdcall *PTHREAD_START)(void *);

#define chBEGINTHREADEX(psa, cbStack, pfnStartAddr, \
   pvParam, fdwCreate, pdwThreadId)                 \
      ((HANDLE)_beginthreadex(                      \
         (void *)        (psa),                     \
         (unsigned)      (cbStack),                 \
         (PTHREAD_START) (pfnStartAddr),            \
         (void *)        (pvParam),                 \
         (unsigned)      (fdwCreate),               \
(unsigned *)(pdwThreadId)))

// Allow applications not built with Microsoft Visual C++ to link with our DLL.
#define STDCALL __stdcall

// These macros make calling our DLL functions through pointers easier.
#define DECLARE_FUNCTION_POINTER(FUNC)  PF_##FUNC lp##FUNC=NULL;  
#define LOAD_FUNCTION_POINTER(DLL,FUNC) lp##FUNC = (PF_##FUNC)GetProcAddress(DLL, #FUNC);
#define ADDR_CHECK(FUNC) if (lp##FUNC == NULL) {fprintf(stderr,"%s\n", "Error: Cannot get address of function."); return FALSE;}
#define DYNCALL(FUNC) lp##FUNC


///////////////////////////////////////////////////////////////////////////////
typedef BOOLEAN (STDCALL *PF_findHidDevice)(const UINT VendorID, const UINT ProductID);
typedef void    (STDCALL *PF_closeDevice)(void);
typedef BOOLEAN (STDCALL *PF_writeData)(UCHAR* buffer);
typedef BOOLEAN (STDCALL *PF_readData)(UCHAR* buffer);
typedef int     (STDCALL *PF_hidRegisterDeviceNotification)(HWND hWnd);
typedef void    (STDCALL *PF_hidUnregisterDeviceNotification)(HWND hWnd);
typedef int     (STDCALL *PF_isMyDeviceNotification)(DWORD dwData);
typedef BOOLEAN (STDCALL *PF_startBootLoader)(void);
typedef BOOLEAN (STDCALL *PF_setFeature)(UCHAR type,UCHAR direction, unsigned int length);
///////////////////////////////////////////////////////////////////////////////

// Exported functions prototypes.

///////////////////////////////////////////////////////////////////////////////
ATUSBHID_API BOOLEAN STDCALL findHidDevice(const UINT VendorID, const UINT ProductID);

//  Closes the USB device and all handles before exiting the application.
ATUSBHID_API void    STDCALL closeDevice(void);

ATUSBHID_API BOOLEAN STDCALL writeData(UCHAR* buf);

ATUSBHID_API BOOLEAN STDCALL readData(UCHAR* buffer);

ATUSBHID_API int     STDCALL hidRegisterDeviceNotification(HWND hWnd);

ATUSBHID_API void    STDCALL hidUnregisterDeviceNotification(HWND hWnd);

ATUSBHID_API int     STDCALL isMyDeviceNotification(DWORD dwData);

ATUSBHID_API BOOLEAN STDCALL setFeature(UCHAR type,UCHAR direction, unsigned int length);

///////////////////////////////////////////////////////////////////////////////

#ifndef ATUSBHID_EXPORTS


DECLARE_FUNCTION_POINTER(findHidDevice);
DECLARE_FUNCTION_POINTER(closeDevice);
DECLARE_FUNCTION_POINTER(writeData);
DECLARE_FUNCTION_POINTER(readData);
DECLARE_FUNCTION_POINTER(hidRegisterDeviceNotification);
DECLARE_FUNCTION_POINTER(hidUnregisterDeviceNotification);
DECLARE_FUNCTION_POINTER(isMyDeviceNotification);
DECLARE_FUNCTION_POINTER(setFeature);

// this function call all function available in the DLL *
static bool loadFuncPointers(HINSTANCE hLib)
{
    LOAD_FUNCTION_POINTER(hLib, findHidDevice);
    ADDR_CHECK(findHidDevice);

  LOAD_FUNCTION_POINTER(hLib, closeDevice);
    ADDR_CHECK(closeDevice);

  LOAD_FUNCTION_POINTER(hLib, writeData);
    ADDR_CHECK(writeData);

  LOAD_FUNCTION_POINTER(hLib, readData);
    ADDR_CHECK(readData);

  LOAD_FUNCTION_POINTER(hLib, hidRegisterDeviceNotification);
  ADDR_CHECK(hidRegisterDeviceNotification);

  LOAD_FUNCTION_POINTER(hLib, hidUnregisterDeviceNotification);
  ADDR_CHECK(hidUnregisterDeviceNotification);

  LOAD_FUNCTION_POINTER(hLib, isMyDeviceNotification);
  ADDR_CHECK(isMyDeviceNotification);

  LOAD_FUNCTION_POINTER(hLib, setFeature);
  ADDR_CHECK(setFeature);

    return true;
}

#endif

#endif  // _ATUSBHID_H_



Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bin ja immer offen für neue ideen und wollte nur mal wissen ob das was 
ich da vor habe in die richtige richtung geht
und c# ist halt doch etwas feiner für gui anwendungen
vieleicht hat ja jemand lut mitzumachen oder so

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.codeproject.com/useritems/USB_HID.asp


hab jetzt sogar schon was fertiges gefunden hoffe ich bekomms zu laufen 
werd ich gleich mat testen

Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann weisst du jetzt ja auch warum dein Programm beim Suchen deiner Maus 
nen Fehler wirft.

Marcus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.