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.
La porta è aperta da un'altra applicazione? Forse è in attesa che venga rilasciato un mutex o un lock. –
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
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? –