2011-11-21 27 views
5

Ho cercato questo problema da un po 'di tempo e non riesco a farlo bene. Ho una versione C++ del software che vorrei fare in delphi, ma non riesco a farlo funzionare in delphi. Ho bisogno di una sorta di tutorial o guida che possa mostrarmi come connettermi, leggere e scrivere dati su un dispositivo HID USB.Come posso comunicare con un dispositivo USB HID in delphi

+0

I voti ravvicinati probabilmente significano che alla tua domanda manca di dettagli sufficienti per poter rispondere direttamente. Dovremmo sapere per magia cosa fa il vostro programma C++? Perché non spiegarlo? –

+1

Vorrei poter votare per non chiudere. Per favore non farlo. Questa è una giusta domanda generale sull'approccio da usare per parlare con un dispositivo non comune. Le specifiche possono venire più tardi. Io, voglio conoscere anche questa risposta di alto livello. – mj2008

risposta

6

Vedere Jan Axelson's USB page per esempi. Ha anche scritto un libro. USB Complete.

Vedere anche Robert Marquardt's HID controller suite for Delphi.

Se si utilizza Delphi 2009 o più recente, seguire il link indicato nella risposta su SO domanda: using-hidcontroller-on-delphi-2010

+1

Mi fa sorridere ogni volta che vedo qualcuno che usa l'eredità di Robert :) ... +1 per indicare il suo componente. – 0xC0000022L

+0

@STATUS_ACCESS_DENIED: +1 !!! – Remko

+0

Grazie, per questo componente, ci sono delle guide su come usarlo. – Grant

3

È possibile utilizzare QueryDosDevice per ottenere il nome completo del dispositivo. Elenca tutte le voci prima di collegare il dispositivo, e dopo, e vedere quale nuova voce appare nell'elenco. (Ho scoperto che la maggior parte dei dispositivi HID appare due volte nell'elenco, non ho ancora trovato il motivo). Il codice conterrà "USB" "VID" "PID" e un GUID.

È possibile utilizzare questo codice con CreateFile se si esegue il prefisso con "\\? \" E utilizzare questo handle come porta seriale (personalmente preferisco utilizzare THandleStream). Il codice potrebbe essere il seguente:

var 
    h:THandle; 
begin 
    h:=CreateFile(
    PChar('\\?\'+MyPortName), 
    GENERIC_WRITE or GENERIC_READ,FILE_SHARE_WRITE or FILE_SHARE_READ, 
    nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); 
    if h=INVALID_HANDLE_VALUE then RaiseLastOSError; 
    MyPort:=THandleStream.Create(h); 
    SetCommTimeouts(h,MyFCommTimeouts); 
Problemi correlati