Wat is een com-poort op een computer? De com-usb-poort aansluiten in Windows

StopBits- stelt het aantal stopbits in. Het veld kan
neem de volgende waarden:


  • EEN STOPBIT- één stopbit;
  • EEN5STOPBIT- anderhalve stopbit (praktisch niet
    gebruikt);
  • TWEETOPBIT- twee stopbits.

Nadat alle velden van de DCB-structuur zijn ingevuld, moet u dit doen
configureer de poort door de SetCommState-functie aan te roepen:

BOOL SetCommState(

HANDVAT hBestand,

LPDCB lpDCB

Als dit lukt, retourneert de functie niet-nul
waarde, en in geval van een fout - nul.

De tweede vereiste structuur voor het configureren van een poort is
structuur COMMTIMEOUTS. Het definieert de parameters van tijdvertragingen
bij het ontvangen en verzenden. Hier is een beschrijving van deze structuur:

typedef struct _COMMTIMEOUTS (

DWORD ReadIntervalTimeout;

DWORD ReadTotalTimeoutMultiplier;

DWORD ReadTotalTimeoutConstant;

DWORD WriteTotalTimeoutMultiplier;

DWORD WriteTotalTimeoutConstante;

) COMMTIMEOUTS,*LPCOMMTIMEOUTS;

De velden van de COMMTIMEOUTS-structuur hebben de volgende betekenis:


  • LeesIntervalTimeout- maximale termijn
    (in milliseconden) toegestaan ​​tussen twee lees-s
    communicatielijn met opeenvolgende karakters. Tijdens
    leesbewerkingen, begint de tijdsperiode vanaf het moment te tellen
    het eerste teken ontvangen. Als het interval tussen twee
    opeenvolgende tekens de opgegeven waarde overschrijden, wordt de bewerking uitgevoerd
    het lezen is voltooid en alle gegevens die in de buffer zijn verzameld, worden overgedragen
    naar het programma. Een nulwaarde voor dit veld betekent dat dit
    er wordt geen time-out gebruikt.
  • LeesTotalTimeoutMultiplier- stelt de vermenigvuldiger in (in


    vermenigvuldigd met het aantal tekens dat moet worden gelezen.
  • ReadTotalTimeoutConstante- specificeert een constante (in

    bewerkingen lezen. Voor elke leesoperatie deze waarde
    wordt opgeteld bij het resultaat van het vermenigvuldigen van ReadTotalTimeoutMultiplier met
    aantal tekens dat moet worden gelezen. Nulveldwaarde
    ReadTotalTimeoutMultiplier en ReadTotalTimeoutConstant betekent
    dat de algemene time-out voor de leesbewerking niet wordt gebruikt.
  • WriteTotalTimeoutMultiplier- stelt de vermenigvuldiger in (in
    milliseconden) gebruikt om de totale time-out te berekenen

    vermenigvuldigd met het aantal geschreven tekens.
  • WriteTotalTimeoutConstante- specificeert een constante (in
    milliseconden) gebruikt om de totale time-out te berekenen
    bewerkingen schrijven. Voor elke schrijfbewerking is deze waarde
    wordt opgeteld bij het resultaat van het vermenigvuldigen van WriteTotalTimeoutMultiplier met
    aantal te schrijven tekens. Nulveldwaarde
    WriteTotalTimeoutMultiplier en WriteTotalTimeoutConstant betekent
    dat de algemene time-out voor de schrijfbewerking niet wordt gebruikt.

Nog even over time-outs. Laten we lezen vanaf poort 50
tekens bij 9.600 bps. Als er 8 bits worden gebruikt
per teken, pariteitscomplement en één stopbit, en vervolgens met één
een teken op een fysieke lijn is 11 bits lang (inclusief het startbit).
Dit betekent dat 50 tekens met een snelheid van 9.600 bps worden ontvangen

50×11/9600=0,0572916 s

of ongeveer 57,3 milliseconden, uitgaande van een interval van nul
tussen het ontvangen van opeenvolgende tekens. Als het interval tussen
symbolen is ongeveer de helft van de transmissietijd van één
teken, d.w.z. 0,5 milliseconden, dan zal de ontvangsttijd zijn

50×11/9600+49×0,0005=0,0817916 s

of ongeveer 82 milliseconden. Als tijdens het leesproces meer dan
82 milliseconden, dan kunnen we aannemen dat er een fout is opgetreden
werking van het externe apparaat en we kunnen daardoor stoppen met lezen
om te voorkomen dat het programma bevriest. Dit is de algemene time-out voor de bewerking
lezing. Op dezelfde manier is er een algemene time-out voor de schrijfbewerking.

De formule om de totale time-out van een bewerking te berekenen, b.v.
lezen ziet er als volgt uit:

NumOfChar x ReadTotalTimeoutMultiplier +
ReadTotalTimeoutConstante

waarbij NumOfChar het aantal tekens is dat is aangevraagd voor de leesbewerking.

In ons geval kunnen opnametime-outs worden weggelaten
zet ze op nul.

Nadat u de COMMTIMEOUTS-structuur heeft ingevuld, moet u bellen
functie voor het instellen van time-outs:

BOOL SetCommTimeouts(

HANDVAT hBestand,

LPCOMMTIMEOUTS lpCommTimeouts

Omdat transmissie- en ontvangstbewerkingen op lage snelheid worden uitgevoerd,
Er wordt gebruik gemaakt van gegevensbuffering. Om de ontvangstbuffergrootte in te stellen en
overdracht moet u de functie gebruiken:

BOOL-instellingenComm(

HANDVAT hBestand,

DWORD dwInQueue,

DWORD dwOutQueue

Stel dat u pakketten uitwisselt met een extern apparaat
informatiegrootte van 1024 bytes, daarna een redelijke omvang van de buffers
de waarde zal 1200 zijn. De functie SetupComm is interessant omdat dit mogelijk is
houd gewoon rekening met uw metingen en voer uw eigen aanpassingen uit, of
verwerp uw voorgestelde buffergroottes helemaal - in dit geval
deze functie zal mislukken.

Ik zal een voorbeeld geven van het openen en configureren van een serieel bestand
COM1-poort. Kortheidshalve - zonder fouten te definiëren. In dit voorbeeld
poort gaat open om te werken op 9.600 bps, 1 wordt gebruikt
stopbit, pariteitsbit niet gebruikt:

#erbij betrekken

. . . . . . . . . .

HANDVAT handvat;

COMMTIMEOUTS CommTimeOuts;

DCB DCB;

handle = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE,
NULL, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

SetupComm(handvat, SizeBuffer, SizeBuffer);

GetCommState(handvat, &dcb);

dcb.BaudRate = CBR_9600;

dcb.fBinair = WAAR;

dcb.fOutxCtsFlow = ONWAAR;

dcb.fOutxDsrFlow = ONWAAR;

dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;

dcb.fDsrSensitivity = ONWAAR;

dcb.fNull = ONWAAR;

dcb.fRtsControl = RTS_CONTROL_DISABLE;

dcb.fAbortOnError = ONWAAR;

dcb.ByteSize = 8;

dcb.Pariteit = NOPARITEIT;

dcb.StopBits = 1;

SetCommState(handvat, &dcb);

CommTimeOuts.ReadIntervalTimeout= 10;

CommTimeOuts.ReadTotalTimeoutMultiplier = 1;

// de waarden van deze time-outs zijn voldoende voor een zelfverzekerde
receptie

// zelfs bij 110 baud

CommTimeOuts.ReadTotalTimeoutConstant = 100;

// in dit geval gebruikt als wachttijd
pakketten

CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

CommTimeOuts.WriteTotalTimeoutConstant = 0;

SetCommTimeouts(handvat, &CommTimeOuts);

PurgeComm(handvat, PURGE_RXCLEAR);

PurgeComm(handvat, PURGE_TXCLEAR);

Nadat u de poort hebt geopend, moet u deze eerst resetten, dus
hoe er “rommel” in de ontvangst- en verzendbuffers kan zitten. Daarom binnen
Aan het einde van het voorbeeld hebben we een functie gebruikt die voorheen onbekend voor ons was
PurgeComm:

BOOL PurgeComm(

HANDVAT hBestand,

DWORD-dwFlags

Deze functie kan twee dingen doen: wachtrijen wissen
ontvangst en verzending in de driver of voltooi alle handelingen
IO Welke acties moeten worden uitgevoerd, wordt door anderen bepaald
parameter:


  • PURGE_TXABORT
    dossiers, zelfs als ze niet zijn ingevuld;
  • PURGE_RXABORT- stopt onmiddellijk alle bewerkingen
    lezingen, zelfs als ze niet zijn voltooid;
  • PURGE_TXCLEAR- wist de transmissiewachtrij in de bestuurder;
  • PURGE_RXCLEAR- wist de ontvangstwachtrij
    bestuurder.
    Deze waarden kunnen bitwise worden gecombineerd
    OF operaties. Het wordt ook aanbevolen om buffers na fouten te wissen
    ontvangst en verzending en na voltooiing van de werkzaamheden met de haven.

Het is tijd om naar de operaties zelf te kijken.
lezen-schrijven voor de poort. Wat betreft het werken met bestanden, ze worden gebruikt
ReadFile- en WriteFile-functies. Hier zijn hun prototypes:

BOOL Leesbestand(

HANDVAT hBestand,

LPVOID lpBuffer,

DWORD nNumOfBytesToRead,

LPDWORD lpNumOfBytesLezen,

LPOVERLAPPED lpOverlapt

BOOL schrijfbestand(

HANDVAT hBestand,

LPVOID lpBuffer,

DWORD nNumOfBytesToWrite,

LPDWORD lpNumOfBytesGeschreven,

LPOVERLAPPED lpOverlapt

Laten we eens kijken naar het doel van de parameters van deze functies:


  • hBestand- descriptor van het open communicatiebestand
    haven;
  • lpBuffer- bufferadres. Voor een schrijfbewerking worden gegevens van
    deze buffer wordt naar de poort gestuurd. Voor een leesoperatie hierin
    de buffer zal gegevens bevatten die zijn ontvangen van de lijn;
  • nAantalBytesToRead, nAantalBytesToWrite- aantal verwacht
    bytes bedoeld voor ontvangst of verzending;
  • nAantalBytesLezen, nAantalBytesGeschreven- werkelijk aantal
    bytes ontvangen of verzonden. Als er minder wordt ontvangen of verzonden
    gegevens dan gevraagd, dan geeft dit voor het schijfbestand dit aan
    over een fout, maar over een communicatiepoort - helemaal niet nodig.
    De reden is time-outs.
  • LpOverlapt- adres van de gebruikte OVERLAPPED-structuur
    voor asynchrone operaties.

Als de functies normaal worden voltooid, retourneren ze de waarde
verschillend van nul, in geval van een fout - nul.

Hier is een voorbeeld van een lees- en schrijfbewerking:

#erbij betrekken

…………..

DWORD numbytes, numbytes_ok, temp;

COMSTAT ComState;

OVERLAPPED Overlap;

char buf_in = "Hallo!";

aantalbytes = 6;

// als de temperatuur niet nul is, bevindt de poort zich in een status
fouten

if(!temp) WriteFile(handle, buf_in, aantalbytes,
&numbytes_ok, &Overlap);

ClearCommError(handle, &temp, &ComState);

if(!temp) ReadFile(handle, buf_in, numbytes, &numbytes_ok,
&Overlappen);

// de variabele numbytes_ok bevat een reëel getal
overgedragen-

// ontvangen bytes

In dit voorbeeld hebben we twee voorheen onbekende voor ons gebruikt
COMSTAT- en OVERLAPPED-structuren, evenals de ClearCommError-functie. Voor
In ons geval van communicatie “over drie draden” kan de OVERLAPPED-structuur niet bestaan
overweeg (gewoon gebruiken zoals in het voorbeeld). Functie-prototype
ClearCommError ziet er als volgt uit:

BOOL ClearCommError(

HANDVAT hBestand,

LPDWORD lpFouten,

LPCOMSTAT lpStat

Deze functie reset de poortfoutvlag (als die er was).
plaats) en retourneert informatie over de toestand van de haven in de structuur
COMSTAT:

typedef struct _COMSTAT

DWORD-fCtsHold:1;

DWORD fDsrHold:1;

DWORD fRlsdHold:1;

DWORD fXoffHold:1;

DWORD fXoffVerzonden:1;

DWORD fEvan:1;

DWORD fTxim:1;

DWORD fGereserveerd:25;

DWORD cbInQue;

DWORD cbOutQue;

) COMSTAT, *LPCOMSTAT;

We kunnen twee velden van deze structuur nuttig vinden:


  • CbInQue- aantal tekens in de ontvangstbuffer. Deze karakters
    geaccepteerd vanaf de regel, maar nog niet gelezen door de ReadFile-functie;
  • CbOutQue- aantal tekens in de verzendbuffer. Deze
    tekens zijn nog niet naar de regel overgebracht.

De overige velden van deze structuur bevatten informatie over
fouten.

Als u ten slotte klaar bent met het gebruik van de poort, moet u deze sluiten.
Het sluiten van een object in Win32 wordt uitgevoerd door de CloseHandle-functie:

BOOL CloseHandle(

HANDVAT hObject

Op onze website vind je de volledige tekst van de les om mee te werken
seriële poort in asynchrone modus “over drie draden”, en
Zie ook een voorbeeldprogramma dat deze klasse gebruikt. Dit alles
geschreven onder Builder C++, maar omdat alleen functies worden gebruikt
API Win32, programmatekst kan eenvoudig worden gewijzigd voor elke C++-compiler.
Het is ook mogelijk dat de les niet volledig “volgens de regels” is geschreven - alstublieft
Sorry, de auteur is geen “echte” programmeur en schrijft als volgt:
hoe handig is het voor hem J.

O, wat is dit voor ding? Waarom is het nodig? Is het goed als ik het met mijn vinger aanraak? Wat? Beter niet? Oké, dat doe ik niet. Maar het is zo interessant voor mij: er zit een connector in de computer, maar om de een of andere reden sluit niemand er iets op aan. Hoe heet het eigenlijk? Haven? Wauw! Klas! Wat is dit?..

Deze poort wordt ook wel genoemd serieel (Seriële poort), hoewel de reductie "COM" betekent eigenlijk "mededeling" - communicatie poort(oorspronkelijk ontworpen voor gegevensverplaatsing in twee richtingen - echte communicatie). En nog vaker wordt het genoemd consistent, omdat het bits strikt één voor één verzendt.

Naast de seriële poort beschikken computers ook over een parallelle poort, vooral bedoeld voor het aansluiten van printers. Zo wordt het vaak genoemd: printer. Daar is de gegevensoverdracht nominaal eenrichtingsverkeer (hoewel slechts nominaal).

Het is goed mogelijk dat uw computer ook over een COM-poort beschikt. Dit is hoogstwaarschijnlijk een enigszins langwerpige fitting met negen contacten in twee rijen, vijf en vier in elke rij, en ook voorzien van schroefdraad voor bouten aan de uiteinden. Het wordt geleverd met een kabel met respectievelijk een connector en negen aansluitingen in dezelfde configuratie.

De connector wordt met contacten in de fitting gestoken en met de bovenstaande bouten vastgeschroefd om er niet uit te vallen. Zo kunt u bijvoorbeeld twee computers rechtstreeks met elkaar verbinden via een nulmodemkabel. Dit is wat vroeger werd gedaan, in het tijdperk van de eerste pc's.

Tegenwoordig zijn satellietontvangers, apparaten van verschillende beveiligingssystemen, controlesystemen voor productieprocessen en andere duistere apparaten op deze manier met elkaar verbonden.

Waarschijnlijk zit zo'n poort in je laptop (uiteraard als je er een in huis hebt). Het wordt bijvoorbeeld gebruikt om te synchroniseren met een desktopcomputer. Toegegeven, in de praktijk wordt zo'n verbinding tegenwoordig niet vaak gebruikt - niemand wil zichzelf voor de gek houden met kabels, omdat andere technologieën die moderner en efficiënter zijn, kunnen worden gebruikt.

Tegenwoordig wordt een USB-poort steeds vaker gebruikt voor communicatie met verschillende apparaten (deze is overigens ook daadwerkelijk serieel). Mobiele modems, printers, Wi-Fi-adapters: steeds meer apparaten zijn via USB verbonden.

Bovendien is het, met de beschikbaarheid van technologieën zoals Ethernet en FireWire (voor Apple), niet zo praktisch om computers met kabels via COM-poorten te verbinden. Nou, als je je Bluetooth herinnert (wat zich vertaalt als "bluetooth"), dan kun je zelfs de seriële poort naar het museum sturen.

Het Windows-besturingssysteem noemt de kanalen voor informatieoverdracht echter nog steeds COM1, COM2, enzovoort.

Waarom? Omdat stuurprogramma's voor bijvoorbeeld Bluetooth voor het systeem precies als COM-poorten kunnen verschijnen. Hier zijn we dan, geef ons alstublieft liefde en gunst, wijs ons alstublieft kanalen toe voor gegevensuitwisseling. Dus wat als we niet helemaal echt zijn? Je zult ons nog steeds moeten bedienen.

Unix (en zijn varianten zoals Linux) heeft ook enkele eigenaardigheden met betrekking tot de houding ten opzichte van verbonden apparaten. Omdat Unix alles in de omgeving als bestanden beschouwt (zelfs hardware!), behoudt het zijn seriële poorten in de vorm ervan met namen als ttyS0, ttyS1, ttyS2 (als het Linux is) of ttyu0, ttyu1, ttyu2 (in FreeBSD).

Als je een eenvoudige gebruiker bent en niet met specifieke apparaten, satellietontvangers en andere lastige apparaten werkt, dan is het absoluut niet nodig om naar computerwinkels te rennen en een kabel voor een COM-poort te zoeken.

Gegevens van de ene computer naar de andere kunnen op veel andere manieren worden overgedragen, ook zonder kabels. Als laatste redmiddel kunt u het overbrengen naar een flashstation als het lokale netwerk om de een of andere reden niet functioneert.

Kortom, hoewel zoiets als een COM-poort vanuit het oogpunt van het besturingssysteem blijft bestaan ​​en zelfs virtueel als communicatiekanaal wordt gebruikt, kunnen de meeste gebruikers dit in de praktijk met een volkomen zuiver geweten vergeten.

Het is waar dat nieuwsgierigheid altijd prijzenswaardig is. Dus vraag, wees geïnteresseerd, studeer. Maar het is beter om het niet zonder toestemming met je handen aan te raken.

Eerdere publicaties:

Onlangs heeft de seriële methode van datatransmissie de parallelle methode vervangen.
Naar voorbeelden hoef je niet ver te zoeken: de opkomst van USB- en SATA-bussen spreekt voor zich.
Omdat een parallelle bus moeilijk te schalen is (verleng de kabel, verhoog de busklokfrequentie), is het niet verrassend dat technologieën parallelle bussen de rug toekeren.

Seriële interfaces

Tegenwoordig zijn er een groot aantal verschillende interfaces voor seriële gegevensoverdracht.
Naast de reeds genoemde USB en SATA kun je ook nog minstens twee bekende standaarden RS-232 en MIDI (ook wel GamePort genoemd) herinneren.
Ze hebben allemaal hetzelfde gemeen: de sequentiële overdracht van elk stukje informatie, oftewel de seriële interface.
Er zijn heel veel voordelen aan dergelijke interfaces, en de belangrijkste daarvan is een klein aantal aansluitdraden, en dus een lagere prijs.

Gegevensoverdracht

Seriële datatransmissie kan op twee manieren worden geïmplementeerd: asynchroon en synchroon.

Synchrone gegevensoverdracht omvat het synchroniseren van de werking van de ontvanger en zender door klokinformatie op te nemen in het verzonden signaal of door een speciale synchronisatielijn te gebruiken.
De ontvanger en zender moeten met elkaar verbonden worden door een speciale synchronisatiekabel, die ervoor zorgt dat de apparaten op dezelfde frequentie werken.

Bij asynchrone verzending wordt gebruik gemaakt van speciale bits die het begin en einde van gegevens markeren: een startbit (logische nul) en een stopbit (logische één).
Het is ook mogelijk om een ​​speciale pariteitsbit te gebruiken, die bepaalt of het aantal te verzenden één-bits even of oneven is (afhankelijk van de aangenomen conventie).
Aan de ontvangende kant wordt dit bit geanalyseerd en als het pariteitsbit niet overeenkomt met het aantal één-bits, wordt het datapakket opnieuw verzonden.

Het is vermeldenswaard dat u met een dergelijke controle alleen een fout kunt detecteren als er slechts één bit onjuist is verzonden; als er meerdere bits onjuist zijn verzonden, wordt deze controle onjuist.
Het verzenden van het volgende datapakket kan op elk moment na het verzenden van de stopbit plaatsvinden en moet uiteraard beginnen met de startbit.
Is er iets duidelijk?

Als alle computertechnologieën eenvoudig waren, zou elke huisvrouw al lang geleden nieuwe protocollen hebben ontwikkeld, parallel aan dumplings...
Laten we proberen het proces anders te bekijken.
Gegevens worden verzonden in pakketten, net als IP-pakketten. Naast de gegevens zijn er ook informatiebits, het aantal van deze bits kan variëren van 2 tot 3 en een half.
En de helft?!
Ja, je hoort het goed: precies de helft!

Het stopbit, of beter gezegd het verzonden signaal dat overeenkomt met het stopbit, kan een langere duur hebben dan het signaal dat overeenkomt met het ene bit, maar korter dan voor twee bits.
Een pakket begint dus altijd met een startbit, dat altijd nul is, gevolgd door databits, dan een pariteitsbit en dan een stopbit, dat altijd één is.
Dan, na een willekeurige periode, gaat de opmars van de beats tegen Moskou verder.

Deze manier van verzenden houdt in dat de ontvanger en zender met dezelfde snelheid moeten werken (nou ja, of bijna met dezelfde snelheid), anders heeft de ontvanger ofwel geen tijd om de binnenkomende databits te verwerken, ofwel zal hij het oude bit verwarren met een nieuwe.
Om dit te voorkomen, wordt elke bit gepoort, dat wil zeggen synchroon verzonden met een speciaal signaal - een "flitser", gegenereerd in het apparaat.
Er zijn een aantal specifieke snelheden voor asynchrone apparaten: 50, 75, 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19.200, 38.400, 57.600 en 115.200 bits per seconde.

U heeft waarschijnlijk gehoord dat de maateenheid voor de gegevensoverdrachtsnelheid “baud” is: de frequentie van veranderingen in de lijnstatus, en deze waarde zal alleen samenvallen met de gegevensoverdrachtsnelheid als het signaal een van de twee waarden kan hebben.
Als meerdere bits worden gecodeerd in één signaalverandering (en dit gebeurt bij veel modems), zullen de transmissiesnelheid en de lijnveranderingsfrequentie totaal verschillende waarden zijn.

Nu een paar woorden over de mysterieuze term ‘datapakket’.
Een pakket verwijst in dit geval naar een reeks bits die worden verzonden tussen de start- en stopbits.
Hun aantal kan variëren van vijf tot acht.
Je vraagt ​​je misschien af ​​waarom vijf tot acht bits?
Waarom zou u niet in één keer bijvoorbeeld een kilobyte aan gegevens binnen een pakket overdragen?

Het antwoord ligt voor de hand: bij het verzenden van kleine datapakketten kunnen we verliezen door er drie servicebits mee te sturen (van 50 tot 30 procent van de data), maar als het pakket beschadigd raakt tijdens de verzending, kunnen we het gemakkelijk herkennen (denk aan de pariteitsbit?) en verzend hem snel opnieuw.
Maar het zal moeilijk zijn om een ​​fout in een kilobyte aan gegevens te detecteren, en het zal veel moeilijker zijn om deze te verzenden.

Een voorbeeld van een apparaat voor asynchrone seriële gegevensoverdracht is een COM-poort van een computer, een favoriete modem ontworpen door Trussardi, en een muis die op dezelfde poort is aangesloten, die stomme secretaresses om de een of andere reden altijd proberen in PS/2 te stoppen.
Al deze apparaten werken via de RS-232-interface, of beter gezegd via het asynchrone deel ervan, aangezien de standaard ook synchrone gegevensoverdracht beschrijft.

AMD Radeon Software Adrenalin Edition 19.9.2 Optioneel stuurprogramma

De nieuwe AMD Radeon Software Adrenalin Edition 19.9.2 optionele driver verbetert de prestaties in Borderlands 3 en voegt ondersteuning toe voor Radeon Image Sharpening-technologie.

Cumulatieve update voor Windows 10 1903 KB4515384 (toegevoegd)

Op 10 september 2019 heeft Microsoft een cumulatieve update uitgebracht voor Windows 10 versie 1903 - KB4515384 met een aantal beveiligingsverbeteringen en een oplossing voor een bug die Windows Search kapot maakte en een hoog CPU-gebruik veroorzaakte.

Soms moet u het probleem oplossen van het verbinden van een elektronisch apparaat met een computer, of het nu gaat om gegevensuitwisseling of afstandsbediening. In dit artikel wordt beschreven hoe dit kan worden geïmplementeerd via een seriële poort. Het belangrijkste voordeel is dat de standaard Windows-programmeerinterface (API) directe controle over de uitvoerlijnen mogelijk maakt, er directe controle over geeft, en de functie heeft om te wachten op een gebeurtenis die verband houdt met de COM-poort. Bovendien maakt de RS-232-standaard, volgens welke de COM-poorten zijn gemaakt, het aansluiten en loskoppelen van kabels mogelijk terwijl de apparaten in werking zijn (hot-pluggable).

Beschrijving

COM-poort (seriële poort)– bidirectionele interface die gegevens in seriële vorm (bit voor bit) verzendt via het RS-232-protocol. Dit is een vrij gebruikelijk protocol dat wordt gebruikt om het ene apparaat (bijvoorbeeld een computer) met andere te verbinden via draden tot 30 meter lang. De logische signaalniveaus verschillen hier van de standaardniveaus: het logische éénniveau is van +5 tot +15V, het logische nulniveau is van -5 tot -15V, wat extra circuittransformaties vereist, maar een goede ruisimmuniteit biedt.

Overweeg een 9-pins connector (DB-9M). Hieronder vindt u de pin-out:

Pinnr. Naam Karakter van het signaal Signaal
1 DCD Invoer Gegevensdrager detecteren
2 RxD Vrije dag Gegevens verzenden
3 TxD Invoer Gegevens ontvangen
4 DTR Vrije dag Dataterminal gereed
5 GND - Grond
6 DSR Invoer Dataset gereed
7 RTS Vrije dag Verzoek om te verzenden
8 CTS Invoer Duidelijk om te verzenden
9 R.I. Invoer Ringindicator

We zullen het meest geïnteresseerd zijn in pin 2 (datatransmissie), 3 (dataontvangst) en 5 (aarde). Dit is de minimale instelling voor tweerichtingscommunicatie tussen apparaten.

Ik zal niet in detail ingaan op de beschrijving van het protocol. Hiervoor zijn er GOST's, enz. Daarom zullen we verder gaan en praten over hoe we dit beest kunnen beheersen.

Sollicitatie

Zoals reeds vermeld verschillen de RS-232 LAN-niveaus van de standaard TTL-niveaus. Daarom moeten we de spanningswaarden op de een of andere manier converteren. Die. maak 5V van +15V en 0V van -15V (en omgekeerd). Eén manier (en waarschijnlijk de eenvoudigste) is door een speciale MAX232-chip te gebruiken. Het is gemakkelijk te begrijpen en kan tegelijkertijd twee logische signalen omzetten.

Hieronder ziet u een diagram van de opname ervan:


Ik denk dat er geen problemen hoeven te zijn. Dit is één van de mogelijkheden om deze chip te gebruiken: data overbrengen van een microcontroller naar een computer en andersom. Het verzonden signaal gaat naar de T-pinnen X IN aan één kant en aan R X IN aan de andere kant. Ingangssignalen worden overgenomen van T X UIT en R X UIT respectievelijk.

Programmering

Laten we het eerst hebben over het programmeren van poorten op een laag niveau. Dit zal correcter zijn. Ik heb veel zenuwen besteed aan het begrijpen van deze interface totdat ik me begon te verdiepen in het principe van de werking ervan op een lager niveau dan eenvoudige karakteroverdracht. Als dit duidelijk is, zullen er geen problemen zijn met talen op hoog niveau.

Hieronder staan ​​de adressen van de COM-poorten waarmee we zullen moeten werken:

Naam van de haven Adres IRQ
COM1 3F8u 4
COM2 2F8u 3
COM3 3E8u 4
COM4 2E8u 3

Ze kunnen variëren. U kunt de waarden instellen in de BIOS-instellingen. Dit zijn de basisadressen. De adressen van de registers die verantwoordelijk zijn voor de werking van de havens zullen hiervan afhangen:

Adres DLAB Lezen/schrijven Afkorting Naam registreren
+ 0 =0 Schrijven Zenderhoudbuffer
=0 Lezen Ontvangerbuffer
=1 Lezen/schrijven Deler Vergrendeling Low Byte
+ 1 =0 Lezen/schrijven IER Onderbreken Activeren Registreren
=1 Lezen/schrijven Deler Vergrendeling Hoge byte
+ 2 - Lezen IIR Identificatieregister onderbreken
- Schrijven FCR FIFO-controleregister
+ 3 - Lezen/schrijven LCR Lijncontroleregister
+ 4 - Lezen/schrijven MCR Modemcontroleregister
+ 5 - Lezen LSR Lijnstatus registreren
+ 6 - Lezen MSR Modemstatus registreren
+ 7 - Lezen/schrijven Krasregister

De eerste kolom is het adres van het register ten opzichte van het basisadres. Voor COM1: het LCR-registeradres is bijvoorbeeld 3F8h+3=3FB. De tweede kolom is een DLAB-bit (Divisor Latch Access Bit), dat verschillende doeleinden voor hetzelfde register definieert. Hiermee kunt u 12 registers bedienen met slechts 8 adressen. Als DLAB=1 bijvoorbeeld, zullen we door toegang te krijgen tot adres 3F8h de waarde van de lage byte van de frequentiedeler van de klokgenerator instellen. Als DLAB = 0, wordt bij toegang tot hetzelfde adres de verzonden of ontvangen byte naar dit register geschreven.

“Nul”-register

Het komt overeen met registers voor het ontvangen/verzenden van gegevens en het instellen van de frequentiedelercoëfficiënt van de generator. Zoals hierboven vermeld, als DLAB = 0, wordt het register gebruikt om ontvangen/verzonden gegevens op te nemen, maar als het gelijk is aan 1, wordt de waarde van de lage byte van de frequentiedeler van de klokgenerator ingesteld. De datatransmissiesnelheid is afhankelijk van de waarde van deze frequentie. De hoge byte van de deler wordt naar de volgende geheugencel geschreven (dat wil zeggen: voor de COM1-poort is dit 3F9h). Hieronder ziet u de afhankelijkheid van de gegevensoverdrachtsnelheid van de delercoëfficiënt:

Onderbreken Enable Register (IER)

Als DLAB=0, wordt het gebruikt als register voor het besturen van interrupts van een asynchrone adapter; als DLAB=1, wordt de hoge byte van de frequentiedeler van de klokgenerator daarin ingesteld.

Interrupt Identificatie Register (IIR)

Een interrupt is een gebeurtenis die de uitvoering van het hoofdprogramma stopt en de uitvoering van de interruptroutine begint. Dit register bepaalt het type interrupt dat heeft plaatsgevonden.

Lijncontroleregister (LCR)

Dit is het controleregister.

Beetje 7 1 Divisor Latch Access Bit – instelling van de gegevensuitwisselingssnelheid
0 Normale modus (onderbrekingsregeling, gegevensontvangst/-overdracht)
Beetje 6 Regeleinde simuleren (stuurt een reeks van meerdere nullen)
Bits 3 – 5 Beetje 5 Beetje 4 Beetje 3 Pariteit selectie
X X 0 Geen pariteit
0 0 1 Vreemde pariteit
0 1 1 Zelfs pariteit
1 0 1 Hoge pariteit (plakkerig)
1 1 1 Lage pariteit (plakkerig)
Beetje 2 Aantal stopbits
0 1 stopbit
1 2 stopbits voor 6,7 of 8 databits of 1,5 stopbits voor 5 databits.
Bits 0 en 1 Beetje 1 Beetje 0 Aantal databits
0 0 5 bits
0 1 6 bit
1 0 7 bit
1 1 8 bit

Pariteitscontrole omvat de overdracht van nog een bit: de pariteitsbit. De waarde ervan wordt zo ingesteld dat het totale aantal enen (of nullen) in een pakket bits even of oneven is, afhankelijk van de instelling van de poortregisters. Deze bit wordt gebruikt om fouten te detecteren die kunnen optreden tijdens de gegevensoverdracht als gevolg van interferentie op de lijn. Het ontvangende apparaat herberekent de pariteit van de gegevens en vergelijkt het resultaat met de ontvangen pariteitsbit. Als de pariteit niet overeenkomt, wordt ervan uitgegaan dat de gegevens met een fout zijn verzonden.

Het stopbit geeft het einde van de gegevensoverdracht aan.

Modemcontroleregister (MCR)

Modemcontroleregister.

Beetje Betekenis
0 DTR-lijn
1 RTS-lijn.
2 Lijn OUT1 (reserve)
3 Lijn OUT2 (reserve)
4 Diagnose uitvoeren wanneer de ingang van een asynchrone adapter is kortgesloten met de uitgang.
5-7 Gelijk aan 0

Lijnstatusregister (LSR)

Een register dat de status van de lijn bepaalt.

Beetje Betekenis
0 Gegevens ontvangen en klaar om te worden gelezen, worden automatisch gereset wanneer gegevens worden gelezen.
1 Overloopfout. Er werd een nieuwe byte aan gegevens ontvangen, maar de vorige was nog niet door het programma gelezen. De vorige byte gaat verloren.
2 Pariteitsfout, gewist na het lezen van de lijnstatus.
3 Synchronisatiefout.
4 Er is een verzoek gedetecteerd om de transmissie "BREAK" te onderbreken: een lange reeks nullen.
5 Het zenderhoudregister is leeg en er kan een nieuwe byte naar worden geschreven voor verzending.
6 Het zenderschuifregister is leeg. Dit register ontvangt gegevens van het vasthoudregister en serialiseert deze voor verzending.
7 Time-out (apparaat is niet op de computer aangesloten).

Modemstatusregister (MSR)

Modemstatusregister.

Nou, dat is alles. Door deze registers te bedienen, kunt u rechtstreeks communiceren met de COM-poort en de verzending en ontvangst van gegevens regelen. Als u niet aan het geheugen wilt sleutelen, kunt u kant-en-klare componenten gebruiken voor verschillende programmeeromgevingen: C++, VB, Delphi, Pascal, enz. Ze zijn intuïtief, dus ik denk dat het niet nodig is om hier op hen te concentreren.

Seriële poort (seriële poort, seriële poort of COM-poort-, communicatiepoort) is een dual-directionele seriële interface.

Waarom heet de poort serieel? Omdat alle informatie op deze poort in stappen van één bit wordt verzonden. Het draagt ​​gegevens beetje bij beetje over, in tegenstelling tot een parallelle poort.

Ondanks het feit dat sommige andere interfaces, zoals Ethernet, FireWire en USB, gebruik maken van seriële gegevensuitwisseling, wordt de naam ‘seriële poort’ toegewezen aan een poort die een standaard RS-232C.

Deze poort heeft, in vergelijking met andere "seriële" technologieën, een onderscheidend kenmerk: er is geen timingvereiste tussen 2 bytes. Timingvereisten bestaan ​​alleen tussen de bits van een enkele byte. Het omgekeerde van de tijdspauze tussen de bits van één byte wordt de “baudrate” (baudrate) genoemd. Bovendien bestaat er in deze technologie niet zoiets als een “pakket”. Andere "seriële" technologieën voor gegevensoverdracht (X.25, USB of Ethernet) maken gebruik van "pakketten" en stellen ook strikte timingvereisten tussen bits van één pakket.

Wat communicatieprotocollen met industriële apparatuur betreft, gelden er strikte timingvereisten tussen seriële poortbytes. Implementatie van deze protocollen in multitasking besturingssystemen met zwakke real-time ondersteuning is erg moeilijk. Deze systemen omvatten Windows. Daarom wordt er vaak gebruik gemaakt van MS-DOS of oudere software om met deze protocollen te werken.

De meest gebruikelijke standaard voor een seriële poort is RS-232C. Vroeger werd de seriële poort gebruikt om een ​​terminal aan te sluiten, later werd deze gebruikt om een ​​modem of muis aan te sluiten. Momenteel wordt het gebruikt als middel om verbinding te maken met ononderbroken stroomvoorzieningen, maar ook als communicatiemiddel met hardware voor de ontwikkeling van embedded computersystemen, satellietontvangers, kassa's en beveiligingssysteemapparaten.

Dankzij de COM-poort wordt het mogelijk om twee PC's met elkaar te verbinden via een zogenaamde “nullmodemkabel”. Deze methode wordt al sinds de dagen van MS-DOS gebruikt om bestanden van de ene computer naar de andere over te brengen. Op UNIX-systemen werd het gebruikt voor terminaltoegang tot een andere machine, en op Windows-besturingssystemen werd het gebruikt als debugger op kernelniveau.

De seriële poort, die ooit behoorlijk populair was op IBM-compatibele pc's, is nu verouderd. Er moet echter worden opgemerkt dat het nog steeds vaak wordt gebruikt in industriële en zeer gespecialiseerde apparatuur, evenals op sommige moderne computers. De seriële poort wordt actief vervangen door de USB- en FireWire-interface.

Er zijn echter speciale standaarden voor emulatie van seriële poorten via USB en Bluetooth. Het is trouwens interessant, maar het was Bluetooth-technologie die de ontwikkelaars ontwierpen als een draadloze versie van de seriële poort. Softwarepoortemulatie wordt nog steeds veel gebruikt. Bijna alle mobiele telefoons emuleren tegenwoordig dus een COM-poort en een modem om tethering (computertoegang tot internet via GPRS/EGDE/3G) te implementeren. Maar direct voor de fysieke verbinding met de computer worden USB-, Bluetooth- of Wi-Fi-technologieën gebruikt.

Bovendien is softwarematige seriële poortemulatie mogelijk voor gastgebruikers van virtuele VMWare- en Microsoft Hyper-V-machines. Het belangrijkste doel van deze procedure is om de Windows-debugger op kernelniveau te verbinden met de gastclient.

Voordelen van een COM-poort

Het belangrijkste voordeel van deze technologie is het aansluitgemak.

Nadelen van COM-poort

De belangrijkste nadelen van deze poort zijn de lage snelheid, de grote connectorgroottes en de hoge eisen aan de responstijd van het besturingssysteem. Bovendien kent deze standaard een hoog aantal interrupts (één interrupt per 8 bytes).

Connectoren

De meest voorkomende standaardconnectoren zijn 9- en 25-pins (respectievelijk DB-9 en DB-25), die in 1969 werden gestandaardiseerd. Dit zijn D-vormige connectoren. Naast hen werden er nog andere gebruikt, maar uit dezelfde familie: DB-31 en ronde acht-pins DIN-8.

De maximale transmissiesnelheid (in de standaardversie) bedraagt ​​115.200 baud.

Apparatuur

De connector heeft de volgende contacten:

  • DTR(Data Terminal Ready) - uitvoer naar pc, invoer - naar modem. Verantwoordelijk voor de gereedheid van de computer om met de modem te werken. De reset veroorzaakt een vrijwel volledige herstart van de modem. In het geval van een muis wordt deze draad gebruikt om stroom te leveren.
  • DSR(Gereed voor dataset) - invoer naar pc, uitvoer - naar modem. Verantwoordelijk voor de gereedheid van het modem. Als de regel nul is, is het op sommige besturingssystemen onmogelijk om de poort als bestand te openen.
  • RxD(Gegevens ontvangen) - invoer naar pc, uitvoer - naar modem. Geeft de gegevensstroom aan die de pc binnenkomt.
  • TxD(Gegevens verzenden) - uitvoer naar pc, invoer - naar modem. Geeft de gegevensstroom aan die van de pc komt.
  • CTS(Clear to Send) - invoer naar pc, uitvoer - naar modem. De computer moet het gegevensoverdrachtproces onderbreken totdat deze draad op één is ingesteld. Wordt gebruikt in het hardware-flowcontrol-protocol om overflow op de modem te voorkomen.
  • RTS(Verzoek om te verzenden) - uitvoer naar pc, invoer - naar modem. Het modem moet het gegevensoverdrachtproces onderbreken totdat de draad op één is ingesteld. Wordt gebruikt in het hardware-stroomcontroleprotocol om overflow van hardware/stuurprogramma's te voorkomen.
  • DCD(Carrier Detect) - invoer naar pc, uitvoer - naar modem. Nadat er een verbinding tot stand is gebracht met het modem aan de andere kant, wordt deze verhoogd naar één en opnieuw ingesteld op nul als de verbinding verloren gaat. PC-hardware kan een interrupt genereren als een dergelijke gebeurtenis zich voordoet.
  • R.I.(Ringindicator) - invoer naar pc, uitvoer - naar modem. Nadat het belsignaal van een telefoongesprek is bepaald, wordt dit door het modem naar één verhoogd. De pc-hardware kan een interrupt genereren als een dergelijke gebeurtenis zich voordoet.
  • S.G.(Signaalgrond) - de gemeenschappelijke signaaldraad van de poort. Belangrijk:grond is niet gebruikelijk. Meestal is de draad geïsoleerd van de pc- of modembehuizing.

Een nulmodemkabel maakt gebruik van twee gekruiste paren: TXD/RXD en RTS/CTS.

UART 16550- standaard havenuitrusting. Tegenwoordig is het opgenomen in de SuperIO-chip op het moederbord. Sinds de dagen van de IBM-pc is deze uitgerust met een hardwarebyte-wachtrij. Het vermindert het aantal onderbrekingen aanzienlijk.