Mam aplikację Qt (Qt 4.8.1), która wykonuje niektóre zadania portu szeregowego Windows. Odkrywam, że czasami wywołanie CreateFileA, które wykonuję, aby otworzyć port szeregowy, trwa do 30 sekund! Oczywiście robię coś, by wywołać to dziwne zachowanie, i chcę wiedzieć, co to jest, co może zrobić, by to spowodować.Co może powodować, że wywołania CreateFile na porcie szeregowym będą wyjątkowo powolne?
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 jest UCHWYTEM, a portDevice jest std :: string i zawiera "COM5".
To połączenie jest wywoływane przez naciśnięcie przycisku w głównym wątku mojej aplikacji. W tym czasie aplikacja ma najwyżej jeden inny wątek, ale te wątki (jeśli są) są bezczynne.
Jedyną ważną rzeczą, która dzieje się w systemie, jest maszyna wirtualna z systemem Linux, ale system jest czterordzeniowy, a 3 z rdzeni są prawie bezczynne, jak widać na pudełku z systemem Windows, a tylko jeden robi cokolwiek z maszyną wirtualną.
Porty szeregowe znajdują się na 8-portowym porcie szeregowym USB, czy może to być powiązane?
Czy jest to związane z nakładającymi się zamówieniami internetowymi w jakiś sposób?
W odpowiedzi na komentarze:
port nie jest otwarty przez inną aplikację. Port był poprzednio otwarty przez poprzednią inwokację tej aplikacji, która została poprawnie zamknięta, a port zamknięty z "CloseHandle".
Nie udało mi się ustalić żadnych korelacji pomiędzy 30 sekundami, a nie - czasami uruchamiam aplikację, klikam przycisk i ruszamy na wyścigi, czasami zajmuje to do 30 sekund.
Maszyna wirtualna przechwytuje inne urządzenia USB w tym samym pudełku szeregowym.
Oprócz portu szeregowego (z 4 portami pollingu VM w poszukiwaniu urządzeń), magistrala USB jest rozładowywana.
Nie widziałem zachowania w innych aplikacjach. Spróbuję przełączyć się na wbudowany port (COM1 na płycie głównej), aby sprawdzić, czy to ma jakiś wpływ.
Przyszła mi do głowy pewna myśl: czy forma adresowania portu może mieć z tym coś wspólnego? Inne podobne aplikacje, nad którymi pracuję, korzystają z biblioteki qestserialport, która otwiera porty przy użyciu notacji "\\. \ COM #". Czy istnieje sposób, w jaki zastosowana notacja może wpłynąć na czas?
Urządzenie szeregowe USB mówi "VScom" na nim i zwykle otwiera się natychmiast (< 10 milisekund dla wywołania CreateFile). To tylko sporadyczny problem, w którym rzeczy się pakują, i mam inne programy, które NIGDY nie wydają się wykazywać tego zachowania.
Urządzenie, z którym rozmawiam, to monitor medyczny wykorzystujący protokół IEEE 11073. W każdym razie, mam połączenie z urządzeniem działającym dobrze, to TYLKO otwarty port szeregowy jest problematyczny. Czy stan linii sterowania szeregowego w czasie otwartym może mieć coś wspólnego z tym? Urządzenie na drugim końcu jest odpytywaniem portów, szukając różnych rzeczy do rozmowy, więc nie mam pojęcia, jak wyglądają linie szeregowe w momencie, gdy coś pójdzie nie tak.
Czy port jest otwarty przez inną aplikację? Może czeka na zwolnienie muteksu lub blokady. –
Wywołanie funkcji "CreateFileA()" wygląda dobrze. W jakich okolicznościach zajmuje to 30 sekund? Natychmiast po podłączeniu urządzenia USB? Czy próbowałeś uzyskać to zachowanie w innych aplikacjach? Czy próbowałeś uzyskać to zachowanie z innym portem COM? Jak bardzo zajęta jest twoja magistrala USB? Czy masz urządzenia przechwytujące VM USB? – tinman
Szeregowe porty otwierają się dość szybko w moim odczuciu, nawet przy podłączonych wielu portach COM USB. Jakiej marki używasz portów szeregowych USB, z których korzystasz? –