Tôi có một ứng dụng Qt (Qt 4.8.1) đang thực hiện một số tác vụ cổng nối tiếp Windows. Tôi thấy rằng thỉnh thoảng cuộc gọi CreateFileA mà tôi làm để mở cổng nối tiếp mất tới 30 giây để hoàn tất! Rõ ràng tôi đang làm một cái gì đó để kích hoạt hành vi kỳ lạ này, và tôi muốn biết tôi có thể làm gì để gây ra điều này.Điều gì có thể gây ra các cuộc gọi CreateFile trên một cổng nối tiếp cực kỳ chậm?
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 là HANDLE và portDevice là chuỗi std :: và chứa "COM5".
Cuộc gọi này được kích hoạt bằng cách nhấn nút trong chuỗi chính của ứng dụng của tôi. Vào thời điểm nó xảy ra ứng dụng có nhiều nhất một chủ đề khác, nhưng những chủ đề (nếu có) là nhàn rỗi.
Điều quan trọng duy nhất xảy ra trong hệ thống là máy ảo chạy Linux, nhưng hệ thống là lõi tứ và 3 lõi gần như không hoạt động như bạn thấy trên hộp Windows, chỉ có một thao tác với VM.
Các cổng nối tiếp nằm trên hộp nối tiếp USB 8 cổng, điều đó có liên quan không?
Điều này có liên quan đến IO bị chồng chéo theo một cách nào đó không?
Đáp lại nhận xét:
Cảng không mở cửa bởi ứng dụng khác. Cổng trước đó đã được mở bằng một lời gọi trước đó của ứng dụng này, đã được đóng lại đúng cách và cổng đóng với 'CloseHandle'.
Tôi không thể xác định bất kỳ mối tương quan nào giữa việc mất 30 giây và không - đôi khi tôi khởi động ứng dụng, nhấp vào nút và chúng tôi đang đi đến các cuộc đua, đôi khi mất đến 30 giây.
Máy ảo đang chặn một số thiết bị USB khác trên cùng một hộp nối tiếp.
Khác với hộp nối tiếp (với máy ảo bỏ phiếu 4 cổng tìm thiết bị), xe buýt USB đã được tải xuống.
Tôi chưa thấy hành vi trong các ứng dụng khác. Tôi sẽ cố gắng chuyển sang một cổng tích hợp (COM1 trên bo mạch chủ) để xem có hiệu ứng nào không.
Một ý nghĩ chỉ xảy ra với tôi: liệu hình thức cổng địa chỉ có liên quan gì đến nó không? Các ứng dụng tương tự khác tôi làm việc trên sử dụng thư viện qestserialport, mở các cổng bằng cách sử dụng ký hiệu '\\. \ COM #'. Có cách nào mà ký hiệu được sử dụng có thể ảnh hưởng đến thời gian không?
Thiết bị nối tiếp USB nói 'VScom' trên thiết bị và bình thường nó mở ra ngay lập tức (< 10 mili giây cho cuộc gọi CreateFile). Nó chỉ là một vấn đề thường xuyên, nơi mọi thứ được nhồi lên, và tôi đã có các chương trình khác mà KHÔNG BAO GIỜ dường như thể hiện hành vi này.
Thiết bị tôi đang nói đến là một màn hình y tế sử dụng giao thức IEEE 11073. Dù sao, tôi có kết nối với các thiết bị làm việc tốt, nó chỉ mở cổng nối tiếp đó là vấn đề. Trạng thái của các dòng điều khiển nối tiếp vào thời gian mở có liên quan gì với điều này không? Thiết bị ở đầu bên kia đang bỏ phiếu là các cổng tìm kiếm những thứ khác nhau để nói chuyện, vì vậy tôi không biết các dòng nối tiếp trông như thế nào vào đúng thời điểm mọi thứ xảy ra sai.
Cổng có được ứng dụng khác mở không? Có lẽ nó đang chờ đợi một mutex hoặc khóa sẽ được phát hành. –
Lệnh gọi 'CreateFileA()' hiển thị OK. Trong những trường hợp nào mất 30s? Ngay sau khi cắm thiết bị USB của bạn vào? Bạn đã cố gắng để có được hành vi này trong các ứng dụng khác? Bạn đã cố gắng để có được hành vi này với một cổng COM? Bus USB của bạn bận đến mức nào? Bạn có máy ảo chặn thiết bị USB không? – tinman
Cổng nối tiếp mở khá nhanh trong kinh nghiệm của tôi, ngay cả với nhiều cổng USB COM được đính kèm. Bạn đang sử dụng cổng nối tiếp USB nào? –