Perché le porte USB vengono talvolta definite porte seriali e denominate COM?


13

Per quanto riguarda la mia comprensione delle porte del computer,

  1. Una porta seriale è una spina a 9 pin come quella mostrata qui ed è anche chiamata porta COM.
  2. Le porte USB sono uno standard diverso dalle porte seriali.

Perché allora vedo spesso le porte USB chiamate "porte seriali" e, ad esempio nell'IDE di Arduino, le porte USB sono identificate dal prefisso COM? Inoltre, perché a volte è necessaria una porta COM virtuale se non sono coinvolte porte seriali? (Esempio: adattatore Prologix GPIB-USB.)

Questo uso dello stesso nome per descrivere due cose diverse che penso può essere un po 'confuso.

Schermata dall'IDE di Arduino, mostrato il comando di menu Strumenti → Porta seriale → COM14


2
USB è una comunicazione seriale.

3
Forse perché hai un dispositivo USB che funziona come una porta seriale ? Qualcosa che ha uno di quei chip da USB a seriale FTDI (FT232) o Prolific (PL2303) o forse un MCU con un'implementazione software dello stesso? La loro visualizzazione nello stesso spazio dei nomi delle porte seriali fissate sulla scheda madre (o nelle schede PCI (e)) rende l'interfaccia più semplice per il software: non ha bisogno di sapere come la porta viene implementata fisicamente, solo che cacca come una porta seriale.
ilkkachu,

4
Potrebbe aiutare a rendersi conto che agli inizi del PC IBM e di molti dei suoi predecessori, una "porta seriale" non si trovava in genere sulla scheda madre, ma era piuttosto un'interfaccia su una scheda bus di espansione. Oggi questo concetto rimane relativamente vero in quanto esiste ancora un convertitore di interfaccia seriale distinto: solo il "bus di espansione" che lo ricollega al computer è ora USB, invece della vecchia estensione con connettore ISA del bus locale del processore.
Chris Stratton,

14
Universale quale autobus?
Hobbs,

4
@hobbs, è vero Universal Serial Bus. Un autobus. Molto distinto da una porta seriale, no? Anche senza lo stupido testo in grassetto.

Risposte:


27

Queste non sono porte USB indicate come porte seriali. Nel tuo esempio, Arduino ha un dispositivo da USB a seriale (sotto forma di un secondo microcontrollore o un chip FTDI). Questo userà l'USB per comunicare con il computer e formare una vera porta seriale verso il mondo esterno - simile ai dongle Wi-Fi USB o agli adattatori LAN USB, adattatori SATA USB, ecc.

La chiave è che in molti casi la porta seriale non è disponibile direttamente all'utente, in quanto è "cablata" nel dispositivo (in questo caso, collegata direttamente al microcontrollore che si sta programmando).

In teoria rigorosa, qualsiasi porta che utilizza le comunicazioni seriali (quasi tutti i bus moderni - incluso USB, che sta per "Universal Serial Bus", se la mia memoria mi serve) è una "porta seriale". Tuttavia, nella maggior parte dei casi, quando le persone si riferiscono alla "porta seriale", in realtà si riferiscono a una porta conforme a RS-232.


10
Ogni volta che qualcuno fa riferimento a una "porta seriale", quasi sicuramente significano RS-232 collegato tramite un connettore DE-9M. Se le persone significano USB, tendono a dire USB. Lo stesso per altri protocolli seriali come RS-485 o GPIB o le varie versioni di Ethernet.

5
@Felthry: "seriale" molto spesso significa segnalazione seriale asincrona (la "A" in "UART") che utilizza anche RS-232, ma a livelli di tensione logica standard, non RS-232. E possono o meno includere i pin di handshaking che portano al 9 pin (o 25 pin, che era l'originale per RS-232).
Ben Voigt,

2
Vero. Suppongo che sia un altro livello di abuso della terminologia, usando "RS-232" per indicare una variante a bassa tensione del protocollo. Ho pensato di menzionare anche il connettore DB-25M, ma non è molto rilevante qui.

7
@Felthry, scusate ma "ogni volta che qualcuno fa riferimento a una" porta seriale ", quasi sicuramente significano che RS-232 è collegato tramite un connettore DE-9M" è una visione incentrata su PC obsoleta. E i PC non sono stati realizzati con connettori a 9 pin sul retro da almeno un decennio. La popolazione di massa dei loro utenti non li ha mai toccati quando erano. Prodotti, apparecchiature e PCB in tutto il luogo utilizzano porte seriali, attraverso una varietà di connettori dedicati e ai livelli LVTTL o RS-232C. E gli ingegneri di questo sito sperimenteranno porte seriali in molti più modi rispetto a un vecchio standard per PC. Temo un mondo molto più diversificato di così.

4
@TonyM Forse sono stato in giro con troppe attrezzature della vecchia scuola. Noterò, tuttavia, che i computer sono ancora comunemente realizzati con connettori DE9 su di essi - non solo per il mercato consumer. Sono onnipresenti nell'industria e nella ricerca, perché probabilmente dovrai interfacciarti con i sistemi realizzati negli anni '90 o prima, quando erano comuni. Dopotutto, le persone non aggiornano le loro apparecchiature industriali come se dovessi aggiornare il tuo telefono! Come ho detto, è un abuso di terminologia. Forse "quasi certamente" era una formulazione troppo forte, ma è un uso molto comune.

18

È confuso perché Windows COM: le porte provengono da un sistema di denominazione definito in MS-DOS (nato nel 1980). Questo è stato praticamente copiato da CP / M (nato nel 1974) con alcune idee tratte da Unix. Non hanno previsto l'aggiunta di un bus di "trasporto" intermedio come USB.

Molte cose in Windows sono sopravvissute all'evoluzione CP / M-> MS-DOS, come unità disco denominate in lettere, estensioni di file di 3 lettere, file .EXE e .COM e l'interfaccia di comando del prompt dei comandi.

Un altro sono i nomi dei dispositivi: generalmente tre lettere, che terminano sempre con due punti. COM: è una "porta di comunicazione" seriale, LPT: una "stampante di linea" (di solito appesa a una porta Centronics), NUL: scarica tutto ciò che viene inviato, CON: è la "console" (tastiera e schermo). Alcuni di cui potresti averne uno numerato per differenziarli. COM: le porte fanno, così come LPT: porte, diventando COM1: e LPT1: e così via.

Una porta COM: è un "endpoint": l'estremità remota del collegamento di comunicazione dal punto di vista di un PC Windows. Come molte altre cose nel campo dell'informatica, il bridge è ignorato ed è il componente remoto a cui stai pensando, non USB. Questo vale anche per una tastiera per PC (collegata come CPU-PCIe-USB-kbd) o un'unità di rete (collegata come CPU-PCIe-LAN-LAN-PCIe-CPU-PCIe-SATA o simile).

USB utilizza anche l'idea di endpoint. Un controller USB può collegare un PC host a tutti i tipi di hardware e fornirglielo come risorse. Quindi, quando vedi l'hardware collegato tramite USB, vedi questi endpoint. Una COM virtuale: la porta in un dispositivo USB è semplicemente una porta seriale che esce da quel dispositivo slave USB come endpoint. Windows gli darà un numero (COM1 :, COM27: ecc.) E quella porta seriale può essere riconosciuta e utilizzata da qualsiasi programma usando l'API Windows standard per le porte COM:.

Alcuni hardware collegati tramite USB potrebbero preferire la rappresentazione di una porta seriale perché semplifica lo sviluppo del software Windows. Non è necessario scrivere alcun driver di dispositivo, il che consente di risparmiare molto lavoro: il dispositivo USB comunica a Windows che si tratta di una porta seriale. Dal punto di vista del PC, va bene se si comporta come una porta seriale (i byte vengono inviati e ricevuti in un flusso seriale infinito che è sempre aperto). Quindi ci sono vantaggi per lo sviluppatore.


4
Non ho mai visto i nomi dei dispositivi finire tra i due punti. Nella riga di comando dici anche ad esempio type file.txt > lpt1senza due punti. E nel file manager predefinito di Windows, Explorer, non è possibile creare un file chiamato ad esempio COM o LPT1 (almeno in Windows XP, forse anche in un secondo momento). Dove si possono effettivamente vedere i due punti dopo il nome del dispositivo?
Ruslan,

2
@Ruslan, hai ragione che sono opzionali in Windows che li ha rilasciati, accetta entrambi a differenza di MS-DOS. Ma non averli mai visti ... (a) cercare un testo sui dispositivi MS-DOS; (b) in CP, digitare 'mode /?' e guarda la sintassi del comando usato per impostare i parametri COMn: e LPTn: port, provali se vuoi; (c) nel Prompt dei comandi, digita "copia con: nul:" e guarda come funziona (Ctrl-C per terminare).

1
@Ruslan Colon è lì perché è un dispositivo come un altro. Non è il colon che è speciale -copy con:filename.txt nul funziona perfettamente, esattamente come copy c:filename.txt nul. Almeno per quanto riguarda MS-DOS 6.22, i due punti possono essere omessi nella maggior parte dei casi, poiché non presentano alcuna ambiguità; a differenza dei nomi delle unità, questi dispositivi sono stati riservati, quindi non si verificano problemi di copy file.txt c(devo copiare il file nella directory corrente sull'unità c o in un file chiamato "c" nella mia directory corrente?) .
Luaan,

7

Per aggiungere alla risposta di Joren Vaes : tenere presente che alcune app software (come Arduino IDE) installano un driver di Windows che crea porte "COM virtuali". Quando tali porte sono attivate, i sistemi operativi indicano ai programmi che è disponibile una porta COM, che assomiglia a una porta seriale standard [*], a cui i programmi (come Arduino IDE, ma anche qualsiasi altro) possono inviare e ricevere bit come a qualsiasi porta seriale. Sotto il cofano, tuttavia, quei bit vengono inviati a un cavo USB. All'interno della scheda Arduino succede qualcosa di analogo.

[*] E, per "porta seriale standard" qui intendiamo il protocollo RS-232, il tipo tradizionalmente trasmesso tramite connettore DB-9 o DB-25. Nel nostro contesto non importa affatto che l'USB sia anche "seriale".


7

La comprensione della differenza tra la porta COM e la porta USB è corretta.

La risposta breve alla tua domanda, perché alcune porte USB sono mappate dal sistema operativo come porte "COM", è: ci sono dispositivi USB che implementano USB CDC (Communication Device Class). Questi dispositivi forniscono un bridge da un'interfaccia USB terribilmente complicata a un'interfaccia standard di tipo UART / RS-232. Per la trasparenza per gli utenti, il sistema operativo carica i driver USB che imitano il livello di trasporto come porta COM, una porta COM virtuale. Seguono alcuni dettagli storici e giustificazioni per questo approccio.

La porta COM utilizza connettori DB-9 / DB-15 (aka RS-232 seriale o UART) e i controller per queste porte sono mappati fisicamente nell'hardware del PC, a indirizzi specifici nello spazio I / O. Questo controller COM sta diventando obsoleto nei PC moderni e si estingue.

Allo stesso tempo, molte MCU usano ancora la comunicazione seriale RS-232 come mezzo principale per comunicare con il mondo periferico. Il motivo è che l'hardware (e il software) per questo tipo di collegamento è molto semplice e facile da implementare. Inoltre, tutte le moderne comunicazioni di sviluppo / debug di Android vengono eseguite in stile porta COM. Inoltre, molti dispositivi "di comunicazione" (come modem, incluso 4G LTE e successivi), utilizzano ancora l'interfaccia in stile UART con protocollo di controllo di tipo ASCII su più porte "COM".

Ora gli sviluppatori hanno un dilemma, come comunicare con tali micro-controller se il PC di sviluppo host non ha porte COM? La soluzione era utilizzare porte USB e dispositivi USB speciali che collegano il protocollo USB con l'interfaccia RS-232 della porta COM. Esistono dispositivi USB dedicati come chip FTDI e molti altri (Cypress, Microchip, ecc.) Realizzano dispositivi che svolgono questa funzione bridge.

Ora, tutte le comunicazioni native con queste MCU sono ancora espresse in termini di protocollo RS-232 e la maggior parte degli esempi di applicazione presuppone l'uso di alcune applicazioni Terminali (TeraTerm, HyperTerminal, ecc.) Per utilizzare il collegamento. Per comodità dell'utente, i bridge da USB a UART sono dotati di driver che rappresentano la porta come porta COM virtuale. Tutti i software moderni utilizzano la virtualizzazione dell'hardware COM, che fornisce una transizione graduale ai PC "senza COM". Diventa una pratica comune aggiungere un bridge FTDI dedicato alle porte UART su una piattaforma di sviluppo MCU (e utilizzare i driver FTDI sul PC host per rendere la porta USB simile alla porta COM) o incorporare il codice bridge corretto nell'MCU stesso (se ha funzionalità USB nativa).

L'approccio diretto consiste nell'utilizzare una scheda da USB a UART esterna e collegare l'UART all'MCU in fase di sviluppo. Oppure, se una scheda ha già il connettore DB-9, ci sono dongle USB che possono essere collegati direttamente ad esso.

In tutti i casi il controllo UART nativo di MCU apparirà sul lato host come una porta COM virtuale, saltando tutte le trasformazioni di segnale / protocollo intermedie. Ecco perché oggi le persone spesso saltano la distinzione tra bridge da USB a UART e porte COM.


3

È molto confuso, ma non devi preoccuparti. Prima di tutto, pensa a un UART che di per sé è un termine generico, ma pensa a uno che produce un protocollo con un bit iniziale, uno o due bit di stop, 7 o 8 bit di dati di solito, e talvolta parità che è pari o dispari; può variare da lì, il che lo rende molto peggio.

L'UART è ai livelli TTL, qualunque cosa significhi. Una volta era 5 V e ora 3,3 V, 1,8 V o altro; forse TTL è il termine sbagliato. ALLORA hai avuto / hai RS-232, RS-422, ecc. Questi sono gli standard TENSIONE E PIN, non standard di protocollo. Non è corretto mescolare i termini e dire RS-232 quando si intende una sorta di UART.

In passato il tuo UART era sulle tue schede madri e desideravi una sorta di connettore verso il mondo esterno con livelli di tensione che all'epoca avevano senso e una sorta di pinout / cavo standard. Quindi un popolare standard a 25 e 9 pin è stato spesso trovato per varie periferiche, e nel mondo dei PC Wintel questa era chiamata porta COM o talvolta porta seriale.

Certo, una porta che trasporta dati seriali può essere chiamata porta seriale, SPI, I²C, MDIO, UART, HDLC, SDLC, ecc. E forse anche USB e SCSI; potresti impazzire con questo. Di solito una porta seriale indica alcuni pin che puoi ottenere su una UART.

Il mondo Unix / Linux dice ttyinvece di com/ serial/ uart, ma è la stessa cosa.

Ora c'è l'ATTUAZIONE. Puoi acquistare un chip UART con qualche interfaccia su di esso (sì, puoi avere un UART SPI, che è seriale su entrambe le estremità, o U² I²C o un bus dedicato o USB, ecc.). Già nel giorno in cui l'UART aveva un bus su un lato attraverso il quale la CPU stava comunicando. Oggi abbiamo FTDI e altri fornitori che realizzano piacevoli soluzioni USB UART, non rendono diversi alcuni strati di interfaccia tra il software e l'UART e quindi l'altro lato di UART ha qualche interfaccia, sia esso a livello di TTL / chip o RS-232C o RS-422, ecc.

I primi Arduinos utilizzavano spesso una scheda FTDI da USB a UART che forniva anche alimentazione all'Arduino. Alcuni hanno quell'alimentazione USB e seriale / UART sulla scheda Arduino stessa e quindi sono collegati attraverso la scheda all'UART sul chip AVR (stesso affare alcuni processori con alcuni strati di bus per consentire al software di comunicare con un UART che ha qualche interfaccia dall'altra parte, in questo caso i pin sul bordo dell'AVR, a livelli di tensione del chip, TTL).

Poiché la funzionalità UART non è cambiata da decenni, perché la terminologia del software o persino le applicazioni software dovrebbero cambiare a livello di applicazione? Scrivi un'applicazione TTY Linux / Unix 10-15 anni fa contro un chip UART sulla tua scheda madre e ci sono buone probabilità che funzioni ancora oggi con un livello da USB a TTL o da USB a RS-232C o RS-422 o qualunque altro pin / definizione di livello. Lo stesso vale per Windows e ho un codice così vecchio che funziona ancora su entrambi. Nel mondo Windows viene usato il termine COM.

Non uso la sandbox di Arduino da un po 'e se così fosse su Linux, ma non sarei sorpreso se quel programma che è Java, se ricordo bene, è generico e usa il nome di sistema ttyS2su Linux e COM2 Su Windows.

Rileggere la tua domanda può andare molto oltre, sfruttando la quantità già esistente di software che utilizza queste chiamate API. Ancora una volta per decenni non c'è motivo per cui non è possibile creare una porta virtuale nel software che trasporta questi dati bidirezionali praticamente qualsiasi cosa si possa pensare. UART to Ethernet è molto comune e nelle sale server in cui i server utilizzano ancora le porte COM / TTY / RS-232, è possibile disporre di un server terminal con un numero di interfacce che è possibile collegare a un numero di server, quindi Ethernet dall'altro lato, quindi se si sceglie di non effettuare il telnet in, è possibile installare un driver di porta COM virtuale.

Quindi l'applicazione sul tuo computer pensa che stia parlando a una porta COM, ma in realtà quel flusso di byte passa su Ethernet quindi colpisce il terminal server, POI, su un UART a livello RS-232C (ma non necessariamente pinout) cavi a il server e ritorno allo stesso modo.

A volte non vi è alcun motivo per passare effettivamente a un UART reale, per qualsiasi motivo virtualizzare una porta COM in modo che il software scritto per quelle chiamate API possa ancora funzionare. Potresti forse pensare all'antico software bancario che usiamo ancora che ha un terminale stupido a un'interfaccia UART che forse in passato era cablato o è andato in un modem per eventualmente un server. Puoi farlo in modo che il software funzioni ancora, attraverso varie quantità di emulazione inclusa una porta COM virtuale che oggi probabilmente passa Ethernet al server come un flusso seriale (ad esempio TCP / IP).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.