Tại sao các cổng USB đôi khi được gọi là cổng nối tiếp và được gọi là COM?


13

Theo như sự hiểu biết của tôi về các cổng máy tính,

  1. Cổng nối tiếp là phích cắm 9 chân như cổng được hiển thị ở đây và nó còn được gọi là cổng COM.
  2. Cổng USB là một tiêu chuẩn khác với cổng nối tiếp.

Tại sao sau đó tôi thường thấy các cổng USB được gọi là "cổng nối tiếp" và, ví dụ trong Arduino IDE, các cổng USB được xác định bởi tiền tố COM? Ngoài ra tại sao một cổng COM ảo đôi khi cần thiết nếu không có bất kỳ cổng nối tiếp nào liên quan? (Ví dụ: Bộ điều hợp Prologix GPIB-USB.)

Việc sử dụng cùng tên này để mô tả hai điều khác nhau tôi nghĩ có thể hơi khó hiểu.

Ảnh chụp màn hình từ Arduino IDE, lệnh menu Công cụ → Cổng nối tiếp → COM14 hiển thị


2
USB là comms nối tiếp.

3
Có lẽ bởi vì bạn có một thiết bị USB hoạt động như một cổng nối tiếp ? Một cái gì đó có một trong các chip USB nối tiếp FTDI (FT 232) hoặc Prolific (PL2303), hoặc có lẽ là MCU với phần mềm thực hiện giống nhau? Việc chúng được hiển thị trong cùng một không gian tên với các cổng nối tiếp được cố định trên bo mạch chủ (hoặc trong thẻ PCI (e)) làm cho giao diện trở nên đơn giản hơn với phần mềm: không cần biết cổng được triển khai thực tế như thế nào, chỉ là nó quacks như một cổng nối tiếp.
ilkkachu

4
Nó có thể giúp nhận ra rằng trong những ngày đầu của PC IBM và nhiều người tiền nhiệm của nó, một "cổng nối tiếp" thường không được đặt trên bo mạch chủ, mà là một giao diện trên thẻ bus mở rộng. Ngày nay, khái niệm đó vẫn còn tương đối đúng ở chỗ vẫn còn một bộ chuyển đổi giao diện nối tiếp riêng biệt - chỉ có "bus mở rộng" kết nối lại với máy tính bây giờ là USB, thay vì phần mở rộng kết nối ISA cũ của bus cục bộ của bộ xử lý.
Chris Stratton

14
Phổ xe buýt?
hobbs

4
@hobbs, đúng là Universal serial Bus. Một chiếc xe buýt. Rất khác biệt với một cổng nối tiếp, phải không? Ngay cả khi không có văn bản in đậm ngớ ngẩn.

Câu trả lời:


27

Đây không phải là cổng USB được gọi là cổng nối tiếp. Trong ví dụ của bạn, Arduino có một thiết bị nối tiếp USB (ở dạng vi điều khiển thứ hai hoặc chip FTDI). Điều này sẽ sử dụng USB để giao tiếp với máy tính và tạo thành một cổng nối tiếp thực tế với thế giới bên ngoài - tương tự như khóa USB Wi-Fi hoặc bộ điều hợp USB LAN, bộ điều hợp USB SATA, v.v.

Điều quan trọng là trong nhiều trường hợp, cổng nối tiếp không có sẵn trực tiếp cho người dùng, vì nó là "dây cứng" trong thiết bị (trong trường hợp này, được kết nối trực tiếp với vi điều khiển bạn đang lập trình).

Theo lý thuyết nghiêm ngặt, bất kỳ cổng nào sử dụng giao tiếp nối tiếp (hầu hết mọi xe buýt hiện đại - bao gồm cả USB, viết tắt của "Universal serial Bus", nếu bộ nhớ của tôi phục vụ cho tôi) là "cổng nối tiếp". Tuy nhiên, trong hầu hết các trường hợp, khi mọi người nhắc đến "cổng nối tiếp", họ thực sự đề cập đến một cổng tuân thủ RS-232.


10
Bất cứ khi nào ai đó nhắc đến "cổng nối tiếp", họ gần như chắc chắn có nghĩa là RS-232 được kết nối thông qua đầu nối DE-9M. Nếu mọi người có nghĩa là USB, họ có xu hướng nói USB. Tương tự cho các giao thức nối tiếp khác như RS-485 hoặc GPIB hoặc các hương vị khác nhau của Ethernet.

5
@Felthry: "nối tiếp" rất thường có nghĩa là tín hiệu nối tiếp không đồng bộ ("A" trong "UART") mà RS-232 cũng sử dụng, nhưng ở các mức điện áp logic tiêu chuẩn, không phải RS-232. Và có thể hoặc không bao gồm các chân bắt tay dẫn đến chân 9 (hoặc 25 chân, là bản gốc cho RS-232).
Ben Voigt

2
Thật. Tôi cho rằng đó là một lớp lạm dụng thuật ngữ khác, sử dụng 'RS-232' có nghĩa là một biến thể điện áp thấp của giao thức. Tôi cũng đã xem xét đề cập đến đầu nối DB-25M, nhưng nó không thực sự phù hợp ở đây.

7
@Felthry, xin lỗi, nhưng "bất cứ khi nào ai đó nhắc đến" cổng nối tiếp ", họ gần như chắc chắn có nghĩa là RS-232 được kết nối qua đầu nối DE-9M" là một chế độ xem trung tâm của PC đã lỗi thời. Và PC đã không được tạo ra với đầu nối 9 chân ở mặt sau ít nhất một thập kỷ. Dân số đông đảo người dùng của họ không bao giờ chạm vào họ khi họ còn. Các sản phẩm, thiết bị và PCB ở khắp mọi nơi sử dụng các cổng nối tiếp, thông qua nhiều đầu nối chuyên dụng và ở cấp LVTTL hoặc RS-232C. Và các kỹ sư trên trang web này sẽ trải nghiệm các cổng nối tiếp nhiều cách hơn so với một tiêu chuẩn PC cũ. Thế giới đa dạng hơn thế, tôi sợ.

4
@TonyM Có lẽ tôi đã ở xung quanh quá nhiều thiết bị trường học cũ. Tuy nhiên, tôi sẽ lưu ý rằng các máy tính vẫn thường được sản xuất với các đầu nối DE9 trên chúng - chỉ không dành cho thị trường tiêu dùng. Chúng có mặt khắp nơi trong ngành công nghiệp và nghiên cứu, bởi vì bạn có thể sẽ cần phải giao tiếp với các hệ thống được sản xuất từ ​​những năm 90 trở về trước, khi chúng phổ biến. Mọi người không nâng cấp thiết bị công nghiệp của họ như bạn muốn nâng cấp điện thoại của bạn! Như tôi đã nói, đó là một sự lạm dụng thuật ngữ. Có lẽ "gần như chắc chắn" là một từ ngữ quá mạnh, nhưng nó là một cách sử dụng rất phổ biến.

18

Thật khó hiểu vì Windows COM: các cổng đến từ một hệ thống đặt tên được xác định lại trong MS-DOS (sinh năm 1980). Điều này đã được sao chép khá nhiều từ CP / M (sinh năm 1974) với một số ý tưởng được lấy từ Unix. Họ đã không lường trước việc bổ sung một chiếc xe buýt 'vận chuyển' trung gian như USB.

Khá nhiều thứ trong Windows là những người sống sót từ quá trình tiến hóa CP / M-> MS-DOS, chẳng hạn như ổ đĩa có tên chữ cái, phần mở rộng tên tệp 3 chữ cái, tệp .EXE và .COM và giao diện lệnh Command Prompt.

Một tên khác là tên thiết bị: thường là ba chữ cái, luôn luôn kết thúc bằng dấu hai chấm. COM: là một 'cổng giao tiếp' nối tiếp, LPT: 'máy in đường truyền' (thường treo trên cổng Centrics), NUL: bỏ bất cứ thứ gì được gửi tới nó, CON: là 'bàn điều khiển' (bàn phím và màn hình). Một số mà bạn có thể có một số được đánh số để phân biệt giữa chúng. COM: các cổng làm, cũng như các cổng LPT: trở thành COM1: và LPT1: vân vân.

Cổng COM: là một 'điểm cuối': điểm cuối của liên kết truyền thông theo quan điểm của PC Windows. Giống như nhiều thứ trong điện toán, cây cầu ở đó bị bỏ qua và đó là thành phần xa nhất mà bạn nghĩ đến, không phải USB. Điều này cũng đúng với bàn phím PC (được liên kết dưới dạng CPU-PCIe-USB-kbd) hoặc ổ đĩa mạng (được liên kết dưới dạng CPU-PCIe-LAN-LAN-PCIe-CPU-PCIe-SATA hoặc tương tự).

USB cũng sử dụng ý tưởng về các điểm cuối. Bộ điều khiển USB có thể kết nối một PC chủ với tất cả các loại phần cứng và cung cấp chúng cho nó dưới dạng tài nguyên. Vì vậy, khi bạn thấy phần cứng được gắn bởi USB, bạn sẽ thấy các điểm cuối này. Cổng COM: ảo trong thiết bị USB chỉ đơn giản là cổng nối tiếp ra khỏi thiết bị nô lệ USB đó làm điểm cuối. Windows sẽ cung cấp cho nó một số (COM1:, COM27: v.v.) và cổng nối tiếp đó có thể được nhận ra và sử dụng bởi bất kỳ chương trình nào sử dụng API Windows tiêu chuẩn cho các cổng COM :.

Một số phần cứng gắn USB có thể thích mạo danh cổng nối tiếp vì nó giúp cho việc phát triển phần mềm Windows trở nên dễ dàng hơn. Không cần trình điều khiển thiết bị, điều này giúp tiết kiệm rất nhiều công việc - thiết bị USB nói với Windows rằng đó là một cổng nối tiếp. Theo quan điểm của PC, điều này sẽ ổn nếu nó hoạt động như một cổng nối tiếp (byte được gửi và nhận trong một chuỗi nối tiếp vô tận luôn luôn mở). Vì vậy, có những lợi ích cho các nhà phát triển.


4
Tôi chưa bao giờ thấy tên thiết bị kết thúc bằng dấu hai chấm. Trong dòng lệnh bạn cũng nói ví dụ như type file.txt > lpt1không có dấu hai chấm. Và trong trình quản lý tệp Windows mặc định, Explorer, bạn không thể tạo một tệp có tên, ví dụ COM hoặc LPT1 (ít nhất là trong Windows XP, có thể sau này nữa). Nơi nào người ta thực sự có thể nhìn thấy dấu hai chấm sau tên thiết bị?
Ruslan

2
@Ruslan, bạn đúng rằng họ là tùy chọn trong Windows đã loại bỏ chúng, nó chấp nhận cả hai không giống như MS-DOS. Nhưng chưa bao giờ thấy họ ... (a) tra cứu một văn bản trên các thiết bị MS-DOS; (b) trong CP, nhập 'chế độ /?' và xem cú pháp của lệnh được sử dụng để đặt tham số COMn: và LPTn: port, hãy thử chúng nếu bạn muốn; (c) trong Dấu nhắc lệnh, nhập 'copy con: nul:' và xem nó hoạt động (Ctrl-C để kết thúc).

1
@Ruslan Colon ở đó vì nó là một thiết bị như mọi thiết bị khác. Đó không phải là dấu hai chấm đặc biệt - copy con:filename.txt nulhoạt động tốt, giống hệt như copy c:filename.txt nul. Ít nhất là cho đến MS-DOS 6.22, đại tràng có thể được bỏ qua trong hầu hết các trường hợp, vì nó không đưa ra bất kỳ sự mơ hồ nào; Không giống như tên ổ đĩa, các thiết bị này đã được đặt tên, vì vậy bạn không gặp phải vấn đề về copy file.txt c(tôi nên sao chép tệp vào thư mục hiện tại trên ổ đĩa c hoặc vào tệp có tên "c" trong thư mục hiện tại của tôi?) .
Luaan

7

Để thêm vào câu trả lời của Joren Vaes : lưu ý rằng một số ứng dụng phần mềm (như Arduino IDE) cài đặt trình điều khiển Windows tạo cổng "COM ảo". Khi các cổng đó được kích hoạt, các hệ điều hành sẽ thông báo cho các chương trình rằng có sẵn cổng COM, trông giống như một cổng nối tiếp tiêu chuẩn [*], mà các chương trình (như Arduino IDE, nhưng cũng có thể khác) có thể gửi và nhận các bit như đến bất kỳ cổng nối tiếp. Tuy nhiên, dưới mui xe, các bit đó được gửi đến cáp USB. Bên trong bảng Arduino một cái gì đó tương tự xảy ra.

[*] Và, theo "cổng nối tiếp tiêu chuẩn" ở đây, chúng tôi muốn nói đến giao thức RS-232, loại được truyền thống thông qua đầu nối DB-9 hoặc DB-25. Trong ngữ cảnh của chúng tôi, USB cũng không phải là "nối tiếp".


7

Hiểu biết của bạn về sự khác biệt giữa cổng COM và cổng USB là chính xác.

Trả lời ngắn gọn cho bạn câu hỏi của bạn, tại sao một số cổng USB được HĐH ánh xạ thành cổng "COM", là: có các thiết bị USB triển khai USB CDC (Lớp thiết bị giao tiếp). Các thiết bị này cung cấp một cầu nối từ giao diện USB cực kỳ phức tạp đến giao diện loại UART / RS-232 tiêu chuẩn. Để minh bạch cho người dùng, hệ điều hành tải trình điều khiển USB mô phỏng lớp vận chuyển dưới dạng cổng COM, cổng COM ảo. Một số chi tiết lịch sử và biện minh cho phương pháp này theo sau.

Cổng COM sử dụng các đầu nối DB-9 / DB-15 (còn gọi là nối tiếp RS-232 hoặc UART) và bộ điều khiển cho các cổng này được ánh xạ vật lý vào phần cứng PC, đến các địa chỉ cụ thể trong không gian I / O. Bộ điều khiển COM này đang trở nên lỗi thời trong các PC hiện đại và bị tuyệt chủng.

Đồng thời, nhiều MCU vẫn sử dụng giao tiếp nối tiếp RS-232 làm phương tiện chính để liên lạc với thế giới ngoại vi. Lý do là phần cứng (và phần mềm) cho loại liên kết này rất đơn giản và dễ thực hiện. Hơn nữa, tất cả các giao tiếp gỡ lỗi / phát triển Android hiện đại được thực hiện theo kiểu cổng COM. Ngoài ra, nhiều thiết bị "giao tiếp" (như modem, bao gồm 4G LTE trở lên), vẫn sử dụng giao diện kiểu UART với giao thức điều khiển loại ASCII qua một số cổng "COM".

Bây giờ các nhà phát triển có một vấn đề nan giải, làm thế nào để giao tiếp với các bộ điều khiển vi mô như vậy nếu PC phát triển máy chủ không có cổng COM? Giải pháp là sử dụng các cổng USB và các thiết bị USB đặc biệt kết nối giao thức USB với giao diện RS-232 của COM-port. Có các thiết bị USB chuyên dụng là chip FTDI và nhiều thiết bị khác (Cypress, Microchip, v.v.) tạo ra các thiết bị thực hiện chức năng cầu nối này.

Giờ đây, tất cả các giao tiếp gốc đến các MCU này vẫn được thể hiện dưới dạng giao thức RS-232 và hầu hết các ví dụ ứng dụng đều sử dụng một số ứng dụng Terminal (TeraTerm, HyperTerminal, v.v.) để sử dụng liên kết. Để thuận tiện cho người dùng, các cầu nối USB-UART được cung cấp các trình điều khiển đại diện cho cổng dưới dạng cổng COM ảo. Tất cả các phần mềm hiện đại đều sử dụng ảo hóa phần cứng COM, giúp chuyển đổi suôn sẻ sang các PC "không có COM". Việc thêm cầu FTDI chuyên dụng vào các cổng UART trên nền tảng phát triển MCU trở thành một cách phổ biến (và sử dụng trình điều khiển FTDI trên PC chủ để làm cho cổng USB trông giống như cổng COM) hoặc nhúng mã cầu nối thích hợp vào chính MCU (nếu Nó có chức năng USB gốc).

Cách tiếp cận thẳng là sử dụng bảng USB-to-UART bên ngoài và nối UART với MCU đang được phát triển. Hoặc, nếu một bo mạch đã có đầu nối DB-9, có các khóa USB có thể được kết nối trực tiếp với nó.

Trong mọi trường hợp, điều khiển UART gốc của MCU sẽ xuất hiện ở phía máy chủ dưới dạng cổng COM ảo, bỏ qua tất cả các chuyển đổi tín hiệu / giao thức trung gian. Đó là lý do tại sao mọi người ngày nay thường bỏ qua sự khác biệt giữa các cầu nối USB-to-UART và cổng COM.


3

Nó rất khó hiểu, nhưng bạn không cần phải lo lắng về nó. Trước hết, hãy nghĩ về một UART mà bản thân nó là một thuật ngữ chung, nhưng hãy nghĩ về một giao thức tạo ra một giao thức có bit start, một hoặc hai bit stop, 7 hoặc 8 thường là các bit dữ liệu và đôi khi là chẵn hoặc lẻ; nó có thể thay đổi từ đó làm cho nó tồi tệ hơn nhiều.

UART là ở cấp độ TTL, bất kể điều đó có nghĩa là gì. Nó từng là 5 V và bây giờ là 3,3 V, 1,8 V hoặc bất cứ thứ gì; có lẽ TTL là thuật ngữ sai. THÌ bạn đã có / có RS-232, RS-422, v.v ... Đây là các tiêu chuẩn ĐIỆN TỬ VÀ PIN, không phải tiêu chuẩn giao thức. Không đúng khi trộn các thuật ngữ và nói RS-232 khi bạn muốn nói đến một loại UART nào đó.

Trước đây, UART của bạn đã có trên bo mạch chủ của bạn và bạn muốn có một loại đầu nối với thế giới bên ngoài với các mức điện áp tại thời điểm đó có ý nghĩa và một số loại pinout / cáp tiêu chuẩn. Vì vậy, một tiêu chuẩn pin 25 và 9 phổ biến thường được tìm thấy cho các thiết bị ngoại vi khác nhau và trong thế giới Wintel PC, nó được gọi là cổng COMmunication hoặc đôi khi là cổng nối tiếp.

Chắc chắn, một cổng mang dữ liệu nối tiếp có thể và được gọi là cổng nối tiếp, SPI, I²C, MDIO, UART, HDLC, SDLC, v.v., và thậm chí có thể là USB và SCSI; bạn có thể phát điên với điều này Thông thường một cổng nối tiếp có nghĩa là một số chân bạn có thể nhận được tại UART.

Thế giới Unix / Linux nói ttythay vì com/ serial/ uart, nhưng đó là điều tương tự.

Bây giờ có THỰC HIỆN. Bạn có thể mua một số chip UART với một số giao diện trên đó (vâng, bạn có thể có SPI UART, nối tiếp ở cả hai đầu, hoặc I²C UART hoặc một số xe buýt hoặc USB chuyên dụng, v.v.). Ngay cả vào ngày trước, UART đã có một số xe buýt ở một bên mà cuối cùng CPU đã liên lạc qua. Ngày nay chúng ta có FTDI và các nhà cung cấp khác tạo ra các giải pháp USB UART đẹp mắt, không làm cho nó có bất kỳ lớp giao diện nào khác nhau giữa phần mềm và UART và sau đó phía bên kia của UART có một số giao diện, có thể là cấp độ TTL / chip hoặc RS-232C hoặc RS-422, v.v.

Ban đầu Arduinos bạn thường sử dụng bảng USB-to-UART FTDI cũng cung cấp năng lượng cho Arduino. Một số có nguồn USB và nối tiếp / UART trên bo mạch Arduino và sau đó được nối qua bảng với UART trên chip AVR (xử lý tương tự một số bộ xử lý với một số lớp bus để cho phép phần mềm giao tiếp với UART có một số giao diện ở phía bên kia của nó, trong trường hợp này là các chân trên cạnh của AVR, ở các mức điện áp chip, TTL).

Vì chức năng UART không thay đổi trong nhiều thập kỷ, tại sao thuật ngữ phần mềm hoặc thậm chí các ứng dụng phần mềm phải thay đổi ở cấp ứng dụng? Viết một ứng dụng Linux / Unix TTY cách đây 10 - 15 năm so với chip UART trên bo mạch chủ của bạn và rất có khả năng nó vẫn hoạt động cho đến ngày nay với cấp độ USB sang TTL hoặc USB sang cấp RS-232C hoặc RS-422 hoặc bất kỳ pin nào / định nghĩa cấp độ. Điều tương tự cũng xảy ra với Windows và tôi có mã cũ vẫn hoạt động trên cả hai. Trong thế giới Windows, thuật ngữ COM được sử dụng.

Tôi đã không sử dụng hộp cát Arduino trong một thời gian và nếu có thì sẽ có trên Linux, nhưng tôi sẽ không ngạc nhiên nếu chương trình đó là Java, nếu tôi nhớ đúng, là chung và sử dụng tên hệ thống như vậy ttyS2trên Linux và COM2 trên cửa sổ.

Đọc lại câu hỏi của bạn, điều này có thể tiến xa hơn, tận dụng số lượng phần mềm đã có sẵn sử dụng các lệnh gọi API này. Một lần nữa trong nhiều thập kỷ, không có lý do gì bạn không thể tạo một cổng ảo trong phần mềm mang dữ liệu hai chiều này xuống gần như mọi thứ bạn có thể nghĩ tới. UART to Ethernet là một thứ rất phổ biến và trong các phòng máy chủ nơi các máy chủ vẫn sử dụng rất nhiều cổng COM / TTY / RS-232, bạn có thể có một máy chủ đầu cuối có một số giao diện mà bạn có thể kết nối với một số máy chủ, Sau đó, Ethernet ở phía bên kia, sau đó nếu bạn chọn không telnet, bạn có thể cài đặt trình điều khiển cổng COM ảo.

Sau đó, ứng dụng của bạn trên máy tính của bạn nghĩ rằng nó đang nói chuyện với một cổng COM, nhưng trên thực tế, luồng byte đang nhảy vào Ethernet, sau đó chạm vào máy chủ đầu cuối, THEN, đến cáp UART đến RS-232C (nhưng không nhất thiết phải là pinout) máy chủ và trở lại cùng một cách.

Đôi khi không có lý do gì để thực sự biến nó thành một UART thực sự, vì bất kỳ lý do gì ảo hóa cổng COM để phần mềm được viết cho các lệnh gọi API đó vẫn có thể hoạt động. Có lẽ bạn có thể nghĩ về phần mềm ngân hàng cổ đại mà chúng ta vẫn sử dụng có thiết bị đầu cuối câm với giao diện UART mà có lẽ ngày trước đã bị cứng hoặc đi vào modem để cuối cùng là máy chủ. Bạn có thể làm cho nó để phần mềm vẫn hoạt động, thông qua nhiều mô phỏng khác nhau, bao gồm cả cổng COM ảo mà ngày nay có khả năng chuyển Ethernet sang máy chủ dưới dạng luồng nối tiếp (ví dụ TCP / IP).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.