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

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

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

  1. 串行端口是一个 9 针插头,如图所示这里又称为COM端口。
  2. USB 端口与串行端口的标准不同。

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

我认为使用同一个名称来描述两种不同的东西可能会有点令人困惑。

Arduino IDE 的屏幕截图,显示菜单命令“工具”→“串行端口”→“COM14”

答案1

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

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

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

答案2

这很令人困惑,因为 Windows COM:端口来自 MS-DOS(1980 年诞生)中定义的命名系统。这几乎是从 CP/M(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 连接到各种硬件,并将它们作为资源提供给主机 PC。因此,当您看到通过 USB 连接的硬件时,您会看到这些端点。USB 设备中的虚拟 COM: 端口只是从该 USB 从属设备出来的串行端口,作为端点。Windows 将为其分配一个编号(COM1:、COM27: 等),并且任何使用 COM: 端口的标准 Windows API 的程序都可以识别和使用该串行端口。

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

答案3

您对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 桥接至 UART 端口在 MCU 开发平台上(并在主机 PC 上使用 FTDI 驱动程序使 USB 端口看起来像 COM 端口),或者将适当的桥接代码嵌入到 MCU 本身(如果它具有原生 USB 功能)。

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

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

答案4

这很令人困惑,但您不必担心。首先,想象一下 UART,它本身是一个通用术语,但想象一下产生一个协议的 UART,该协议具有一个起始位、一个或两个停止位、通常为 7 或 8 个数据位,有时是奇偶校验;它可以从那里变化,这让情况变得更糟。

UART 处于 TTL 级别,无论其含义如何。以前是 5 V,现在是 3.3 V、1.8 V 或其他;也许 TTL 是错误的术语。然后您有/有 RS-232、RS-422 等。这些是电压和引脚标准,而不是协议标准。当您指的是某种 UART 时,将术语混淆并说成 RS-232 是不正确的。

过去,UART 位于主板上,您需要某种连接器连接到外部世界,其电压水平在当时是合理的,并且需要某种标准的引脚/电缆。因此,各种外围设备通常采用流行的 25 针和 9 针标准,而在 Wintel PC 世界中,这被称为通信端口或有时称为串行端口。

当然,传输串行数据的端口可以称为串行端口、SPI、I²C、MDIO、UART、HDLC、SDLC 等,甚至可能是 USB 和 SCSI;您可能会对此感到疯狂。通常,串行端口意味着您可以在 UART 上获得一些引脚。

Unix/Linux 世界ttycom//serial来代替uart,但它们是同一件事。

现在有实现。您可以购买带有某些接口的 UART 芯片(是的,您可以使用 SPI UART,两端都是串行的,或者 I²C UART 或某些专用总线或 USB 等)。即使在以前,UART 的一侧也有一些总线,最终 CPU 通过该总线进行通信。今天,我们有 FTDI 和其他供应商提供不错的 USB UART 解决方案,这并没有什么不同,软件和 UART 之间的某些接口层,然后 UART 的另一侧有一些接口,无论是 TTL/芯片级还是 RS-232C 或 RS-422 等。

早期的 Arduino 经常使用 FTDI USB-to-UART 板,该板也为 Arduino 供电。有些 Arduino 板本身带有 USB 电源和串行/UART,然后通过板连接到 AVR 芯片上的 UART(同样,一些处理器带有一些总线层,允许软件与 UART 通信,而 UART 的另一侧有一些接口,在本例中是 AVR 边缘的引脚,处于芯片电压电平 TTL)。

既然 UART 功能几十年来都没有改变,那么为什么软件术语甚至软件应用程序会在应用程序级别发生变化呢?10-15 年前针对主板上的 UART 芯片编写 Linux/Unix TTY 应用程序,它很可能今天仍能使用 USB 转 TTL 电平或 USB 转 RS-232C 电平或 RS-422 或任何引脚/电平定义工作。Windows 也是如此,我有那么老的代码,它们在这两种系统上都能工作。在 Windows 世界中,使用术语 COM。

我已经有一段时间没有使用过 Arduino 沙箱了,如果用过的话,那肯定是在 Linux 上,但如果我没记错的话,那个 Java 程序是通用的,并且ttyS2在 Linux 上使用系统名称,在 Windows 上使用 COM2,我对此并不感到惊讶。

重新阅读您的问题,这可以走得更远,利用已经使用这些 API 调用的大量软件。几十年来,没有理由不能在软件中创建一个虚拟端口,将这些双向数据传输到您能想到的几乎任何东西上。UART 到以太网是一种非常常见的端口,在服务器仍然大量使用 COM/TTY/RS-232 端口的服务器机房中,您可以拥有一个终端服务器,该服务器具有多个接口,您可以将其连接到多个服务器,然后在另一端连接到以太网,然后如果您选择不通过 telnet 进入,您可以安装虚拟 COM 端口驱动程序。

然后,您计算机上的应用程序认为它正在与 COM 端口通信,但实际上,字节流跳转到以太网,然后到达终端服务器,然后通过 UART 到 RS-232C 级别(但不一定是引脚排列)的电缆连接到服务器并以相同的方式返回。

有时,没有理由真正将其变成真正的 UART,无论出于何种原因,虚拟化 COM 端口都可以使为这些 API 调用编写的软件仍然可以工作。您或许可以想想我们仍在使用的古老银行软件,它有一个哑终端到 UART 接口,在过去可能是硬连线的,或者进入调制解调器最终到服务器。您可以通过各种程度的模拟使软件仍然有效,包括虚拟 COM 端口,如今它很可能只是通过以太网作为串行流(例如 TCP/IP)传输到服务器。

相关内容