Domanda

Segui su da - GPS intermedi problemi di driver

È possibile che questo non è stato risposto con successo e sento di avere nuove informazioni sulla questione di andare per una nuova domanda.

Il problema che sto affrontando è la velocità di cui i dati vengono consegnati dal driver GPS intermedio.

Ho usato con successo Pocket Putty per leggere le porte seriali e visualizzare le informazioni esatte stato esposto.

COM 1 - GPS Intermedio driver

COM 6 - Porta seriale per PC (I dati di input manuale)

COM. 8 - porta seriale virtuale per l'hardware GPS

Durante la lettura COM 8, posso vedere circa 18 stringhe NMEA appaiono ogni ~ 3 secondi, questo è veloce come siamo in grado di spingerlo attraverso la connessione USB limitata. E sembra rapidamente sul display. Durante la lettura COM 6 (dati di invio da PC manualmente), viene visualizzato altrettanto rapido. Quindi non v'è alcun problema con i dati stati disponibili.

Inserire nel driver GPS intermedio. Quando il driver GPS intermedio è impostata su COM1 (Software) e COM6 (hardware). I dati inseriti su COM6 viene visualizzato su COM1 altrettanto velocemente come era senza il driver GPS intermedio. I dati sono inalterate, quindi se io mando "JON" su COM6, apparirà su COM1, anche se i suoi dati NMEA non validi, che va bene.

Il problema è con COM8. Quando il driver GPS intermedio è impostata su COM1 (Software) e COM8 (hardware). I dati che mostra in PocketPutty su COM1 è molto lento. L'output sullo schermo è di circa 5 caratteri al secondo, i dati sono validi, ma è appena stato consegnato molto lentamente. Questo per me indica un problema nella realizzazione della porta seriale virtuale, come se il driver GPS intermedio non è la lettura di tutti i dati solo un carattere alla volta, dato che ho isolato il problema alla mia porta seriale virtuale.

Qualcuno può fornire un chiaro esempio di un'implementazione porta seriale virtuale, come im non sicuro di quello che ho potuto cambiare per migliorare questo, dato COM8 lavora direttamente con il software GPS e l'applicazione PocketPutty, che indica i dati sono disponibili, in corso la lettura, ed è corretto.

È stato utile?

Soluzione

Dopo aver ottenuto il sostegno del produttore del dispositivo che esegue una build di debug, la causa del problema era applicazioni client stavano facendo per molte chiamate di lettura. La porta seriale di loro in grado di gestire da solo, ma attraverso il driver GPS intermedia il numero di chiamate erano troppo alti e il sovraccarico è stato paralizzando la comunicazione, questo era giù per blocchi mutex e problemi di threading generale.

Le applicazioni client bisogno di leggere 960 byte di dati per lettura al driver GPS intermedio per loro di funzionare bene. Questa non è una soluzione ideale quindi è stata trovata un'altra soluzione.

La risoluzione era di aggiungere in un WaitForSingleObject (IsThereEnoughGPSDATAEvent, COMTotalTimeout) nel metodo di lettura, in modo che tutte le letture potrebbero ottenere solo i dati se ci fosse una sufficiente quantità di dati disponibili. Originariamente ho chiesto 960 di essere disponibili nel buffer, ma ho impostato verso il basso per soli 10 byte e funziona ancora.

Esempio di codice

DWORD COM_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count )
{
    if(gpsThreadEvents[GPS_THREAD_EVENT_DATA_AVAILABLE] != NULL)
    {
        if(WaitForSingleObject(gpsThreadEvents[GPS_THREAD_EVENT_DATA_AVAILABLE], GPSTimeouts.ReadTotalTimeoutConstant) != WAIT_OBJECT_0)
        {
            return 0;
        }
    }

    //read code goes in here

    return dataOut;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top