2012-07-17 13 views
11

Ho un'app Qt (Qt 4.8.1) che sta eseguendo alcune attività della porta seriale di Windows. Trovo che occasionalmente la chiamata a CreateFileA che faccio per aprire la porta seriale richieda fino a 30 secondi per essere completata! Ovviamente sto facendo qualcosa per innescare questo comportamento strano, e voglio sapere che cosa è che potrebbe fare per causare questo.Cosa può causare che le chiamate CreateFile su una porta seriale siano estremamente lente?

m_portHand = CreateFileA(portDevice.c_str(), 
          GENERIC_READ | GENERIC_WRITE, 
          0,  // must be opened with exclusive-access 
          NULL, // default security attributes 
          OPEN_EXISTING, // must use OPEN_EXISTING 
          FILE_FLAG_OVERLAPPED,  // overlapped I/O 
          NULL); // hTemplate must be NULL for comm devices 

m_portHand è una maniglia, e portDevice è uno std :: string e contiene "COM5".

Questa chiamata viene attivata da un pulsante nel thread principale della mia app. Al momento, l'app ha al massimo un altro thread, ma quei thread (se presenti) sono inattivi.

L'unica cosa importante nel sistema è una VM che esegue Linux, ma il sistema è un quad-core e 3 dei core sono quasi inutilizzati come si vede su una scatola di Windows, con solo uno che fa qualcosa con la VM.

Le porte seriali sono su una scatola seriale USB a 8 porte, potrebbe essere correlato?

Questo è correlato all'IO sovrapposto in qualche modo?

In risposta ai commenti:

porta non è aperta da un'altra applicazione. Port precedenza era aperto da una precedente chiamata di questa applicazione, che è stato chiuso correttamente, e la porta si chiude con 'CloseHandle'.

Non sono stato in grado di determinare alcuna correlazione tra il completamento di 30 secondi e non - a volte avvio l'app, clic sul pulsante e siamo fuori per le gare, a volte ci vogliono fino a 30 secondi.

La VM sta intercettando altri dispositivi USB sulla stessa scatola seriale.

Oltre alla casella seriale (con il VM che esegue il polling di 4 porte in cerca di dispositivi), il bus USB viene scaricato.

Non ho visto il comportamento in altre app. Proverò a passare a una porta integrata (COM1 sulla scheda madre) per vedere se ha qualche effetto.

Un pensiero mi è appena venuto in mente: può la forma dell'indirizzamento del porto avere qualcosa a che fare con esso? Altre applicazioni simili che lavorano su utilizzare la libreria qestserialport, che apre le porte usando la '\\. \ COM #' notazione. C'è un modo in cui la notazione utilizzata potrebbe influenzare i tempi?

Il dispositivo seriale USB dice "VScom" su di esso e normalmente si apre immediatamente (< 10 millisecondi per la chiamata CreateFile). E 'solo un problema occasionale in cui le cose si farcito, e ho altri programmi che non sembrano presentare questo comportamento.

Il dispositivo con cui sto parlando è un monitor medicale che utilizza il protocollo IEEE 11073. Ad ogni modo, ho la connessione al dispositivo che funziona bene, è SOLO la porta seriale aperta che è problematica. Lo stato delle linee di controllo seriale al tempo aperto potrebbe avere qualcosa a che fare con questo? Il dispositivo all'altra estremità è polling è porte alla ricerca di varie cose con cui parlare, quindi non ho idea di quello che le linee seriali assomigliano nel momento esatto le cose vanno male.

+0

La porta è aperta da un'altra applicazione? Forse è in attesa che venga rilasciato un mutex o un lock. –

+0

La chiamata 'CreateFileA()' mostra come sembra OK. In quali circostanze ci vogliono 30 anni? Subito dopo aver collegato il tuo dispositivo USB? Hai provato a ottenere questo comportamento in altre applicazioni? Hai provato a ottenere questo comportamento con un'altra porta COM? Quanto è occupato il tuo bus USB? Avete la VM che intercetta i dispositivi USB? – tinman

+1

Le porte seriali si aprono abbastanza velocemente in base alla mia esperienza, anche con molte porte COM USB collegate. Che marca sono le porte seriali USB che stai utilizzando? –

risposta

1

OK, il problema è compreso, se non risolto. Stavo giocando con un dispositivo seriale diverso e il problema ha iniziato a manifestarsi ancora più frequentemente.

Il problema sembra essere che quando la VM ha il controllo di alcune porte seriali, i driver diventano intermittentemente lenti per aprire le porte disponibili.

Il programma di test si apre quindi chiude la porta 1000 volte, temporizzando la chiamata aperta. NON imposta i parametri della porta seriale in alcun modo. Prima di eseguire il programma di test, stavo facendo un lavoro effettivo con un dispositivo che utilizza il baud rate 460800.

Quando la VM è in possesso di 4 delle porte, quindi si apre sulle restanti 4 porte a volte (20- 30 volte su 1000 tentativi) per completare i 20-30 secondi. Quando la VM non è in esecuzione, l'apertura avviene rapidamente in tutti i 1000 tentativi. Con la VM in esecuzione, ma senza porte seriali USB in suo possesso, l'apertura è avvenuta rapidamente su tutti i 1000 tentativi.

Poiché la VM è uno strumento di sviluppo, non parte dello scenario di distribuzione previsto, posso convivere con questo problema.

È interessante notare che questo effetto dipende da quale velocità di trasmissione è stata utilizzata l'ultima volta. Prima delle mie richieste iniziali, avevo operato a 9600 baud e meno e non ricordo di aver mai visto il problema. Quando ho posto la domanda per la prima volta, stavo lavorando con un dispositivo che era a 115000 baud e che stava avendo il problema a intermittenza. Con l'ultimo dispositivo a 460800 baud, ho il problema abbastanza spesso da riuscire a scovare il problema. Non ho idea del perché, ma è così.

0

Le linee di controllo seriali che interagiscono con un problema di driver di dispositivo sono una probabile causa.

I segnali di controllo sono collegati correttamente?

In caso contrario, collegare RTS a CTS e collegare CD, DTR e DSR. Su un DB25, questo significa collegare i pin 4 e 5 e collegare i pin 6, 8 e 20. Su un DB9, collegare i pin 7 e 8 e collegare i pin 1, 4 e 6.

Se questo risolve il problema, si dovrebbe cercare le impostazioni del driver per ignorare i segnali di controllo su aperto.

Problemi correlati