2010-06-05 15 views
9

Ho bisogno di un elenco di tutti i dispositivi USB collegati e l'utente deve selezionarne uno per consentire all'applicazione della console di ricevere i dati inviati dal dispositivo USB.Ricezione di dati da un dispositivo USB in C o C++

Posso quindi iniziare a giocare con i dati nel mio programma.

Non voglio usare, solo le funzioni C++ standard della biblioteca, e il programma dovrebbe funzionare in Windows 98.

+0

Non ci sono funzioni standard di C++ per fare ciò. –

+0

Non sono sicuro ... Puoi dirmi come può essere fatto allora. – Midas

+0

perché non vuoi usare le librerie? – OlimilOops

risposta

1

Ecco qualcosa per iniziare:

E per gridare ad alta voce l'aggiornamento ad un sistema operativo che non è da dell'ultimo millennio. Ho sentito che Linux ha un grande supporto per USB.

+1

+1 per l'aggiornamento - Windows 98 è antico. (+1 per la raccomandazione implicita su Linux.) Se la gente aggiornasse, avremmo delle cose interessanti più veloci. – Thanatos

+0

Ho letto molto oggi senza alcun risultato e non mi sento di leggere un intero libro solo sulle specifiche USB. Puoi darmi un esempio di codice di ciò che voglio fare? Può essere molto semplice. – Midas

+0

@Midas: roba di basso livello non è semplice.Io, per esempio, ho passato molto tempo a leggere le specifiche per avere un'idea migliore di come funziona l'USB. Se stai cercando informazioni sulle cose, a volte è meglio leggere i documenti invece di saltare nel codice di esempio. –

3

Come si può scrivere un programma per USB, volendo capirne lo sfondo, pur non volendo leggerlo molto, non volendo utilizzare una libreria, tutto nello stesso tempo? Ad ogni modo. c'è un progetto "libUSB Win32" di Stefan Meyer non in fase di sviluppo al momento, ma scritto in C forse questo potrebbe essere qualcosa per te, ha anche la possibilità di girare sotto versioni di windows antiche;) puoi trovarlo qui :
http://sourceforge.net/apps/trac/libusb-win32/wiki
qualche tempo fa ho scritto questo in VB6 che fa uso di "libusb Win32" non so se può essere utile per voi:
http://www.activevb.de/cgi-bin/upload/download.pl?id=3061

+0

libUSB è basato su codice C++ standard, non è vero? Potrei scrivere da solo, adattato al mio programma. Potrei forse dare un'occhiata alla fonte. – Midas

+0

L'URL sembra essere cambiato. Il tuo non funziona più. Ma con Google ho trovato questo collegamento funzionante: https://sourceforge.net/projects/libusb-win32/ – Scindix

+0

Anche i wiki includono quanto segue: "libusb-win32 è ora in modalità di manutenzione solo in Bug-Fix. Si raccomanda che il nuovo progetto [s] debba migrare all'API libusb-1.0 e utilizzare invece libusb Windows (http://libusb.info). " – Scindix

19

questa è una molto domanda persistente nei forum e nella programmazione di siti Q + A. Mai con un lieto fine. La B in USB significa bus. Questo è un termine nella progettazione dell'hardware del computer per descrivere un'interfaccia elettrica per i dispositivi elettronici per lo scambio di dati. Ha lo stesso identico ruolo, ad esempio, del bus PCI (express) all'interno della macchina. Essendo innanzitutto una specifica elettrica, USB supporta un numero molto elevato di tipi di dispositivi. Qualsiasi cosa da un adattatore di rete wireless, modem, scheda di memoria flash a un teiera più calda. Quasi gli unici tipi di dispositivi che non gestisce bene sono quelli che richiedono una larghezza di banda molto grande, come una scheda video.

Le specifiche USB hanno una specifica di protocollo molto elegante che descrive come i dispositivi possono condividere il bus e come possono scambiare dati. Quella specifica del protocollo tuttavia non descrive affatto il formato dei dati, ma si limita a definire la nozione di essere in grado di consegnare blocchi di byte. Spetta al dispositivo stesso dare un significato a quei byte.

Alla fine della macchina, è necessario il software per interpretare quei byte e fare in modo che la macchina faccia qualcosa di interessante con loro. Ciò richiede un driver di dispositivo. Proprio come la tua scheda video e la tua scheda di interfaccia di rete richiedono un driver di dispositivo. Ovviamente un driver video è molto diverso da un driver NIC. Lo stesso vale per i driver USB, c'è poca comunanza.

Se si desidera scrivere software che tratta dispositivi USB simili, è necessario scriverlo al livello in cui hanno ancora qualcosa in comune. A livello di controller USB, è possibile scrivere un driver di filtro che si inietta nello stack di driver USB e dà un'occhiata ai pacchetti di richiesta I/O tra il controller e il driver di periferica. Simile al, ad esempio, il driver del filtro winpcap che spia il traffico TCP/IP.Non c'è molto di interessante, però, staresti fissando i grumi di byte che passano avanti e indietro. È un problema molto più grande di winpcap, almeno vede i byte volare con il cui significato è documentato da qualche parte in un RFC. Questo non è il caso per l'USB, la società che produce il dispositivo USB è anche in genere il fornitore di driver di periferica. Mantengono il formato interno non documentato.

La scrittura dei driver di filtro richiede competenze piuttosto avanzate, ci sono molti punti deboli. Come mandare in crash il sistema operativo quando commetti un semplice errore. Ultimamente, anche il modello di driver di Windows ha subito un notevole cambiamento, i driver USB sono stati spostati in ring 3 (modalità utente) per mantenere il sistema operativo stabile.

Per iniziare, scaricare Windows WDK (noto come "DDK") e leggere i libri di Walter Oney. Preferibilmente tutti loro.

+0

Grazie, ma in realtà non voglio fare un autista. È un problema? E sei sicuro che il libro sia buono per me? Vivo in Belgio e non posso comprarlo qui. – Midas

+1

Sì, sarebbe un problema. Amazon.com consegna in Belgio afaik. Probabilmente non vuoi spendere troppi soldi, lieto fine e tutto il resto. So che hai buone biblioteche disponibili nelle città universitarie. –

+0

+1 risposta molto buona – OlimilOops

0

Ho semplicemente bisogno di un elenco di tutti i dispositivi USB collegati e l'utente deve selezionarne uno per consentire all'applicazione della console di ricevere i dati inviati dal dispositivo USB.

Ottenere l'elenco non è un grosso problema, sta ricevendo i dati.

So che non si desidera scrivere un driver, ma questo è ciò che fanno i driver: ricevere dati da un dispositivo.

0

Per aggiungere ad alcune buone risposte ...

programmazione USB non è 'piccolezze'

In primo luogo si deve imparare come funzionano i sistemi operativi e perché hanno i driver.

A meno che non si desidera programmare una porta RS-232 in DOS, non è possibile comunicare direttamente con le porte USB, è necessario comunicare con il sistema operativo e il driver per il dispositivo che si interessa.

0

Il consiglio che stai ricevendo qui è sul punto; L'USB non è facile, credimi ... Sto lavorando a un progetto USB ma dal back-end. Mi sembra che tu abbia bisogno di guardare anche il back-end, è lì che non hai davvero a che fare con le librerie e tutto il resto, ma non sarai in grado di aggirare la lettura qualunque cosa tu faccia.

Non scoraggiarti ancora, ma hai bisogno di bagnarti i piedi prima di saltare dentro e affogare. USB2.0 e USB3.0 sono piuttosto asciutti, ma ho trovato OSDev Wiki e usbmadesimple come utili trampolini di lancio.

Se è ancora necessario essere nel PC, quindi si dovrebbe prendere in considerazione il tentativo di ottenere una sospensione di qualche codice USB open source per forse uno sniffer USB se è possibile trovarlo.

+0

Si prega di non aggiungere firme ai tuoi messaggi. (Come nella sezione "Non utilizzare firme, tagline o saluti." Di [il contenuto della guida] (http://stackoverflow.com/help/behavior).) –

Problemi correlati