PDA

Visualizza la versione completa : [C || C++ @ Windows] Aprire porta USB per trasmettere segnali


alde90
11-11-2009, 19:01
Salve a tutti!!

Poichè vengo dal mondo Java, non conosco moltissimo quello che riguarda interazione tra periferiche e sistema operativo. Quindi avrei bisogno di una spinta nella giusta direzione.

Ho bisogno di aprire una porta (USB? seriale?) per scrivere dei bit ad una frequenza di 250 kHz. So cha sarebbe semplice usare la seriale, ma con il discorso che purtroppo sul mio pc non ne ho nemmeno una, mi devo "accontentare" delle USB.

Quindi vorrei chiedervi una domanda: è possibile semplicemente "aprire" una porta USB (per il momento non mi importa di rilevare automaticamente una libera o casini vari) e scrivere valori a una certa frequenza come si poteva fare con la vecchia seriale? Perchè avevo visto la funzione DeviceDosName(), ma resta sempre il fatto se posso aprirla come stream.

Al momento ho questo codice che mi fa la lista di tutte le periferiche connesse al pc (credo :D ):

#include <iostream>
#include <windows.h>
#include <string>

using namespace std;

int DoQueryDosDevice(LPCTSTR name)
{
LPTSTR devices = NULL;
DWORD len = 1024;

devices = (LPTSTR)malloc(len * sizeof(TCHAR));
if (devices == NULL)
{
/* insufficient space */
return FALSE;
} /* insufficient space */

while (TRUE)
{
/* read devices */

DWORD result = QueryDosDevice(name, devices, len);
if (result == 0)
{
/* failed */
DWORD err = GetLastError();
if (ERROR_INSUFFICIENT_BUFFER == err)
{
/* realloc and retry */
len *= 2;
devices = (LPTSTR)realloc(devices, len * sizeof(TCHAR));
continue;
} /* realloc and retry */
else
{
/* serious error */
free(devices);
return FALSE;
} /* serious error */
} /* failed */
break;
} /* read devices */


LPTSTR pos = devices;
/************************************************** *****************************
From the documentation:

If lpDeviceName is non-NULL, the function retrieves information about
the particular MS-DOS device specified by lpDeviceName. The first
null-terminated string stored into the buffer is the current mapping for
the device. The other null-terminated strings represent undeleted prior
mappings for the device.
************************************************** *****************************/

/* show all */
while (strlen(pos) != 0)
{
/* scan each */
if (strstr(pos, "USB") != NULL)
cout << pos << endl;
pos += strlen(pos) + 1;
} /* scan each */

free(devices);
return TRUE;
}

int main(int argc, char * argv[])
{
DoQueryDosDevice(NULL);

return 0;
}

grazie in anticipo per le risposte :D :D :ciauz:

oregon
11-11-2009, 19:10
Non puoi "aprire" la USB come se fosse una porta qualsiasi. Il dialogo va gestito tramite un driver fatto specificamente per il device collegato.

Potresti usare la seriale (o un convertitore USB-Seriale, che espone una porta COM virtuale) ma non arriverai a quella frequenza di invio dati che hai indicato ...

E poi, come mai indichi una "frequenza" e non una "velocità" ? Che tipo di "segnali" devi trasmettere? Non è che stai sbagliando qualcosa?

tokki
11-11-2009, 19:34
Ciao,
no, direi che non è possibile utilizzare la porta USB come la seriale... dovresti scrivere un driver apposito (o magari qualcuno l'ha fatto... prova a guardare in giro per google...).

Altrimenti potresti comprarti uno di quei "box" che, collegandoli via usb, offrono anche una porta seriale (registrata ovviamente nel sistema operativo come seriale "vera") e vedere se così riesci.

Ciao.





-----------------------------------
Finanziamenti Aziende (http://www.artemisiasrl.it/finanziamenti-aziende.php)

alde90
11-11-2009, 19:47
Grazie delle risposte :D

Allora, sto cercando (cosa un po' ardua, ma vediamo se funziona) di creare un'applicazione che gestisca il protocollo DMX, che gestisce l'illuminazione di un palco. Questo protocollo lavora a 250 kHz, quindi ho bisogno di usare quella frequenza per trasmettere quei segnali al dispositivo.

Sennò stavo anche pensando, nella peggiore delle ipotesi, di usare la scheda audio come output dell'applicazione, solo che non ho trovato uno straccio di codice che mi funzionava.

Ergo, io ho bisogno di una cosa che mi vada a 250 kHz per scrivere i miei segnali sull'uscita. C'è qualche modo per poterlo fare? (scheda audio, alimentatore, navicella aliena, non so più cosa pensare :( )

tokki
11-11-2009, 19:58
mmmm... io prima farei un tentativo con un adattatore usb->seriale, si trovano a circa 10 euro sul web :fighet:





------------------------------------
Finanziamenti Imprese Parma (http://www.artemisiasrl.it/finanziamenti-imprese-parma.php)

oregon
11-11-2009, 22:52
Per il protocollo DMX devi usare una interfaccia

RS485

alla velocità di 250 Kbaud e un cavo compatibile DMX.

Se usi una RS232 che è la normale seriale di un PC (e non una RS485), rischi di danneggiare i device DMX collegati.

alde90
12-11-2009, 14:36
Quindi devo usare quello standard...va bene se uso un convertitore? Girando per la rete ho trovato questo (http://www.vincenzov.net/progetti/rs485hw.htm) su internet, che permette di convertire da RS232 a RS485, va bene questo?

O è necessario usare una porta USB -> RS485 (o casomai una PCI)?


@tokki: visto il costo delle centraline, mi fido della parola di Oregon, non voglio far danni visto che le apparecchiature non sono mie :)

alde90
12-11-2009, 14:49
PS: Ho trovato questi

http://cgi.ebay.it/USB-2-0-to-RS485-Converter-Adapter-Serial_W0QQitemZ170371902587QQcmdZViewItemQQptZCav i_Prolunghe_Convertitori?hash=item27aaf4ec7b
http://www.acroname.com/robotics/parts/R305-USB-RS485.html
http://www.byterunner.com/byterunner/category=USB+to+RS-232,+RS-422,+RS-485+Serial+Adapters+(Single+Port)

E quindi in teoria posso tranquillamente aprirli come fosse una seriale normale giusto? Solo che riesco a lavorare anche a 250 kHz?

Grazie per le risposte, e scusate lo stressamento :D :D

oregon
12-11-2009, 14:58
Originariamente inviato da alde90
PS: Ho trovato questi
...
E quindi in teoria posso tranquillamente aprirli come fosse una seriale normale giusto? Solo che riesco a lavorare anche a 250 kHz?

Ovviamente devi avere il device driver da installare. Per questo escluderei quello su ebay ...

Gli altri convertitori dovrebbero andare dal punto di vista hardware, ma attenzione ... non so se dal punto di vista software potrai fare quello che chiedi senza un device driver apposito.

alde90
12-11-2009, 15:13
Mi spieghi meglio cosa intendi? A quanto dicono, loro suppliscono un driver che fa vedere questo adattatore come una porta seriale normale, quindi penso si possa usare i comandi Windows per aprirla e scriverci sopra, compreso impostare il baud rate o no???

Scusa per l'incessante sfilza di domande, ma sono cose che si fanno fatica a trovare da soli :)

Loading