Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    157

    [C || C++ @ Windows] Aprire porta USB per trasmettere segnali

    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 ):
    codice:
    #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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    119
    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    157
    Grazie delle risposte

    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 )

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    119
    mmmm... io prima farei un tentativo con un adattatore usb->seriale, si trovano a circa 10 euro sul web





    ------------------------------------
    Finanziamenti Imprese Parma

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    157
    Quindi devo usare quello standard...va bene se uso un convertitore? Girando per la rete ho trovato questo 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

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    157
    PS: Ho trovato questi

    http://cgi.ebay.it/USB-2-0-to-RS485-...item27aaf4ec7b
    http://www.acroname.com/robotics/par...USB-RS485.html
    http://www.byterunner.com/byterunner...+(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

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    157
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.