¿Por qué los puertos USB a veces se denominan puertos serie y se denominan COM?

13

En lo que respecta a mi comprensión de los puertos de la computadora,

  1. Un puerto serie es un conector de 9 pines como el que se muestra aquí y también se denomina puerto COM.
  2. Los puertos USB son un estándar diferente de los puertos seriales.

¿Por qué entonces veo a menudo puertos USB llamados "puertos seriales" y, por ejemplo, en el IDE de Arduino, los puertos USB se identifican con el prefijo COM? Además, ¿por qué a veces se necesita un puerto COM virtual si no hay puertos serie involucrados? (Ejemplo: adaptador Prologix GPIB-USB).

Este uso del mismo nombre para describir dos cosas diferentes, creo que puede ser un poco confuso.

Captura de pantalla del IDE de Arduino, comando de menú Herramientas → Puerto serie → Se muestra COM14

mickkk
fuente
2
USB es comunicaciones en serie.
3
¿Quizás porque tienes un dispositivo USB que funciona como puerto serie ? ¿Algo que tenga uno de esos chips USB a serie FTDI (FT232) o Prolific (PL2303), o tal vez una MCU con una implementación de software de la misma? Hacer que se muestren en el mismo espacio de nombres que los puertos serie fijos en la placa base (o en las tarjetas PCI (e)) hace que la interfaz sea más sencilla para el software: no necesita saber cómo se implementa físicamente el puerto, solo eso. grazna como un puerto serie.
ilkkachu
44
Puede ser útil darse cuenta de que en los primeros días de la PC de IBM y muchos de sus predecesores, un "puerto serie" no se encontraba típicamente en la placa base, sino que era más bien una interfaz en una tarjeta de bus de expansión. Hoy ese concepto sigue siendo relativamente cierto, ya que todavía hay un convertidor de interfaz en serie distinto: solo el "bus de expansión" que lo conecta de nuevo a la computadora ahora es USB, en lugar de la antigua extensión conectorizada ISA del bus local del procesador.
Chris Stratton
14
Universal que Bus?
hobbs
44
@hobbs, así es Universal Serial Bus. Un autobús. Muy distinto de un puerto serie, ¿no? Incluso sin el tonto texto en negrita.

Respuestas:

27

Estos no son puertos USB conocidos como puertos seriales. En su ejemplo, el Arduino tiene un dispositivo USB a serie (ya sea en forma de un segundo microcontrolador o un chip FTDI). Esto usará USB para comunicarse con la computadora y formar un puerto serie real para el mundo exterior, similar a los dongles USB Wi-Fi, o adaptadores USB LAN, adaptadores USB SATA, etc.

La clave es que, en muchos casos, el puerto serie no está disponible directamente para el usuario, ya que está "cableado" en el dispositivo (en este caso, conectado directamente al microcontrolador que está programando).

En teoría estricta, cualquier puerto que use comunicaciones en serie (casi cualquier bus moderno, incluido USB, que significa "Universal Serial Bus", si mi memoria me sirve) es un "puerto en serie". Sin embargo, en la mayoría de los casos, cuando las personas se refieren al "puerto serie", en realidad se refieren a un puerto que cumple con RS-232.

Joren Vaes
fuente
10
Cada vez que alguien se refiere a un "puerto serie", es casi seguro que se refieren a RS-232 conectado a través de un conector DE-9M. Si las personas quieren decir USB, tienden a decir USB. Lo mismo para otros protocolos seriales como RS-485 o GPIB o los diversos tipos de Ethernet.
55
@Felthry: "serial" muy a menudo significa señalización serial asíncrona (la "A" en "UART") que RS-232 también usa, pero a niveles de voltaje lógico estándar, no RS-232. Y puede incluir o no los pines de apretón de manos que conducen a los 9 pines (o 25 pines, que era el original para RS-232).
Ben Voigt
2
Cierto. Supongo que es otra capa de abuso de terminología, usar 'RS-232' para referirse a una variante de bajo voltaje del protocolo. También consideré mencionar el conector DB-25M, pero aquí no es realmente relevante.
77
@Felthry, lo siento, pero "cada vez que alguien se refiere a un" puerto serie ", casi con toda seguridad se refieren a RS-232 conectado a través de un conector DE-9M" es una vista obsoleta centrada en la PC. Y las PC no se han fabricado con conectores de 9 pines en la parte posterior durante al menos una década. La población masiva de sus usuarios nunca los tocó cuando estaban. Los productos, equipos y PCB en todo el lugar usan puertos seriales, a través de una variedad de conectores dedicados y en niveles LVTTL o RS-232C. Y los ingenieros en este sitio experimentarán los puertos seriales de muchas más maneras que un viejo estándar de PC. Mucho más diverso que eso, me temo.
44
@TonyM Tal vez solo he estado con demasiado equipo de la vieja escuela. Sin embargo, señalaré que las computadoras todavía se fabrican comúnmente con conectores DE9, pero no para el mercado de consumo. Son omnipresentes en la industria y la investigación, porque es probable que necesite interactuar con sistemas que se hicieron en los años 90 o antes, cuando eran comunes. ¡Después de todo, las personas no actualizan sus equipos industriales como lo harías con tu teléfono! Como dije, es un abuso de terminología. Quizás "casi con certeza" era una redacción demasiado fuerte, pero es un uso muy común.
18

Es confuso porque Windows COM: los puertos provienen de un sistema de nombres definido en MS-DOS (b. 1980). Esto fue prácticamente copiado de CP / M (b. 1974) con algunas ideas tomadas de Unix. No anticiparon la adición de un bus de 'transporte' intermedio como USB.

Muchas cosas en Windows son sobrevivientes de la evolución de CP / M-> MS-DOS, como unidades de disco con nombre de letra, extensiones de nombre de archivo de 3 letras, archivos .EXE y .COM y la interfaz de comando del símbolo del sistema.

Otro son los nombres de los dispositivos: generalmente tres letras, que siempre terminan en dos puntos. COM: es un 'puerto de comunicaciones' en serie, LPT: una 'impresora de línea' (generalmente colgando de un puerto Centronics), NUL: vuelca todo lo que se le envía, CON: es la 'consola' (teclado y pantalla). Algunos de los que podría tener varios se numeran para diferenciarlos. COM: los puertos lo hacen, al igual que LPT: puertos, convirtiéndose en COM1: y LPT1: y así sucesivamente.

Un puerto COM: es un 'punto final': el extremo más alejado del enlace de comunicaciones desde el punto de vista de una PC con Windows. Al igual que muchas cosas en informática, el puente allí se ignora y es el componente remoto en el que está pensando, no el USB. Esto también es cierto para un teclado de PC (vinculado como CPU-PCIe-USB-kbd) o una unidad de red (vinculada como CPU-PCIe-LAN-LAN-PCIe-CPU-PCIe-SATA o similar).

USB también usa la idea de puntos finales. Un controlador USB puede conectar una PC host a todo tipo de hardware y proporcionarlos como recursos. Entonces, cuando vea el hardware conectado por USB, verá estos puntos finales. Un puerto COM virtual en un dispositivo USB es simplemente un puerto serie que sale de ese dispositivo esclavo USB como punto final. Windows le dará un número (COM1 :, COM27: etc.) y ese puerto serie puede ser reconocido y utilizado por cualquier programa que use la API estándar de Windows para COM: puertos.

Es posible que parte del hardware conectado por USB prefiera suplantar un puerto serie porque facilita el desarrollo del software de Windows. No es necesario escribir ningún controlador de dispositivo, lo que ahorra mucho trabajo: el dispositivo USB le dice a Windows que es un puerto serie. Desde el punto de vista de la PC, esto está bien si se comporta como un puerto serie (los bytes se envían y reciben en una secuencia en serie sin fin que siempre está abierta). Por lo tanto, hay beneficios para el desarrollador.

TonyM
fuente
44
Nunca he visto nombres de dispositivos que terminen en dos puntos. En la línea de comando también dice, por ejemplo, type file.txt > lpt1sin dos puntos. Y en el administrador de archivos predeterminado de Windows, Explorer, no puede crear un archivo llamado, por ejemplo, COM o LPT1 (al menos en Windows XP, tal vez más tarde también). ¿Dónde se puede ver realmente los dos puntos después del nombre del dispositivo?
Ruslan
2
@Ruslan, tienes razón en que son opcionales en Windows que los ha descartado, acepta ambos a diferencia de MS-DOS. Pero nunca los he visto ... (a) busque un texto en dispositivos MS-DOS; (b) en CP, escriba 'mode /?' y mire la sintaxis del comando utilizado para configurar COMn: y LPTn: parámetros de puerto, pruébelos si lo desea; (c) en Símbolo del sistema, escriba 'copy con: nul:' y vea cómo funciona (Ctrl-C para finalizar).
1
@Ruslan Colon está ahí porque es un dispositivo como cualquier otro. No es el colon lo que es especial: copy con:filename.txt nulfunciona bien, exactamente igual que copy c:filename.txt nul. Al menos en lo que respecta a MS-DOS 6.22, el colon puede omitirse en la mayoría de los casos, ya que no introduce ninguna ambigüedad; a diferencia de los nombres de las unidades, estos dispositivos han sido nombres reservados, por lo que no se encuentra con los problemas de copy file.txt c(¿debo copiar el archivo en el directorio actual en la unidad c, o en un archivo llamado "c" en mi directorio actual?) .
Luaan
7

Para agregar a la respuesta de Joren Vaes : tenga en cuenta que algunas aplicaciones de software (como Arduino IDE) instalan un controlador de Windows que crea puertos "virtuales COM". Cuando esos puertos están activados, los sistemas operativos les dicen a los programas que hay un puerto COM disponible, que se parece a un puerto serie estándar [*], al cual los programas (como Arduino IDE, pero también cualquier otro) pueden enviar y recibir bits como a cualquier puerto serie. Bajo el capó, sin embargo, esos bits se envían a un cable USB. Dentro del tablero Arduino ocurre algo análogo.

[*] Y, por "puerto serie estándar", nos referimos al protocolo RS-232, el tipo que se transmitía tradicionalmente a través del conector DB-9 o DB-25. En nuestro contexto, no importa en absoluto que el USB también sea "serial".

leonbloy
fuente
7

Su comprensión de la diferencia entre el puerto COM y el puerto USB es correcta.

En pocas palabras, su pregunta, por qué algunos puertos USB están asignados por el sistema operativo como puertos "COM", es: hay dispositivos USB que implementan USB CDC (clase de dispositivo de comunicación). Estos dispositivos proporcionan un puente desde una interfaz USB terriblemente complicada a una interfaz tipo UART / RS-232 estándar. Para mayor transparencia para los usuarios, el sistema operativo carga controladores USB que imitan la capa de transporte como puerto COM, un puerto COM virtual. A continuación se presentan algunos detalles históricos y justificaciones para este enfoque.

El puerto COM utiliza conectores DB-9 / DB-15 (también conocido como serie RS-232 o UART), y los controladores para estos puertos se asignan físicamente al hardware de la PC, a direcciones específicas en el espacio de E / S. Este controlador COM se está volviendo obsoleto en las PC modernas y se extingue.

Al mismo tiempo, muchos MCU todavía utilizan la comunicación serie RS-232 como medio principal para comunicarse con el mundo periférico. La razón es que el hardware (y el software) para este tipo de enlace es muy simple y fácil de implementar. Además, toda la comunicación moderna de desarrollo / depuración de Android se realiza en el estilo de puerto COM. Además, muchos dispositivos de "comunicación" (como módems, incluido 4G LTE y superior), todavía usan la interfaz de estilo UART con el protocolo de control de tipo ASCII en varios puertos "COM".

Ahora los desarrolladores tienen un dilema, ¿cómo comunicarse con dichos microcontroladores si la PC de desarrollo del host no tiene puertos COM? La solución fue utilizar puertos USB y dispositivos USB especiales que unan el protocolo USB con la interfaz RS-232 de puerto COM. Hay dispositivos USB dedicados como chips FTDI, y muchos otros (Cypress, Microchip, etc.) hacen dispositivos que realizan esta función de puente.

Ahora, toda la comunicación nativa a estas MCU todavía se expresa en términos del protocolo RS-232, y la mayoría de los ejemplos de aplicaciones suponen el uso de alguna aplicación de Terminal (TeraTerm, HyperTerminal, etc.) para usar el enlace. Para comodidad del usuario, los puentes de USB a UART se proporcionan con controladores que representan el puerto como un puerto COM virtual. Todo el software moderno utiliza la virtualización del hardware COM, que proporciona una transición sin problemas a las PC "sin COM". Se convierte en una práctica común agregar un puente FTDI dedicado a los puertos UART en una plataforma de desarrollo MCU (y usar controladores FTDI en la PC host para hacer que el puerto USB se vea como el puerto COM), o incrustar el código de puente apropiado en el MCU mismo (si tiene funcionalidad USB nativa).

El enfoque directo es utilizar una placa externa de USB a UART y conectar el UART a la MCU en desarrollo. O, si una placa ya tiene el conector DB-9, hay dongles USB que se pueden conectar directamente a ella.

En todos los casos, el control UART nativo de MCU aparecerá en el lado del host como un puerto COM virtual, omitiendo todas las transformaciones intermedias de señal / protocolo. Es por eso que las personas hoy en día a menudo omiten la distinción entre puentes USB a UART y puertos COM.

Ale..chenski
fuente
3

Es muy confuso, pero no necesita preocuparse por eso. En primer lugar, piense en un UART que en sí mismo es un término genérico, pero piense en uno que produce un protocolo con un bit de inicio, uno o dos bits de parada, 7 u 8 generalmente bits de datos y, a veces, paridad que es par o impar; puede variar a partir de ahí, lo que lo hace mucho peor.

El UART está en niveles TTL, sea lo que sea que eso signifique. Solía ​​ser 5 V y ahora 3.3 V, 1.8 V o lo que sea; Quizás TTL es el término equivocado. ENTONCES tenía / tiene RS-232, RS-422, etc. Estos son estándares de VOLTAJE Y PIN, no estándares de protocolo. Es incorrecto mezclar los términos y decir RS-232 cuando se refiere a algún tipo de UART.

En el pasado, su UART estaba en sus placas base y deseaba algún tipo de conector al mundo exterior con niveles de voltaje que en ese momento tenían sentido y algún tipo de pinout / cable estándar. Por lo tanto, a menudo se encontró un estándar popular de 25 y 9 pines para varios periféricos, y en el mundo de Wintel PC se lo llamó puerto de comunicación o, a veces, puerto serie.

Claro, un puerto que transporta datos en serie puede y se llama puerto en serie, SPI, I²C, MDIO, UART, HDLC, SDLC, etc., y tal vez incluso USB y SCSI; podrías volverte loco con esto. Por lo general, un puerto serie significa algunos pines que puede obtener en un UART.

El mundo Unix / Linux dice en ttylugar de com/ serial/ uart, pero es lo mismo.

Ahora hay la IMPLEMENTACIÓN. Puede comprar un chip UART con alguna interfaz (sí, puede tener un SPI UART, que es serial en ambos extremos, o I²C UART o algún bus o USB dedicado, etc.). Incluso en el pasado, el UART tenía un bus a un lado que finalmente la CPU se comunicaba. Hoy tenemos FTDI y otros proveedores que hacen buenas soluciones USB UART, no hace que sea diferente algunas capas de interfaz entre el software y el UART y luego el otro lado del UART tiene alguna interfaz, ya sea nivel TTL / chip o RS-232C o RS-422, etc.

Al principio de Arduinos, a menudo usaba una placa FTDI USB a UART que también proporcionaba energía al Arduino. Algunos tienen esa alimentación USB y serial / UART en la placa Arduino y luego se conecta a la UART en el chip AVR (el mismo trato que algunos procesadores con algunas capas de buses para permitir que el software se comunique con una UART que tiene alguna interfaz en el otro lado, en este caso los pines en el borde del AVR, a niveles de voltaje de chip, TTL).

Dado que la funcionalidad UART no ha cambiado en décadas, ¿por qué debería cambiar la terminología del software o incluso las aplicaciones de software a nivel de aplicación? Escriba una aplicación TTY de Linux / Unix hace 10-15 años contra un chip UART en su placa base, y hay una buena posibilidad de que todavía funcione hoy con un USB a nivel TTL o USB a nivel RS-232C o RS-422 o cualquier pin / definición de nivel. Lo mismo ocurre con Windows, y tengo un código tan antiguo que todavía funciona en ambos. En el mundo de Windows se usa el término COM.

No he usado el sandbox de Arduino en mucho tiempo y, de ser así, habría estado en Linux, pero no me sorprendería si ese programa que es Java, si no recuerdo mal, es genérico y usa el nombre del sistema ttyS2en Linux y COM2 en ventanas

Al releer su pregunta, esto puede ir mucho más allá, aprovechando la cantidad de software ya existente que utiliza estas llamadas API. Nuevamente, durante décadas no hay razón por la que no pueda crear un puerto virtual en un software que lleve estos datos bidireccionales a casi cualquier cosa que se le ocurra. UART a Ethernet es muy común, y en las salas de servidores donde los servidores todavía usan mucho los puertos COM / TTY / RS-232, puede tener un servidor de terminal que tiene una serie de interfaces que puede conectar a una cantidad de servidores, luego Ethernet en el otro lado, luego, si elige no hacer telnet, puede instalar un controlador de puerto COM virtual.

Luego, su aplicación en su computadora cree que está hablando con un puerto COM, pero de hecho ese flujo de bytes está saltando a Ethernet y luego golpea el servidor terminal, ENTONCES, a un UART a cables de nivel RS-232C (pero no necesariamente pinout) a el servidor y viceversa de la misma manera.

A veces no hay ninguna razón para llegar a un UART real, por alguna razón, virtualice un puerto COM para que el software que se escribió para esas llamadas a la API todavía pueda funcionar. Tal vez podría pensar en el antiguo software bancario que todavía usamos que tiene una terminal tonta para una interfaz UART que tal vez en ese momento estaba cableada o entró en un módem para eventualmente un servidor. Puede hacerlo para que el software siga funcionando, a través de varias cantidades de emulación, incluido un puerto COM virtual que hoy probablemente solo baja Ethernet al servidor como una transmisión en serie (TCP / IP, por ejemplo).

viejo contador de tiempo
fuente