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


13

据我对计算机端口的了解,

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

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

我认为使用相同的名称来描述两个不同的事物可能会使您感到困惑。

Arduino IDE的屏幕快照,显示菜单命令Tools→Serial Port→COM14


2
USB是串行通讯。

3
也许是因为您有一个可用作串行端口USB设备?是否具有FTDI(FT232)或Prolific(PL2303)USB到串行芯片之一,或者具有相同软件实现功能的MCU?将它们显示在与主板(或PCI(e)卡)上固定的串行端口相同的名称空间中,使该接口对于软件而言更加简单明了:它不需要知道端口的物理实现方式,仅需知道像串口一样的嘎嘎声。
ilkkachu

4
这可能有助于认识到,在IBM PC及其许多前身的早期,“串行端口”通常不是位于主板上,而是扩展总线卡上的接口。如今,该概念仍然相对正确,因为仍然有一个独特的串行接口转换器-现在将其连接回计算机的“扩展总线”是USB,而不是处理器本地总线的旧ISA连接器扩展。
克里斯·斯特拉顿

14
环球什么公交车?
霍布斯(Hobbs)

4
@hobbs,没错,通用串行总线。一辆巴士。与串行端口非常不同,不是吗?即使没有愚蠢的粗体文字。

Answers:


27

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

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

从严格的理论上讲,任何使用串行通信的端口(如果我的记忆为我服务,几乎任何现代总线-包括USB,代表“通用串行总线”)都是“串行端口”。但是,在大多数情况下,当人们指的是“串行端口”时,他们实际上指的是符合RS-232的端口。


10
每当有人提到“串行端口”时,几乎可以肯定是指通过DE-9M连接器连接的RS-232。如果人们指的是USB,那么他们往往会说USB。与其他串行协议(如RS-485或GPIB或各种以太网)相同。

5
@Felthry:“串行”通常表示RS-232也使用异步串行信号(“ UART”中的“ A”),但是在标准逻辑电压电平下,而不是RS-232。并且可能包括也可能不包括导致9针(或25针,这是RS-232的原始针)的握手针。
Ben Voigt

2
真正。我想这是滥用术语的另一层,使用“ RS-232”表示该协议的一种低压变体。我也考虑过提到DB-25M连接器,但是在这里并没有真正的意义。

7
@Felthry,很抱歉,但是“每当有人提到“串行端口”时,他们几乎可以肯定意味着通过DE-9M连接器连接的RS-232”是一种以PC为中心的观点。至少十年来,PC的背面都没有9针连接器。他们的使用者大众从未触及过他们。各地的产品,设备和PCB都通过各种专用连接器并以LVTTL电平或RS-232C使用串行端口。而且该站点上的工程师将比旧PC标准体验串行端口的方式要多得多。恐怕世界比这多样化得多。

4
@TonyM也许我刚去过太多老式设备。但是,我要指出的是,计算机仍然普遍采用DE9连接器制造-只是不面向消费市场。它们在工业和研究中无处不在,因为您可能需要与90年代或更早时制造的系统(它们很常见)交互。毕竟,人们不会像升级手机那样升级其工业设备!就像我说的那样,这是对术语的滥用。也许“几乎可以肯定”的措词过于强烈,但这是一种非常普遍的用法。

18

这是令人困惑的,因为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连接到各种硬件,并将它们作为资源提供给它。因此,当您看到USB连接的硬件时,就会看到这些端点。USB设备中的虚拟COM:端口只是从该USB从设备作为端点发出的串行端口。Windows将为其提供一个数字(COM1:,COM27:等),并且任何使用标准Windows API for COM:的程序都可以识别并使用该串行端口。

一些连接USB的硬件可能更喜欢模拟串行端口,因为它使Windows软件的开发更加容易。无需编写任何设备驱动程序,从而节省了大量工作-USB设备告诉Windows这是一个串行端口。从PC的角度来看,如果它的行为像一个串行端口(在始终打开的无穷无尽的串行流中发送和接收字节),这很好。因此,对于开发人员来说是有好处的。


4
我从未见过设备名称以冒号结尾。在命令行中,您还要说例如type file.txt > lpt1没有任何冒号。并且在默认的Windows文件管理器Explorer中,您无法创建名为COM或LPT1的文件(至少在Windows XP中,也许以后也是如此)。在设备名称后实际上可以在哪里看到冒号?
罗斯兰

2
@Ruslan,您是对的,因为它们在Windows中是可选的,已删除了它们,它接受了两者,与MS-DOS不同。但是从未见过它们...(a)在MS-DOS设备上查找文本;(b)在CP中,输入“ mode /?” 并查看用于设置COMn:和LPTn:端口参数的命令的语法,请根据需要尝试使用它们;(c)在“命令提示符”中,键入“ copy con:nul:”并观看其工作(Ctrl-C结束)。

1
@Ruslan Colon在那里,因为它是与其他设备一样的设备。不是冒号很特别- copy con:filename.txt nul可以正常工作,与完全相同copy c:filename.txt nul。至少就MS-DOS 6.22而言,在大多数情况下可以省略冒号,因为它不会引起任何歧义。与驱动器名称不同,这些设备是保留名称,因此您不会遇到以下问题copy file.txt c(我应该将文件复制到c驱动器上的当前目录,还是复制到当前目录中名为“ c”的文件?) 。
a安

7

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

[*]并且,“标准串行端口”在这里是指RS-232协议,该协议传统上是通过DB-9或DB-25连接器传输的。在我们的上下文中,USB也是“串行”根本没有关系。


7

您对COM端口和USB端口之间区别的理解是正确的。

简短回答您的问题,为什么某些USB端口被OS映射为“ 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及更高版本)仍在多个“ COM”端口上使用具有ASCII类型控制协议的UART风格的接口。

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

现在,与这些MCU的所有本机通信仍以RS-232协议表示,并且大多数应用示例都假定使用某些终端应用程序(TeraTerm,超级终端等)来使用链接。为了用户方便起见,USB-to-UART桥附带了将端口表示为虚拟COM端口的驱动程序。所有现代软件都使用COM硬件的虚拟化,从而可以平稳地过渡到“无COM”的PC。在MCU开发平台上的UART端口上添加专用的FTDI桥(并在主机PC上使用FTDI驱动程序使USB端口看起来像COM端口),或者在MCU本身中嵌入适当的桥代码,这是一种常见的做法。它具有本地USB功能)。

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

在所有情况下,MCU的本地UART控制将在主机侧显示为虚拟COM端口,从而跳过所有中间信号/协议转换。因此,当今人们经常跳过USB转UART桥接和COM端口之间的区别。


3

这非常令人困惑,但是您不必担心。首先,请考虑一个UART,它本身是一个通用术语,但请考虑一个生成带有起始位,一个或两个停止位,7或8个通常为数据位,有时是偶数或奇数奇偶校验的协议的UART。它在那里可能会有所不同,这使情况变得更糟。

UART处于TTL电平,无论如何。以前是5 V,现在是3.3 V,1.8 V或其他电压;也许TTL是错误的术语。然后,您已经/拥有RS-232,RS-422等。这些是电压和PIN标准,而不是协议标准。当您指的是某种UART时,混用术语并说RS-232是不正确的。

早在您的UART在主板上的那一天,您就需要某种与外界连接的连接器,当时的电压水平是合理的,并且需要某种标准的引脚/电缆。因此,经常在各种外设上找到流行的25和9针标准,在Wintel PC世界中,这被称为通信端口或有时称为串行端口。

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

Unix / Linux世界说的tty不是com/ serial/ uart,但这是同一回事。

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

早期的Arduino,您经常使用FTDI USB-to-UART板,该板也为Arduino提供电源。有些人在Arduino板本身上具有USB电源和串行/ UART,然后将其通过板子连接到AVR芯片上的UART(同一处理器通过一些总线层进行相同处理,以允许软件与具有它另一侧的一些接口,在这种情况下,AVR边缘上的引脚处于芯片电压电平(TTL)。

由于UART功能几十年来没有发生变化,为什么软件术语甚至软件应用程序应在应用程序级别进行更改?在10到15年前用主板上的UART芯片编写Linux / Unix TTY应用程序,现在很可能它仍然可以在USB到TTL电平或USB到RS-232C电平或RS-422或任何引脚的情况下工作/ level定义。Windows也是如此,而我拥有的代码仍然可以同时使用。在Windows世界中,使用COM。

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

重读您的问题,这可以进一步利用利用这些API调用的现有软件。几十年来,您再也没有理由不能在软件中创建虚拟端口来承载双向数据,而您可以想到的几乎是任何东西。UART转以太网是一种非常普遍的方法,在服务器仍然非常使用COM / TTY / RS-232端口的服务器机房中,您可以拥有一台终端服务器,该服务器具有许多接口,可以连接到许多服务器,然后在另一端使用以太网,然后如果您选择不远程登录,则可以安装虚拟COM端口驱动程序。

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

有时,无论出于何种原因,都没有理由将其实际连接到真正的UART中,因为它会虚拟化COM端口,以便为那些API调用编写的软件仍然可以工作。您可能会想到我们仍然使用的古老的银行软件,该软件具有连接UART接口的哑终端,而该接口有时可能是硬连线的,或者是进入调制解调器以最终成为服务器的。您可以做到这一点,以便通过各种仿真(包括虚拟COM端口)使软件仍然可以正常工作,该虚拟COM端口如今可能只是通过以太网作为串行流(例如TCP / IP)通过以太网到达服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.