Seriell port på datamaskinen. Anatomien til en COM-port

Noen ganger må du løse kommunikasjonsproblemet elektronisk apparat med en datamaskin, enten det er bare datautveksling eller fjernkontroll. Denne artikkelen beskriver hvordan dette kan gjøres ved å bruke en seriell port. Dens største fordel er at standard programvare Windows-grensesnitt(API) tillater direkte kontroll av utgangslinjer, gir direkte kontroll over dem, og har en funksjon for å vente på en hendelse knyttet til en COM-port. Også RS-232-standarden, som COM-portene er laget i henhold til, tillater tilkobling og frakobling av kabler under drift av enheter (hot plug).

Beskrivelse

COM-port (seriell port)- et toveis grensesnitt som overfører data i seriell form (bit for bit) ved hjelp av RS-232-protokollen. Dette er en ganske vanlig protokoll som brukes til å koble én enhet (for eksempel en datamaskin) med andre ved hjelp av ledninger på opptil 30 meter. Nivåene av logiske signaler her er forskjellige fra standard: nivået på den logiske enheten er fra +5 til + 15V, nivået logisk null- fra -5 til -15V, som krever ekstra kretstransformasjoner, men gir god støyimmunitet.

Tenk på en 9-pinners kontakt (DB-9M). Nedenfor er dens pinout:

PIN-kode Navn Signal natur Signal
1 DCD Inndata Databærer oppdager
2 RxD Fridag Overfør data
3 TxD Inndata Motta data
4 DTR Fridag Dataterminal klar
5 GND - Bakke
6 DSR Inndata Datasett klart
7 RTS Fridag Forespørsel om å sende
8 CTS Inndata Fjern for å sende
9 RI Inndata Ringeindikator

Mest av alt vil vi være interessert i pinner 2 (dataoverføring), 3 (datamottak) og 5 (bakke). Dette er minimumssettet for muligheten for toveis kommunikasjon av enheter.

Jeg skal ikke dvele ved beskrivelsen av protokollen i detalj. For dette er det GOST-er, etc. Derfor vil vi gå videre og snakke om hvordan vi kan kontrollere dette dyret.

applikasjon

Som nevnt er RS-232 LAN-nivåene forskjellige fra standard TTL-nivåer. Derfor må vi på en eller annen måte transformere spenningsverdiene. De. lag 5V ​​fra + 15V og 0V fra -15V (og omvendt). En av måtene (og sannsynligvis den enkleste) er å bruke en spesiell MAX232 mikrokrets. Den er lett å forstå og kan konvertere to logiske signaler samtidig.

Nedenfor er et diagram over dets inkludering:


Jeg tror det ikke burde være noen vanskeligheter. Dette er et av alternativene for å bruke denne mikrokretsen: overføring av data fra en mikrokontroller til en datamaskin og omvendt. Overført signal kommer til bena T x IN på den ene siden og på R x IN på den andre. Inngangssignaler er hentet fra T x OUT og R x henholdsvis UT.

Programmering

La oss først snakke om portprogrammering på lavt nivå. Dette vil være mer korrekt. Jeg brukte mye nerver på å håndtere dette grensesnittet før jeg begynte å fordype meg i prinsippet om driften på et lavere nivå enn enkel overføring tegn. Hvis dette er klart, betyr det også med språk. høy level det vil ikke være noen problemer.

Nedenfor er adressene til COM-portene som vi må jobbe med:

Portnavn Adresse IRQ
COM 1 3F8h 4
COM 2 2F8h 3
COM 3 3E8h 4
COM 4 2E8h 3

De kan variere. Du kan angi verdiene i BIOS-innstillingene. den baseadresser... Adressene til registrene som er ansvarlige for driften av havnene vil avhenge av dem:

Adresse DLAB Les Skriv Forkortelse Registrer navn
+ 0 =0 Skrive Senderholdebuffer
=0 Lese Mottakerbuffer
=1 Les Skriv Divisor Lås Lav Byte
+ 1 =0 Les Skriv IER Avbryt Aktiver Register
=1 Les Skriv Divisor Latch High Byte
+ 2 - Lese IIR Interrupt Identification Register
- Skrive FCR FIFO kontrollregister
+ 3 - Les Skriv LCR Linjekontrollregister
+ 4 - Les Skriv MCR Modemkontrollregister
+ 5 - Lese LSR Linjestatusregister
+ 6 - Lese MSR Modemstatusregister
+ 7 - Les Skriv Skraperegister

Den første kolonnen er registeradressen i forhold til basisen. For eksempel, for COM1: LCR-registeradressen vil være 3F8h + 3 = 3FB. Den andre kolonnen er DLAB-biten (Divisor Latch Access Bit) som definerer en annen tilordning for det samme registeret. den lar deg operere på 12 registre med kun 8 adresser. For eksempel, hvis DLAB = 1, vil vi, med henvisning til adressen 3F8h, sette verdien til den nedre byten til frekvensdeleren klokkegenerator... Hvis DLAB = 0, vil den overførte eller mottatte byten bli skrevet til dette registeret med henvisning til samme adresse.

Null register

Det tilsvarer registrene for mottak / overføring av data og innstilling av generatorens frekvensdelerkoeffisient. Som nevnt ovenfor, hvis DLAB = 0, brukes registeret til å skrive mottatte / overførte data, hvis det er lik 1, blir verdien av den lave byten til klokkegeneratorens frekvensdeler satt. Dataoverføringshastigheten avhenger av verdien av denne frekvensen. Den høye byten til deleren skrives til neste minneplassering (dvs. for COM1-porten vil den være 3F9h). Nedenfor er avhengigheten av baudraten på delefaktoren:

Interrupt Enable Register (IER)

Hvis DLAB = 0, brukes det som et asynkront adapteravbruddskontrollregister, hvis DLAB = 1, blir den høye byten til klokkegeneratorens frekvensdeler satt i den.

Interrupt Identification Register (IIR)

Et avbrudd er en hendelse der kjøringen av hovedprogrammet stopper og kjøringen av avbruddsrutinen begynner. Dette registeret bestemmer typen avbrudd som skjedde.

Linjekontrollregister (LCR)

Dette er kontrollregisteret.

Bit 7 1 Divisor Latch Access Bit - innstilling av datautvekslingskurs
0 Normal modus (avbruddskontroll, datamottak/overføring)
Bit 6 Simuler linjeskift (sender en sekvens med flere nuller)
Bit 3 - 5 Bit 5 Bit 4 Bit 3 Paritetsvalg
X X 0 Ingen paritet
0 0 1 Odd paritet
0 1 1 Til og med paritet
1 0 1 Høy paritet (klebrig)
1 1 1 Lav paritet (klebrig)
Bit 2 Antall stoppbits
0 1 stoppbit
1 2 stoppbiter for 6,7 eller 8 databiter eller 1,5 stoppbiter for 5 databiter.
Bit 0 og 1 Bit 1 Bit 0 Antall databiter
0 0 5 bit
0 1 6 bit
1 0 7 bit
1 1 8 bit

Paritetssjekk innebærer overføring av en bit til - paritetsbiten. Verdien er satt slik at det totale antallet enere (eller nuller) i bitburst er partall eller oddetall, avhengig av innstillingen til portregistrene. Denne biten brukes til å oppdage feil som kan oppstå under dataoverføring på grunn av linjestøy. Mottakende enhet beregner pariteten til dataene på nytt og sammenligner resultatet med den mottatte paritetsbiten. Hvis pariteten ikke stemmer overens, anses dataene for å ha blitt overført ved en feil.

Stoppbiten betyr slutten på dataoverføringen.

Modem Control Register (MCR)

Modemkontrollregister.

Bit Betydning
0 DTR linje
1 RTS linje.
2 OUT1 linje (reserve)
3 OUT2-linje (reserve)
4 Kjør diagnostikk når en asynkron adapterinngang er kortsluttet til utgangen.
5-7 Lik 0

Linjestatusregister (LSR)

Et register som bestemmer linjens tilstand.

Bit Betydning
0 Data mottatt og klar til å lese, spyles automatisk når data leses.
1 Overløpsfeil. En ny databyte ble mottatt, og den forrige er ennå ikke lest av programmet. Den forrige byten er tapt.
2 Paritetsfeil, fjernet etter lesing av linjestatus.
3 Synkroniseringsfeil.
4 Forespørsel om å avbryte overføringen "BREAK" oppdaget - lang linje nuller.
5 Senderlagerregisteret er tomt, en ny byte kan skrives til det for overføring.
6 Senderens skiftregister er tomt. Dette registeret mottar data fra holdingsregisteret og serialiserer det for overføring.
7 Tidsavbrudd (enheten er ikke koblet til datamaskinen).

Modemstatusregister (MSR)

Modemstatusregister.

Så det er alt. Ved å bruke disse registrene kan du kommunisere direkte med COM-porten, kontrollere overføring og mottak av data. Hvis du ikke vil rote med minne, kan du bruke ferdige komponenter til ulike programmeringsmiljøer: C ++, VB, Delphi, Pascal, etc. De er intuitive, så jeg tror du ikke bør fokusere på dem her.

Sammen med parallellporten er COM-porten, eller seriell port, en av de tradisjonelle I/O-portene på en datamaskin, brukt i de første PC-ene. Selv om i moderne datamaskiner COM-porten er av begrenset bruk, men informasjon om den kan være nyttig for mange brukere.

Seriell port, som parallell, dukket opp lenge før utseendet til personlige datamaskiner arkitekturen til IBM PC. I de første personlige datamaskinene ble COM-porten brukt til å koble til eksterne enheter... Omfanget av dens anvendelse var imidlertid noe forskjellig fra anvendelsesområdet parallellport... Hvis parallellporten hovedsakelig ble brukt til å koble til skrivere, ble COM-porten (forresten, COM-prefikset bare en forkortelse for ordet kommunikasjon) vanligvis brukt til å jobbe med telekommunikasjonsenheter som modemer. Du kan imidlertid koble til porten, for eksempel en mus, så vel som andre eksterne enheter.

COM-port, hovedapplikasjoner:

  1. Terminaltilkobling
  2. ~ eksterne modemer
  3. ~ skrivere og plottere
  4. ~ mus
  5. Direkte tilkobling av to datamaskiner

For øyeblikket er omfanget av COM-porten betydelig redusert på grunn av introduksjonen av en raskere og mer kompakt, og for øvrig også konsistent, USB-grensesnitt... Nesten ute av bruk eksterne modemer, designet for tilkobling til en port, samt "COM"-mus. Det er sjelden at noen nå kobler sammen to datamaskiner med en nullmodemkabel.

Imidlertid bruker en rekke spesialiserte enheter fortsatt den serielle porten. Du finner det også på mange hovedkort. Faktum er at, sammenlignet med USB, har COM-porten en viktig fordel- i henhold til standarden seriell overføring RS-232-data, det kan fungere med enheter i en avstand på flere titalls meter, mens rekkevidden USB-kabel er generelt begrenset til 5 meter.

Hvordan en seriell port fungerer og hvordan den skiller seg fra en parallellport

I motsetning til parallellporten (LPT), overfører den serielle porten data bit for bit over en enkelt linje, i stedet for flere samtidig. Bitsekvenser er gruppert i en serie data, som starter med en startbit og slutter med en stoppbit, samt paritetsbiter som brukes til feilkontroll. Herfra kommer en annen engelsk navn som har en seriell port - seriell port.

Serieporten har to linjer som de faktiske dataene overføres gjennom - disse er linjene for overføring av data fra terminalen (PC) til kommunikasjonsenheten og omvendt. I tillegg er det flere kontrolllinjer. Seriell port betjenes av en spesiell UART-mikrokrets, som er i stand til å støtte relativt høy hastighet dataoverføring når 115 000 baud (byte / s). Riktignok bør det bemerkes at ekte hastighet utvekslingen av informasjon avhenger av begge kommunikasjonsenhetene. I tillegg er funksjonen til UART-kontrolleren å konvertere parallell til seriell kode og omvendt.

Havnebruk elektriske signaler komparativ høyspenning - opptil +15 V og -15 V. Det logiske nullnivået til serieporten er +12 V, og den logiske er -12 V. Et så stort spenningsfall lar deg garantere høy grad støyimmunitet for overførte data. På den annen side, brukt i seriell port høye spenninger krever komplekse kretsløsninger. Denne omstendigheten bidro også til nedgangen i havnens popularitet.

Seriell grensesnitt RS-232

Seriell portdrift på en PC er basert på RS-232 seriell kommunikasjonsstandard. Denne standarden beskriver prosessen med å utveksle data mellom en telekommunikasjonsenhet som et modem og datamaskinterminal... RS-232-standarden definerer elektriske egenskaper signaler, deres formål, varighet, samt størrelsen på kontaktene og pinouten for dem. Samtidig beskriver RS-232 kun fysisk lag dataoverføringsprosessen og gjelder ikke for transportprotokoller som kan variere avhengig av kommunikasjonsutstyret og programvaren som brukes.

RS-232-standarden ble opprettet i 1969, og dens siste versjon, TIA 232, utgitt i 1997. RS-232 er nå foreldet, men de fleste operativsystemer støtter det fortsatt.

I moderne datamaskiner er serieportkontakten en 9-pinners DB-9 hannkontakt, selv om RS-232-standarden også beskriver en 25-pinners DB-25-kontakt, som ofte ble brukt på eldre datamaskiner. DB-9-kontakten er vanligvis plassert på hovedkort PC, selv om den i eldre datamaskiner kan være plassert på et spesielt multikort satt inn i utvidelsessporet.

9-pinners DB-9 hunn på hovedkortet

DB-9-kontakt på den tilkoblede enhetskabelen

I motsetning til parallellporten, er kontaktene på begge sider av den dobbeltsidige seriekabelen identiske. I tillegg til linjene for overføring av selve dataene, inneholder porten flere tjenestelinjer som mellom terminalen (datamaskinen) og telekommunikasjonsenheten (modemet) kan overføres gjennom. kontrollinformasjon... Selv om teoretisk bare tre kanaler er tilstrekkelig for driften av en seriell port - datamottak, dataoverføring og bakke, har praksis vist at tilstedeværelsen av tjenestelinjer gjør kommunikasjonen mer effektiv, pålitelig og som et resultat raskere.

Formål med linjene til seriell port DB-9-kontakt i henhold til RS-232 og deres korrespondanse med kontaktene til DB-25-kontakten:

DB-9 pin engelsk navn Russisk navn Kontakt DB-25
1 Deteksjon av databærer Transportør oppdaget 8
2 Overfør data Overførte data 2
3 Motta data Mottatt data 3
4 Dataterminal klar Terminalberedskap 20
5 Bakke Jord 7
6 Datasett klar Senderberedskap 6
7 Forespørsel om å sende Forespørsel om å sende data 4
8 Fjern for å sende Dataoverføring tillatt 5
9 Ringeindikator Ringeindikator 22

Konfigurasjon og avbrudd

Siden en datamaskin kan ha flere serielle porter (opptil 4), tildeler systemet to maskinvareavbrudd for dem - IRQ 3 (COM 2 og 4) og IRQ 4 (COM 1 og 3) og flere BIOS-avbrudd. Mange kommunikasjonsprogrammer, så vel som innebygde modemer bruker avbrudd og adresseområdet til COM-porter for sitt arbeid. I dette tilfellet brukes vanligvis ikke ekte porter, men de såkalte virtuelle porter som emuleres av selve operativsystemet.

Som med mange andre komponenter hovedkort, parametrene til COM-portene, spesielt BIOS-avbruddsverdiene som tilsvarer maskinvareavbruddene, kan konfigureres via grensesnittet BIOS-oppsett... For dette, slikt BIOS-alternativer som COM-port, innebygd serieport, seriell portadresse, etc.

Konklusjon

Serieporten til en PC er foreløpig ikke et mye brukt middel for I/O-informasjon. Men siden det er et stort nummer av utstyr, primært for telekommunikasjonsformål, designet for å fungere med seriell port og også på grunn av noen av fordelene med RS-232 seriell dataprotokoll, bør det serielle grensesnittet ennå ikke avskrives som et absolutt utdatert rudiment av personlig datamaskinarkitektur.

Leseren av nettstedet vårt Maxim, spør:

Hallo! Kan du hjelpe meg med å løse problemet? Dens essens: det er et program som genererer et signal og overfører det til COM-porten på PC # 1, du må motta dette signalet på PC # 2, dataene som mottas gjennom COM-porten. Samtidig er det kun et lokalt nettverk mellom disse PC-ene. Vil resultatet av å koble disse 2 COM-portene med hverandre?

Så, først av alt, la oss prøve å forstå om det er mulig å overføre data mellom datamaskiner via

Montering av en nullmodem com-kabel

Vi snakker om den såkalte null-modemkabelen. Når nettverkskort var veldig dyre, og å kommunisere med hverandre lokalt nettverk Jeg ville, Com Lan Link ble oppfunnet - et nettverk som fungerer gjennom com-porter. Den kostet nesten en krone, ble laget helt for hånd og kunne fungere på avstander på opptil 1 km. Den eneste begrensningen var som kjent hastighet, pga for en com-port kan den ikke overstige 115,2 Kbps. Naturligvis er denne typen tilkobling preget av arbeid kun på applikasjonsnivå, uten noen mellomliggende nettverksoperativsystemer og andre forviklinger, dvs. Com Lan Link er den enkleste måten Nettverkstilkobling... For kommunikasjon av datamaskiner i Com Lan brukes Link spesiell kabel som vi skal samle inn i dag. La oss først se på com-portens ledninger (av typen "mor"):

Ideen med en nullmodemkabel er veldig enkel: alle "balanserte" signaler krysses på kryss og tvers, dvs.: TXD-RXD, DTR- (DSR, CD), CTS-RTS, GND-GND. Men du kan gjøre det enda enklere. De viktigste for oss vil være TxD, RxD og Ground. Resten kan stenges lokalt på selve porten og lagre ledningen. (På Dooms dager var det nettopp dette de gjorde. En slik ledning ble populært kalt "snor".) Dette er selvsagt ikke særlig bra, siden vil ikke fungere maskinvarekontroll flyt, men i de fleste tilfeller er det ikke nødvendig. Når det gjelder lengden på ledningen, uten en spesiell replikator, kan den være opptil 30 meter. Selve ledningene kan være hva som helst – opp til telefonnudler. Jeg vil gi et diagram over den enkleste null-modemkabelen:

For montering trenger vi to hun com-kontakter, tre ledninger og en loddebolt. Det er bedre å lodde hovedledningene først, og deretter kortslutte de nødvendige bena med flere. Etter at alt er klart, slår du av begge datamaskinene og setter endene av kabelen inn i kontaktene. Det er bedre å koble PC-en helt fra nettverket eller berøre kontakten til dekselet før du kobler til. For denne typen tilkobling kreves en omstart - systemet må initialisere portene. Forresten, hvis du er for lat til å lodde, kan du kjøpe en ferdig nullmodemkabel... De finnes på radiopunkter og i radiokomponenter. I Minsk så jeg på Zhdanovichi.

Også godt materiale om temaet dataoverføring via com er. Hel laboratoriearbeid... Og folk deler sin praktiske erfaring med å overføre data gjennom en slik forbindelse ved hjelp av OS Linux.

Så fra materialene ovenfor blir det klart at com-to-com er den eldste og den enkleste måten koble to datamaskiner sammen. Derfor følger et entydig svar på problemet:

Ja, dataoverføring mellom to datamaskiner via en COM-port er mulig. Dette kalles en nullmodemtilkobling og er den enkleste versjonen av et lokalnettverk.

Så vi kom til COM-porten. Men med ham er ikke alt like enkelt som med LPT, og hans full bruk vil kreve betydelig god innsats... Den største ulempen er dens største fordel - seriell dataoverføring. Hvis det i LPT overføres en byte med data over 8 linjer, en bit for hver, og tilstanden til hver linje lett kan sees, COM-port databyte overføres bit for bit langs én linje (i forhold til bakken, selvfølgelig) og det vil ikke være mulig å se hva som overføres der ved å bruke lysdiodene alene. For å gjøre dette trenger du en spesiell enhet - en seriell til parallell datastrømkonverter, den såkalte. USART (Universal Synchronous / Asynchronous Receiver Transmitter). For eksempel er det en del av hovedkortet til en datamaskin utstyrt med en COM-port, i en mer seriøs mikrokontroller.


Jeg håper du fortsatt mistet motet i å mestre COM-porten. Det er ikke så dystert. Noen resultater kan oppnås uten USART. La oss formulere oppgaven som vi vil implementere i den innledende fasen av arbeidet med COM-porten:


"Jeg vil at en lysdiode skal kobles til datamaskinen via COM-porten. Jeg starter programmet. Jeg gir litt handling i dette programmet, lysdioden lyser, jeg gjør noe annet - lysdioden slukker."


Oppgaven er ganske spesifikk (med tanke på at USART ikke brukes) og er ren "selvfot", men den er ganske realiserbar og gjennomførbar. La oss begynne å implementere det.


1. COM-port

Vi tar igjen systemenhet din PC og se på baksiden. Merk at det er en 9-pinners kontakt - dette er COM-porten. I virkeligheten kan det være noen få (opptil 4). Det er to COM-porter installert på PC-en min (se bilde).


2. Utvidelse COM-port


3. Maskinvare

Vi må også "tulle" med maskinvaredelen, i den forstand at det blir mer komplisert enn med den første enheten for LPT-port... Faktum er at RS-232-protokollen som data utveksles gjennom i COM-porten har en litt annen logisk tilstand - spenningsforhold. Hvis det vanligvis er logisk 0 0 V, logisk 1 +5 V, er dette forholdet som følger i RS-232: logisk 0 +12 V, logisk 1 -12 V.

Og for eksempel, etter å ha mottatt -12 V, er det ikke umiddelbart klart hva du skal gjøre med denne spenningen. Vanligvis utføres konverteringen av RS-232-nivåer til TTL (0,5 V). Det enkleste alternativet er zenerdioder. Men jeg foreslår å lage denne omformeren på en spesiell mikrokrets. Den heter MAX232.

La oss nå se hvilke signaler fra COM-porten vi kan se på LED-ene? Faktisk er det så mange som 6 uavhengige linjer i COM-porten, som er av interesse for designeren av grensesnittenheten. To av dem er ennå ikke tilgjengelige for oss - linjer for overføring av seriedata. Men de resterende 4 er designet for å kontrollere og indikere prosessen med dataoverføring, og vi kan "overføre" dem for å passe våre behov. To av dem er beregnet for kontroll fra siden ekstern enhet og vi vil ikke røre dem foreløpig, men vi vil nå bruke de to siste gjenværende linjene. De heter:

  • RTS- Anmodning om overføring. Interaksjonslinje som indikerer at datamaskinen er klar til å motta data.
  • DTR- Datamaskinen er klar. Interaksjonslinje som indikerer at datamaskinen er på og klar til å kommunisere.

Nå vil vi overføre formålet deres litt, og lysdiodene som er koblet til dem vil enten slukke eller lyse, avhengig av handlingene i vårt eget program.

Så la oss sette sammen et diagram som lar oss utføre de tiltenkte handlingene.

Og her er den praktiske gjennomføringen. Jeg tror du vil tilgi meg at jeg laget den i en så dum prototypeversjon, for jeg vil ikke lage et brett for en så "svært produktiv" krets.


4. Programvaredel

Alt er enklere her. La oss skape Windows-applikasjon v Microsoft Visual C ++ 6.0 basert på MFC for å administrere to linjer med COM-portkommunikasjon. For dette skaper vi nytt prosjekt MFC og gi den et navn, for eksempel, TestCOM... Deretter velger vi konstruksjonsalternativet basert på dialogen.

Gi utseende dialogvinduet til programmet vårt, som i fig. nedenfor, nemlig legg til fire knapper, to på hver av linjene. En av dem er henholdsvis nødvendig for å "slukke" linjen, den andre for å "sette" den til en enhet.

Klasse CTestCOMDlg: offentlig CDialog (// Konstruksjon offentlig: CTestCOMDlg (CWnd * pParent = NULL); // standard konstruktør HANDLE hFile;

For at programmet vårt skal kunne kontrollere linjene til COM-porten, må det først åpnes. La oss skrive koden som er ansvarlig for å åpne porten når du laster programmet.

HFile = CreateFile ("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) (MessageBox ("Kunne ikke åpne port!", "Feil", MB_ICONERROR);) else (MessageBox ("Port åpnet vellykket", "Ok", MB_OK);)

Bruker standardfunksjonen Vinn API Opprett fil ()åpne COM-porten COM2... Deretter sjekker vi suksessen til åpningen med uttaket informasjonsmelding... Her er det nødvendig å gjøre viktig notat: COM2 er i datamaskinen min, men på datamaskinen din kan du koble den til en annen COM-port. Følgelig må navnet endres til hvilken port du bruker. Du kan se hvilke portnumre som finnes på datamaskinen din slik: Start -> Innstillinger -> Kontrollpanel -> System -> Maskinvare -> Enhetsbehandling -> Porter (COM og LPT).

Som et resultat, funksjonen CTestCOMDlg :: OnInitDialog () ligger i filen TestCOMDlg.cpp, bør klassen i dialogboksen vår ha formen:

BOOL CTestCOMDlg :: OnInitDialog () (CDialog :: OnInitDialog (); // Legg til "Om ..." menyelement til systemmenyen. // IDM_ABOUTBOX må være i systemkommandoområdet. ASSERT ((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT (IDM_ABOUTBOX AppendMenu (MF_SEPARATOR); pSysMenu-> AppendMenu (MF_STRING, IDM_ABOUTBOX, strAboutMenu);)) // Angi ikonet for denne dialogboksen. Rammeverket gjør dette automatisk // når programmets hovedvindu ikke er en dialogboks SetIcon (m_hIcon, TRUE); // Sett stort ikon SetIcon (m_hIcon, FALSE); // Sett lite ikon // TODO: Legg til ekstra initialisering her hFile = CreateFile ("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) (MessageBox ("Kunne ikke åpne porten!", "Feil", MB_ICONERROR);) else (MessageBox ("Port vellykket åpnet", "Ok", MB_OK);) return TRUE; // return TRUE med mindre du setter fokus til en kontroll)

La oss nå legge til behandlere for linjekontrollknappene. Jeg ga dem passende navn: funksjonen som setter en på DTR-linjen er OnDTR1 (), 0 er OnDTR0 (). For henholdsvis RTS-linjen på samme måte. La meg minne deg på at behandleren opprettes når Dobbeltklikk på knappen. Som et resultat bør disse fire funksjonene ha formen:

Void CTestCOMDlg :: OnDTR1 () (// TODO: Legg til kontrollvarslingsbehandlerkoden din her EscapeCommFunction (hFile, 6);) void CTestCOMDlg :: OnDTR0 () (// TODO: Legg til kontrollvarslingsbehandlerkoden din her EscapeCommFunction (hFile, 5);) void CTestCOMDlg :: OnRTS1 () (// TODO: Legg til koden for kontrollvarslingsbehandler her EscapeCommFunction (hFile, 4);) void CTestCOMDlg :: OnRTS0 () (// TODO: Legg til kontrollvarslingsbehandlerkoden din her EscapeCommFunction (hFile, 3);)

La meg forklare litt hvordan de fungerer. Som du kan se, inneholder de en oppfordring til samme Win API-funksjoner EscapeCommFunction () med to parametere. Den første er HANDLE på åpen port, sekund - spesiell kode handling som tilsvarer den nødvendige linjetilstanden.

Det er det, vi kompilerer det, lanserer det. Hvis alt er bra, bør du se en melding om at porten ble åpnet. Deretter, ved å trykke på de tilsvarende knappene, blinker vi lysdiodene som er koblet til COM-porten.

© Dmitrij Ivanov
desember 2006