为什么 USB 端口有时称为串行端口并称为 COM?

mic*_*kkk 15 usb serial port

就我对计算机端口的理解而言,

  1. 串行端口是9针插头,如一个显示在这里,它也被称为COM端口。
  2. USB 端口是不同于串行端口的标准。

那么为什么我经常看到称为“串行端口”的 USB 端口,例如在 Arduino IDE 中,USB 端口由 COM 前缀标识?另外,如果不涉及任何串行端口,为什么有时需要虚拟 COM 端口?(例如:Prologix GPIB-USB 适配器。)

使用相同的名称来描述两种不同的事物,我认为可能有点令人困惑。

来自 Arduino IDE 的屏幕截图,菜单命令 Tools ?  串行端口 ? 显示 COM14

Jor*_*aes 29

这些不是称为串行端口的 USB 端口。在您的示例中,Arduino 有一个 USB 转串口设备(以第二个微控制器或 FTDI 芯片的形式)。这将使用 USB 与计算机进行通信并形成一个实际的串行端口到外界——类似于 USB Wi-Fi 加密狗,或 USB LAN 适配器、USB SATA 适配器等。

关键是,在许多情况下,用户无法直接使用串行端口,因为它在设备中是“硬连线”的(在这种情况下,直接连接到您正在编程的微控制器)。

严格来说,任何使用串行通信的端口(几乎任何现代总线 - 包括 USB,如果我没记错的话,它代表“通用串行总线”)都是“串行端口”。然而,在大多数情况下,当人们提到“串口”时,他们实际上是指一个符合RS-232的端口。

  • 每当有人提到“串行端口”时,他们几乎肯定是指通过 DE-9M 连接器连接的 RS-232。如果人们指的是 USB,他们往往会说 USB。其他串行协议如 RS-485 或 GPIB 或各种形式的以太网也是如此。 (10认同)
  • @Felthry,抱歉,“任何时候有人提到“串行端口”,他们几乎肯定是指通过 DE-9M 连接器连接的 RS-232”是过时的以 PC 为中心的视图。而且至少有十年时间,PC 的背面都没有配备 9 针连接器。他们的广大用户从来没有接触过他们。各地的产品、设备和 PCB 都使用串行端口,通过各种专用连接器并处于 LVTTL 级别或 RS-232C。并且该站点上的工程师将体验比旧 PC 标准更多的串行端口。恐怕比这更多样化的世界。 (7认同)
  • @Felthry:“串行”通常意味着 RS-232 也使用异步串行信号(“UART”中的“A”),但在标准逻辑电压电平下,而不是 RS-232。并且可能包括也可能不包括通向 9 针(或 25 针,这是 RS-232 的原始针)的握手针。 (5认同)
  • @TonyM 也许我只是接触了太多老式设备。但是,我要指出的是,计算机通常仍然带有 DE9 连接器——只是不适合消费市场。它们在工业和研究中无处不在,因为您可能需要与 90 年代或更早时候制造的系统进行交互,当时它们很普遍。毕竟,人们不会像升级手机那样升级他们的工业设备!就像我说的,这是对术语的滥用。也许“几乎可以肯定”这个词太强了,但它是一个非常常见的用法。 (4认同)
  • 真的。我想这是术语的另一层滥用,使用“RS-232”来表示协议的低电压变体。我也考虑过提及 DB-25M 连接器,但它在这里并不真正相关。 (2认同)

小智 19

这是令人困惑的,因为 Windows COM:端口来自 MS-DOS(b. 1980)中定义的命名系统。这几乎是从 CP/M (b. 1974) 中复制而来的,其中有一些来自 Unix 的想法。他们没有预料到会增加像 USB 这样的中间“传输”总线。

Windows 中有不少东西是 CP/M->MS-DOS 演变的幸存者,例如以字母命名的磁盘驱动器、3 个字母的文件扩展名、.EXE 和 .COM 文件以及命令提示符命令界面。

另一个是设备名称:通常是三个字母,总是以冒号结尾。COM:是串行“通信端口”,LPT:“行式打印机”(通常挂在 Centronics 端口上),NUL:转储发送给它的任何内容,CON:是“控制台”(键盘和屏幕)。有些你可以有几个得到编号以区分它们。COM:端口,LPT:端口,变成COM1:和LPT1:等等。

COM:端口是一个“端点”:从 Windows PC 的角度来看,通信链路的远端。像计算中的许多事情一样,那里的桥被忽略了,它是您正在考虑的远端组件,而不是 USB。PC 键盘(链接为 CPU-PCIe-USB-kbd)或网络驱动器(链接为 CPU-PCIe-LAN-LAN-PCIe-CPU-PCIe-SATA 或类似内容)也是如此。

USB 也使用端点的概念。USB 控制器可以将主机 PC 连接到各种硬件并将它们作为资源提供给它。因此,当您看到 USB 连接的硬件时,您会看到这些端点。USB 设备中的虚拟 COM: 端口只是作为端点的 USB 从设备输出的串行端口。Windows 会给它一个编号(COM1:、COM27: 等),并且任何使用 COM: 端口的标准 Windows API 的程序都可以识别和使用该串行端口。

某些 USB 连接的硬件可能更喜欢模拟串行端口,因为这样可以更轻松地开发 Windows 软件。无需编写设备驱动程序,节省了大量工作——USB设备告诉Windows它是一个串口。从 PC 的角度来看,如果它的行为类似于串行端口(字节在始终打开的无限串行流中发送和接收),则这很好。所以对开发者来说是有好处的。

  • 我从未见过以冒号结尾的设备名称。在命令行中,您还可以说例如 `type file.txt > lpt1` 没有任何冒号。并且在默认的 Windows 文件管理器资源管理器中,您无法创建名为 COM 或 LPT1 的文件(至少在 Windows XP 中,也许以后也是)。在哪里可以看到设备名称后面的冒号? (4认同)
  • @Ruslan,您说得对,它们在 Windows 中是可选的,但已删除它们,与 MS-DOS 不同,它接受两者。但从未见过它们…… (a) 在 MS-DOS 设备上查找文本;(b) 在 CP 中,输入 'mode /?' 并查看用于设置 COMn: 和 LPTn: 端口参数的命令的语法,如果您愿意,可以尝试它们;(c) 在命令提示符中,输入“copy con: nul:”并观察它的工作(Ctrl-C 结束)。 (2认同)

leo*_*loy 7

要添加到Joren Vaes 的回答中:请注意,某些软件应用程序(如 Arduino IDE)会安装创建“虚拟 COM”端口的 Windows 驱动程序。当这些端口被激活时,操作系统会告诉程序有一个 COM 端口可用,它看起来像一个标准的串行端口 [*],哪些程序(如 Arduino IDE,但也有任何其他)可以发送和接收位,如到任何串行端口。然而,在引擎盖下,这些位被发送到 USB 电缆。在 Arduino 板内部发生了类似的事情。

[*] 而且,这里的“标准串行端口”是指 RS-232 协议,传统上通过 DB-9 或 DB-25 连接器传输的那种协议。在我们的上下文中,USB 也是“串行”的并不重要。


Ale*_*ski 7

你对COM口和USB口区别的理解是正确的。

简短回答你的问题,为什么有些 USB 端口被操作系统映射为“COM”端口,是:有 USB 设备实现了 USB CDC(通信设备类)。这些设备提供了从极其复杂的 USB 接口到标准 UART/RS-232 类型接口的桥梁。为了对用户透明,操作系统将模拟传输层的 USB 驱动程序加载为 COM 端口,即虚拟 COM 端口。这种方法的一些历史细节和理由如下。

COM 端口使用 DB-9/DB-15(又名 RS-232 串行或 UART)连接器,这些端口的控制器物理映射到 PC 硬件,到 I/O 空间中的特定地址。此 COM 控制器在现代 PC 中已过时,并已灭绝。

同时许多MCU仍然使用RS-232串行通讯作为与外围世界通讯的主要手段。原因是这种链接的硬件(和软件)非常简单且易于实现。此外,所有现代 Android 开发/调试通信都是以 COM 端口样式完成的。此外,许多“通信”设备(如调制解调器,包括 4G LTE 及更高版本)仍然使用 UART 风格的接口,通过几个“COM”端口使用 ASCII 类型的控制协议。

现在开发者面临一个困境,如果主机开发PC没有COM端口,如何与这样的微控制器通信?解决方案是使用 USB 端口和特殊的 USB 设备,这些设备将 USB 协议与 COM 端口 RS-232 接口桥接起来。有专用 USB 设备作为 FTDI 芯片,还有许多其他设备(Cypress、Microchip 等)制造执行此桥接功能的设备。

现在,与这些 MCU 的所有本地通信仍以 RS-232 协议表示,并且大多数应用示例都假设使用某些终端应用程序(TeraTerm、HyperTerminal 等)来使用链接。为方便用户,USB 至 UART 桥接器提供了将端口表示为虚拟 COM 端口的驱动程序。所有现代软件都使用 COM 硬件的虚拟化,可平滑过渡到“无 COM”PC。将专用 FTDI 桥接器添加MCU 开发平台上的UART 端口(并在主机 PC 上使用 FTDI 驱动程序使 USB 端口看起来像 COM 端口),或将适当的桥接代码嵌入 MCU 本身(如果它具有本机 USB 功能)。

直接的方法是使用外部 USB 转 UART 板并将 UART 连接到正在开发的 MCU。或者,如果电路板已经有 DB-9 连接器,则可以直接连接USB 加密狗

在所有情况下,MCU 的本机 UART 控制将作为虚拟 COM 端口出现在主机端,跳过所有中间信号/协议转换。这就是为什么现在人们经常跳过 USB 到 UART 桥接器和 COM 端口之间的区别。