2012-05-11 43 views
5

Tôi gặp vấn đề lạ với một số mã mà tôi thừa kế từ một lập trình viên khác đã rời công ty và cần một số hướng dẫn về cách thậm chí bắt đầu giải quyết nó.Cổng nối tiếp USB ảo trùng lặp được tạo - điều gì có thể gây ra điều này?

Vấn đề là - trên cơ sở bán thường xuyên, chúng tôi nhận thấy rằng các cổng kết nối ảo ảo USB trùng lặp đang được tạo. Ví dụ, trên PC của tôi, khi tôi xem các Cổng trong Trình quản lý Thiết bị và chọn "Xem Thiết bị Ẩn", tôi có hai mục nhập cho cùng một thiết bị - một trên COM6 và một trên COM8.

Thật không may, chúng tôi không thể tạo lại sự cố một cách đáng tin cậy. Chúng tôi nghi ngờ nó có thể xảy ra khi một người nào đó nhanh chóng ngắt kết nối và kết nối lại cáp USB khi phần mềm của chúng tôi đang chạy, nhưng điều đó cần phải được xác nhận.

Theo như tôi có thể biết, mã được viết giả định rằng sẽ không có ai rút phích cắm cáp. Tôi không thấy logic nào phát hiện tình trạng này sau khi SW bắt đầu. Và nó không thành công khi bạn cắm lại cáp - âm thầm tạo ra đọc và ghi lỗi ngay cả sau khi cáp được cắm trở lại in Bạn phải khởi động lại chương trình trước khi nó sẽ hoạt động trở lại.

Tôi có rất ít trải nghiệm nối tiếp và USB, đồng thời có chút mất mát về cách bắt đầu khắc phục sự cố này.

Có ai có thể đề xuất tại sao điều này có thể xảy ra không?


Misc. Cụ thể, trong trường hợp họ có thể có liên quan:

mã nối tiếp

USB là trong C++ DLL/trình điều khiển

VS2008

FTDIBUS USB Serial

Windows XP và Win7

Screen shot của mục nhập Registry trùng lặp (lưu ý giá trị của khóa đã chọn!)

Screen shot of Registry entries

+3

Có thể liên quan đến điều này? http://blogs.msdn.com/b/oldnewthing/archive/2004/11/10/255047.aspx – jcoder

+0

Có, JohnB là chính xác. Các thiết bị không có số sê-ri được xác định bởi vị trí của chúng trên xe buýt USB. Khi điều này thay đổi, nó được xem như một thiết bị khác. – janm

+0

FTDI khá nổi tiếng với các trình điều khiển crappy của nó. Liên hệ với họ để được hỗ trợ. –

Trả lời

2

Như đã giải thích trên blog của Raymond Chen, Cựu New Thing, ở đây, và bằng cách bình luận ở trên:

Để tóm tắt:

  • thiết bị được cắm và cắm lại được theo dõi để chúng không được coi là thiết bị mới mỗi lần.
  • Thông thường, điều này sử dụng số sê-ri của thiết bị để phát hiện xem thiết bị có giống nhau hay không.
  • Tuy nhiên không phải mọi thiết bị đều có số sê-ri. Các thiết bị này chỉ được coi là cùng một thiết bị nếu chúng có cùng ID nhà cung cấp và ID sản phẩm và được cắm vào cùng một cổng. Nếu chúng được cắm vào một cổng khác, chúng được coi là một thiết bị khác.
  • Một số nhà sản xuất không hiểu từ "Nối tiếp" trong "Số sê-ri" và cung cấp cho tất cả các thiết bị cùng một số thay vì cho họ số serially ... Để đối phó với điều này, có một cài đặt đăng ký có thể được sử dụng để ép buộc các thiết bị được xử lý như thể chúng không có số sê-ri.

Do đó, nếu thiết bị không có số sê-ri hoặc được gắn cờ trong Windows Registry khi có số sê-ri trùng lặp được cắm vào cổng nối tiếp chưa được cắm vào trước, nó sẽ được coi là mới thiết bị thay vì kết nối lại thiết bị cũ. Điều này sẽ dẫn đến các thiết bị "Ghost" khi bạn mô tả.

Một số thiết bị FTDI được đặc biệt gọi là có vấn đề này bởi nhà sản xuất:

+0

BTW rằng FTDI technote là vấn đề ngược lại - khi sản xuất hoặc kiểm tra thiết bị có hàng nghìn phần cứng giống nhau (khác với số sê-ri) được cắm tuần tự, Windows gán một số cổng COM mới cho mỗi và sớm hết. Các nhà sản xuất Naive "khắc phục" điều này bằng cách chia sẻ số sê-ri, tạo ra vấn đề được thảo luận trong câu hỏi này. Rằng "IgnoreHardwareSerialNumber" hack là một cách để ngăn chặn các thiết bị sản xuất và thử nghiệm từ chạy ra khỏi cổng COM, trong khi vẫn cung cấp số serial duy nhất trên các thiết bị, mang lại hành vi đúng cho người dùng cuối. –

Các vấn đề liên quan