Seriell port på datorn. Anatomi av en COM-port

Ibland måste man lösa problemet med kommunikation elektronisk anordning med en dator, oavsett om det bara är datautbyte eller fjärrkontroll. Den här artikeln beskriver hur detta kan göras med en seriell port. Dess främsta fördel är att standardprogramvaran Windows-gränssnitt(API) tillåter direkt kontroll av utgångslinjer, ger direkt kontroll över dem, och har en funktion för att vänta på någon händelse associerad med en COM-port. Dessutom tillåter RS-232-standarden, enligt vilken COM-portarna är gjorda, att ansluta och koppla från kablar under driften av enheter (hot plug).

Beskrivning

COM-port (seriell port)- ett dubbelriktat gränssnitt som överför data i seriell form (bit för bit) med hjälp av RS-232-protokollet. Detta är ett ganska vanligt protokoll som används för att ansluta en enhet (till exempel en dator) med andra med sladdar upp till 30 m långa. Nivåerna för logiska signaler här skiljer sig från de vanliga: nivån på den logiska enheten är från +5 till + 15V, nivån logisk nolla- från -5 till -15V, vilket kräver ytterligare kretstransformationer, men ger bra brusimmunitet.

Överväg en 9-stiftskontakt (DB-9M). Nedan är dess pinout:

Pinkod namn Signalnatur Signal
1 DCD Inmatning Upptäck databärare
2 RxD Ledig dag Överför data
3 TxD Inmatning Ta emot data
4 DTR Ledig dag Dataterminal klar
5 GND - Jord
6 DSR Inmatning Dataset är klart
7 RTS Ledig dag Begära att skicka
8 CTS Inmatning Rensa att skicka
9 RI Inmatning Ringindikator

Mest av allt kommer vi att vara intresserade av stift 2 (dataöverföring), 3 (datamottagning) och 5 (jord). Detta är minimiinställningen för tvåvägskommunikation av enheter.

Jag kommer inte att uppehålla mig vid beskrivningen av protokollet i detalj. För detta finns GOST, etc. Därför kommer vi att gå vidare och prata om hur man kontrollerar detta odjur.

Ansökan

Som nämnts skiljer sig RS-232 LAN-nivåerna från de vanliga TTL-nivåerna. Därför måste vi på något sätt omvandla spänningsvärdena. De där. gör 5V från + 15V och 0V från -15V (och vice versa). Ett av sätten (och förmodligen det enklaste) är att använda en speciell MAX232-mikrokrets. Det är lätt att förstå och kan samtidigt omvandla två logiska signaler.

Nedan är ett diagram över dess inkludering:


Jag tycker att det inte ska vara några svårigheter. Detta är ett av alternativen för att använda denna mikrokrets: överföra data från en mikrokontroller till en dator och vice versa. Signal sänds går in i benen T x IN på ena sidan och på R x IN på den andra. Ingångssignaler hämtas från T x OUT och R x UT respektive.

Programmering

Låt oss först prata om lågnivåportprogrammering. Detta blir mer korrekt. Jag spenderade mycket nerver på att hantera det här gränssnittet tills jag började fördjupa mig i principen för dess funktion på en lägre nivå än enkel överföring tecken. Om detta är tydligt betyder det också med språk. hög nivå det blir inga problem.

Nedan är adresserna till COM-portarna som vi måste arbeta med:

Portnamn Adress IRQ
COM 1 3F8h 4
COM 2 2F8h 3
COM 3 3E8h 4
COM 4 2E8h 3

De kan variera. Du kan ställa in värdena i BIOS-inställningarna. den basadresser... Adresserna till de register som ansvarar för driften av hamnarna kommer att bero på dem:

Adress DLAB Läsa skriva Förkortning Registrera namn
+ 0 =0 Skriva Sändarhållningsbuffert
=0 Läsa Mottagarbuffert
=1 Läsa skriva Divisor Spärr Low Byte
+ 1 =0 Läsa skriva IER Avbryt Aktivera Register
=1 Läsa skriva Divisor Latch High Byte
+ 2 - Läsa IIR Interrupt Identification Register
- Skriva FCR FIFO-kontrollregister
+ 3 - Läsa skriva LCR Linjekontrollregister
+ 4 - Läsa skriva MCR Modemkontrollregister
+ 5 - Läsa LSR Linjestatusregister
+ 6 - Läsa MSR Modemstatusregister
+ 7 - Läsa skriva Scratch Register

Den första kolumnen är registeradressen i förhållande till basen. Till exempel, för COM1: LCR-registeradressen kommer att vara 3F8h + 3 = 3FB. Den andra kolumnen är DLAB-biten (Divisor Latch Access Bit) som definierar en annan tilldelning för samma register. det låter dig arbeta på 12 register med endast 8 adresser. Till exempel, om DLAB = 1, kommer vi, med hänvisning till adressen 3F8h, att ställa in värdet på den nedre byten av frekvensdelaren klockgenerator... Om DLAB = 0, då, med hänvisning till samma adress, kommer den sända eller mottagna byten att skrivas till detta register.

Noll register

Den motsvarar registren för att ta emot/sända data och ställa in generatorns frekvensdelarkoefficient. Som nämnts ovan, om DLAB = 0, så används registret för att skriva mottagen/sänd data, om den är lika med 1, ställs värdet på den låga byten av klockgeneratorns frekvensdelare in. Dataöverföringshastigheten beror på värdet på denna frekvens. Divisorns höga byte skrivs till nästa minnesplats (dvs för COM1-porten kommer det att vara 3F9h). Nedan är överföringshastighetens beroende av dividerfaktorn:

Interrupt Enable Register (IER)

Om DLAB = 0, så används det som ett asynkront adapteravbrottskontrollregister, om DLAB = 1, då är den höga byten för klockgeneratorns frekvensdelare inställd i den.

Interrupt Identification Register (IIR)

Ett avbrott är en händelse vid vilken exekveringen av huvudprogrammet stoppar och exekveringen av avbrottsrutinen börjar. Detta register bestämmer vilken typ av avbrott som inträffade.

Line Control Register (LCR)

Detta är kontrollregistret.

Bit 7 1 Divisor Latch Access Bit - ställer in dataväxlingskursen
0 Normalläge (avbrottskontroll, datamottagning/överföring)
Bit 6 Simulera radbrytning (sänder en sekvens med flera nollor)
Bitar 3 - 5 Bit 5 Bit 4 Bit 3 Paritetsval
X X 0 Ingen paritet
0 0 1 Udda paritet
0 1 1 Jämn paritet
1 0 1 Hög paritet (klibbig)
1 1 1 Låg paritet (klibbig)
Bit 2 Antal stoppbitar
0 1 stoppbit
1 2 stoppbitar för 6,7 eller 8 databitar eller 1,5 stoppbitar för 5 databitar.
Bitar 0 och 1 Bit 1 Bit 0 Antal databitar
0 0 5 bitar
0 1 6 bitar
1 0 7 bitar
1 1 8 bitar

Paritetskontroll innebär överföring av ytterligare en bit - paritetsbiten. Dess värde är inställt så att det totala antalet ettor (eller nollor) i bitskuren är jämnt eller udda, beroende på inställningen av portregistren. Denna bit används för att upptäcka fel som kan uppstå under dataöverföring på grund av linjebrus. Mottagande enhet beräknar om pariteten för datan och jämför resultatet med den mottagna paritetsbiten. Om pariteten inte stämmer överens, anses data vara felaktigt överförda.

Stoppbiten betyder slutet på dataöverföringen.

Modem Control Register (MCR)

Modemkontrollregister.

Bit Menande
0 DTR linje
1 RTS linje.
2 OUT1 linje (reserv)
3 OUT2-linje (reserv)
4 Kör diagnostik när en asynkron adapteringång är kortsluten till dess utgång.
5-7 Lika med 0

Linjestatusregister (LSR)

Ett register som bestämmer linjens tillstånd.

Bit Menande
0 Data mottagen och redo att läsas, rensas automatiskt när data läses.
1 Överflödesfel. En ny databyte togs emot, och den föregående har ännu inte lästs av programmet. Den föregående byten är förlorad.
2 Paritetsfel, raderat efter att ha läst linjestatus.
3 Synkroniseringsfel.
4 Begäran om att avbryta överföringen "BREAK" upptäcktes - lång kö nollor.
5 Sändarens minnesregister är tomt, en ny byte kan skrivas till det för överföring.
6 Sändarens skiftregister är tomt. Detta register tar emot data från innehavsregistret och serialiserar dem för överföring.
7 Timeout (enheten är inte ansluten till datorn).

Modem Status Register (MSR)

Modemstatusregister.

Så det är allt. Genom att använda dessa register kan du direkt kommunicera med COM-porten, styra överföring och mottagning av data. Om du inte vill bråka med minnet kan du använda färdiga komponenter för olika programmeringsmiljöer: C ++, VB, Delphi, Pascal osv. De är intuitiva, så jag tycker att du inte ska fokusera på dem här.

Tillsammans med parallellporten är COM-porten, eller seriell port, en av de traditionella I/O-portarna på en dator, som används i de första datorerna. Även om i moderna datorer COM-porten är av begränsad användning, men information om den kan vara användbar för många användare.

Seriell port, som parallell, dök upp långt innan uppkomsten av personliga datorer arkitekturen för IBM PC. I de första persondatorerna användes COM-porten för att ansluta kringutrustning... Omfattningen av dess tillämpning skilde sig dock något från tillämpningsområdet parallell port... Om parallellporten huvudsakligen användes för att ansluta skrivare, användes vanligtvis COM-porten (förresten, COM-prefixet är bara en förkortning för ordet kommunikation) för att arbeta med telekommunikationsenheter som modem. Däremot kan du koppla till exempel en mus till porten, samt andra kringutrustningar.

COM-port, huvudsakliga användningsområden:

  1. Terminalanslutning
  2. ~ externa modem
  3. ~ skrivare och plottrar
  4. ~ möss
  5. Direkt anslutning av två datorer

För närvarande har omfattningen av COM-porten reducerats avsevärt på grund av införandet av en snabbare och mer kompakt, och för övrigt också konsekvent, USB-gränssnitt... Nästan ur bruk externa modem, designad för anslutning till porten, såväl som "COM"-möss. Det är sällsynt att någon nu kopplar ihop två datorer med en nollmodemkabel.

Men ett antal specialiserade enheter använder fortfarande den seriella porten. Du kan hitta det på många moderkort också. Faktum är att, i jämförelse med USB, har COM-porten en viktig fördel- enligt standarden seriell överföring data RS-232, det kan fungera med enheter på ett avstånd av flera tiotals meter, medan räckvidden USB-kabelär i allmänhet begränsad till 5 meter.

Hur en serieport fungerar och hur den skiljer sig från en parallellport

Till skillnad från parallellporten (LPT) överför den seriella porten data bit för bit över en enda linje, snarare än flera samtidigt. Bitsekvenser grupperas i en serie data, som börjar med en startbit och slutar med en stoppbit, och paritetsbitar som används för felkontroll. Härifrån kommer en annan engelskt namn som har en seriell port - seriell port.

Serieporten har två linjer genom vilka de faktiska data överförs - dessa är linjerna för överföring av data från terminalen (PC) till kommunikationsenheten och vice versa. Dessutom finns det flera kontrolllinjer. Serieporten betjänas av en speciell UART-mikrokrets, som kan stödja relativt hög hastighet dataöverföring som når 115 000 baud (byte/s). Det är sant att det bör noteras verklig hastighet informationsutbytet beror på båda kommunikationsenheterna. Dessutom är UART-styrenhetens funktion att konvertera parallellt till seriell kod och vice versa.

Portanvändningar elektriska signaler jämförande högspänning - upp till +15 V och -15 V. Den logiska nollnivån för serieporten är +12 V, och den logiska är -12 V. Ett så stort spänningsfall gör att du kan garantera hög grad störningsimmunitet för de överförda data. Å andra sidan, används i seriell port höga spänningar kräver komplexa kretslösningar. Denna omständighet bidrog också till hamnens nedgång i popularitet.

Seriellt gränssnitt RS-232

Seriell portdrift på en PC är baserad på RS-232 seriell kommunikationsstandard. Denna standard beskriver processen för utbyte av data mellan en telekommunikationsenhet som ett modem och datorterminal... RS-232-standarden definierar Elektriska egenskaper signaler, deras syfte, varaktighet, samt storleken på kontakterna och pinouten för dem. Samtidigt beskriver RS-232 endast fysiskt lager dataöverföringsprocessen och gäller inte för transportprotokoll vilket kan variera beroende på vilken kommunikationsutrustning och programvara som används.

RS-232-standarden skapades 1969, och dess senaste versionen, TIA 232, släppt 1997. RS-232 är nu föråldrad, men de flesta operativsystem stödjer det fortfarande.

I moderna datorer är den seriella portkontakten en 9-stifts DB-9-hankontakt, även om RS-232-standarden även beskriver en 25-stifts DB-25-kontakt, som ofta användes på äldre datorer. DB-9-kontakten sitter vanligtvis på moderkort PC, även om den i äldre datorer kan vara placerad på ett speciellt multikort som satts in i expansionsfacket.

9-stift DB-9 hona på moderkortet

DB-9-kontakt på den anslutna enhetskabeln

Till skillnad från parallellporten är kontakterna på båda sidor av den dubbelsidiga seriella kabeln identiska. Förutom ledningarna för att överföra själva data, innehåller porten flera servicelinjer genom vilka mellan terminalen (datorn) och telekommunikationsenheten (modemet) kan överföras kontrollinformation... Även om teoretiskt sett bara tre kanaler är tillräckliga för driften av en serieport - datamottagning, dataöverföring och mark, har praxis visat att närvaron av servicelinjer gör kommunikationen mer effektiv, tillförlitlig och, som ett resultat, snabbare.

Syftet med ledningarna för serieportens DB-9-kontakt enligt RS-232 och deras överensstämmelse med kontakterna på DB-25-kontakten:

DB-9-stift engelskt namn ryskt namn Kontakta DB-25
1 Upptäck databärare Transportör upptäckt 8
2 Överför data Överförda data 2
3 Ta emot data Mottagen data 3
4 Dataterminal klar Terminalberedskap 20
5 Jord Jorden 7
6 Dataset är klart Sändarberedskap 6
7 Begära att skicka Begäran om att skicka data 4
8 Rensa att skicka Dataöverföring tillåten 5
9 Ringindikator Ringsignalindikator 22

Konfiguration och avbrott

Eftersom en dator kan ha flera seriella portar (upp till 4), allokerar systemet två hårdvaruavbrott för dem - IRQ 3 (COM 2 och 4) och IRQ 4 (COM 1 och 3) och flera BIOS-avbrott. Många kommunikationsprogram, såväl som inbyggda modem använder avbrott och adressutrymmet för COM-portar för sitt arbete. I det här fallet används vanligtvis inte riktiga portar, utan de sk virtuella portar som emuleras av själva operativsystemet.

Som med många andra komponenter moderkort, parametrarna för COM-portarna, i synnerhet BIOS-avbrottsvärdena som motsvarar hårdvaruavbrotten, kan konfigureras via gränssnittet BIOS inställningar... För detta, sådana BIOS-alternativ som COM-port, inbyggd serieport, seriell portadress, etc.

Slutsats

Den seriella porten på en PC är för närvarande inte ett allmänt använt sätt för I/O-information. Men eftersom det finns Ett stort antal utrustning, främst för telekommunikationsändamål, utformad för att fungera med serieport och även på grund av några av fördelarna med det seriella dataprotokollet RS-232, bör det seriella gränssnittet ännu inte avskrivas som en absolut föråldrad rudiment av persondatorarkitektur.

Läsaren av vår webbplats Maxim frågar:

Hej! Kan du hjälpa mig att lösa problemet? Dess väsen: det finns ett program som genererar en signal och överför den till COM-porten på PC # 1, du måste ta emot denna signal på PC # 2, till vilken data tas emot via COM-porten. Dessutom finns det bara ett lokalt nätverk mellan dessa datorer. Blir resultatet av att ansluta dessa 2 COM-portar med varandra?

Så, först och främst, låt oss försöka förstå om det är möjligt att överföra data mellan datorer via

Montering av en nollmodem com-kabel

Det handlar om den så kallade nollmodemkabeln. När nätverkskort var mycket dyra och att kommunicera med varandra lokalt nätverk Jag ville, Com Lan Link uppfanns - ett nätverk som fungerar genom com-portar. Den kostade nästan en slant, tillverkades helt för hand och kunde fungera på avstånd på upp till 1 km. Den enda begränsningen, som ni vet, var hastigheten, eftersom för en com-port får den inte överstiga 115,2 Kbps. Naturligtvis kännetecknas denna typ av anslutning av arbete endast på applikationsnivå, utan några mellanliggande nätverksoperativsystem och andra krångligheter, d.v.s. Com Lan Link är det enklaste sättet nätverksanslutning... För kommunikation av datorer används Com Lan Link specialkabel som vi ska samla in idag. Låt oss först titta på com-portens ledningar (av typen "mamma"):

Idén med en nollmodemkabel är väldigt enkel: vi skickar alla "balanserade" signaler korsvis, dvs: TXD-RXD, DTR- (DSR, CD), CTS-RTS, GND-GND. Men du kan göra det ännu lättare. De viktigaste för oss kommer att vara TxD, RxD och Ground. Resten kan kortslutas lokalt på själva porten och spara tråden. (På Dooms dagar var det precis vad de gjorde. En sådan tråd kallades i folkmun för "snöre".) Detta är förstås inte särskilt bra, eftersom kommer inte att fungera hårdvarukontroll flöde, men i de flesta fall krävs det inte. När det gäller längden på tråden, utan en speciell replikator, kan den vara upp till 30 meter. Själva kablarna kan vara vad som helst - upp till telefonnudlar. Här är ett diagram över den enklaste nollmodemkabeln:

För montering behöver vi två hona com-kontakter, tre trådar och en lödkolv. Det är bättre att först löda huvudledningarna och sedan kortsluta de nödvändiga benen med ytterligare. När allt är klart, stäng av båda datorerna och sätt i ändarna på kabeln i kontakterna. Det är bättre att helt koppla bort datorn från nätverket eller röra vid kontakten till fodralet innan du ansluter. För denna typ av anslutning krävs en omstart - systemet måste initiera portarna. Förresten, om du är för lat för att löda kan du köpa en färdig nollmodemkabel... De finns på radiopunkter och i radiokomponenter. I Minsk såg jag på Zhdanovichi.

Också bra material på ämnet dataöverföring via com är. Hela laboratoriearbete... Och människor delar med sig av sin praktiska erfarenhet av att överföra data via en sådan anslutning med hjälp av OS Linux.

Så från ovanstående material blir det tydligt att com-to-com är den äldsta och det enklaste sättet koppla ihop två datorer. Därför följer ett entydigt svar på problemet:

Ja, dataöverföring mellan två datorer via en COM-port är möjlig. Detta kallas en nollmodemanslutning och är den enklaste versionen av ett lokalt nätverk.

Så vi kom till COM-porten. Men med honom är allt inte lika enkelt som med LPT, och hans full användning kommer att kräva avsevärt stor ansträngning... Den största nackdelen är dess främsta fördel - seriell dataöverföring. Om i LPT en byte med data sänds över 8 linjer, en bit för varje, och tillståndet för varje linje lätt kan ses, då COM-port databyte sänds bit för bit längs en linje (i förhållande till marken, förstås) och det kommer inte att vara möjligt att se vad som sänds dit med enbart lysdioderna. För att göra detta behöver du en speciell enhet - en seriell till parallell dataströmomvandlare, den så kallade. USART (Universal Synchronous / Asynchronous Receiver Transmitter). Till exempel är det en del av moderkortet på en dator utrustad med en COM-port, i någon mer seriös mikrokontroller.


Jag hoppas att du fortfarande är vilse i utvecklingen av COM-porten. Det är inte så dystert. Vissa resultat kan erhållas utan USART. Låt oss formulera uppgiften som vi kommer att implementera i det inledande skedet av arbetet med COM-porten:


"Jag vill att en lysdiod ska anslutas till datorn via COM-porten. Jag startar programmet. Jag ger lite åtgärd i det här programmet, lysdioden tänds, jag gör något annat - lysdioden slocknar."


Uppgiften är ganska specifik (med hänsyn till att USART inte används) och är ren "self-footed", men den är ganska realiserbar och fungerande. Låt oss börja implementera det.


1. COM-port

Vi tar igen systemenhet din PC och titta på baksidan. Vi noterar 9-stiftskontakten där - det här är COM-porten. I verkligheten kan det finnas några (upp till 4). Det finns två COM-portar installerade på min PC (se bild).


2. Förlängning COM-port


3. Hårdvara

Vi måste också "pyssla" med hårdvarudelen, i den meningen att det blir mer komplicerat än med den första enheten för LPT-port... Faktum är att RS-232-protokollet genom vilket data utbyts i COM-porten har ett något annorlunda logiskt tillstånd - spänningsförhållande. Om det vanligtvis är logiskt 0 0 V, logiskt 1 +5 V, är detta förhållande i RS-232 som följer: logiskt 0 +12 V, logiskt 1 -12 V.

Och till exempel, efter att ha fått -12 V, är det inte omedelbart klart vad man ska göra med denna spänning. Vanligtvis utförs omvandlingen av RS-232-nivåer till TTL (0,5 V). Det enklaste alternativet är zenerdioder. Men jag föreslår att göra denna omvandlare på en speciell mikrokrets. Den heter MAX232.

Låt oss nu se vilka signaler från COM-porten vi kan se på lysdioderna? Faktum är att det finns så många som 6 oberoende linjer i COM-porten, som är av intresse för gränssnittsenhetsdesignern. Två av dem är ännu inte tillgängliga för oss - linjer för överföring av seriella data. Men de återstående 4 är designade för att kontrollera och indikera dataöverföringsprocessen och vi kan "överföra" dem till våra behov. Två av dem är avsedda för styrning från sidan extern enhet och vi kommer inte att röra dem för nu, men vi kommer nu att använda de två sista återstående raderna. De heter:

  • RTS- Begäran om överföring. Interaktionsrad som indikerar att datorn är redo att ta emot data.
  • DTR- Datorn är klar. Interaktionslinje, som indikerar att datorn är påslagen och redo att kommunicera.

Nu kommer vi att överföra deras syfte lite, och lysdioderna som är anslutna till dem kommer antingen att slockna eller lysa, beroende på åtgärderna i vårt eget program.

Så låt oss sätta ihop ett diagram som gör att vi kan utföra de avsedda åtgärderna.

Och här är dess praktiska genomförande. Jag tror att du kommer att förlåta mig att jag gjorde den i en så dum prototypversion, för jag vill inte göra ett kort för en så "mycket produktiv" krets.


4. Mjukvarudel

Allt är enklare här. Låt oss skapa Windows-applikation v Microsoft Visual C ++ 6.0 baserad på MFC för att hantera två linjer med COM-portkommunikation. För detta skapar vi nytt projekt MFC och ge den ett namn, till exempel, TestCOM... Därefter väljer vi konstruktionsalternativet baserat på dialogen.

Bifoga utseende dialogfönstret för vårt program, som i Fig. nedan, lägg nämligen till fyra knappar, två på var och en av raderna. En av dem är nödvändig för att "släcka" linjen, den andra för att "ställa in" den till en enhet.

Klass CTestCOMDlg: public CDialog (// Construction public: CTestCOMDlg (CWnd * pParent = NULL); // standardkonstruktor HANDLE hFile;

För att vårt program ska kunna styra COM-portens linjer måste det först öppnas. Låt oss skriva koden som är ansvarig för att öppna porten när du laddar programmet.

HFile = CreateFile ("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) (MessageBox ("Det gick inte att öppna porten!", "Fel", MB_ICONERROR);) else (MessageBox ("Porten öppnades framgångsrikt", "Ok", MB_OK);)

Använder standardfunktionen Vinn API Skapa fil ()öppna COM-porten COM2... Därefter kontrollerar vi framgången för öppningen med uttaget informationsmeddelande... Här är det nödvändigt att göra Viktig notering: COM2 finns i min dator, men på din dator kan du ansluta den till en annan COM-port. Följaktligen måste dess namn ändras till vilken port du än använder. Du kan se vilka portnummer som finns på din dator så här: Start -> Inställningar -> Kontrollpanelen -> System -> Hårdvara -> Enhetshanteraren -> Portar (COM och LPT).

Som ett resultat, funktionen CTestCOMDlg :: OnInitDialog () finns i filen TestCOMDlg.cpp, klassen i vår dialog bör ha följande form:

BOOL CTestCOMDlg :: OnInitDialog () (CDialog :: OnInitDialog (); // Lägg till "Om ..." menyalternativ till systemmenyn. // IDM_ABOUTBOX måste vara i systemets kommandoområde. ASSERT ((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT (IDM_ABOUTBOX AppendMenu (MF_SEPARATOR); pSysMenu-> AppendMenu (MF_STRING, IDM_ABOUTBOX, strAboutMenu);)) // Ställ in ikonen för den här dialogrutan. Ramverket gör detta automatiskt // när programmets huvudfönster inte är en dialogruta SetIcon (m_hIcon, TRUE); // Ställ in stor ikon SetIcon (m_hIcon, FALSE); // Sätt liten ikon // TODO: Lägg till extra initiering här hFile = CreateFile ("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) (MessageBox ("Det gick inte att öppna porten!", "Fel", MB_ICONERROR);) else (MessageBox ("Porten har öppnats framgångsrikt", "Ok", MB_OK);) return TRUE; // return TRUE om du inte ställer in fokus på en kontroll)

Låt oss nu lägga till hanterare för linjekontrollknapparna. Jag gav dem lämpliga namn: funktionen som sätter en på DTR-raden är OnDTR1 (), 0 är OnDTR0 (). För RTS-linjen, respektive, på samma sätt. Låt mig påminna dig om att hanteraren skapas när dubbelklicka på knappen. Som ett resultat bör dessa fyra funktioner ta formen:

Void CTestCOMDlg :: OnDTR1 () (// TODO: Lägg till din kontrollaviseringshanterarkod här EscapeCommFunction (hFile, 6);) void CTestCOMDlg :: OnDTR0 () (// TODO: Lägg till din kontrollaviseringshanterarkod här EscapeCommFunction (hFile, 5);) void CTestCOMDlg :: OnRTS1 () (// TODO: Lägg till din kontrollaviseringshanterarkod här EscapeCommFunction (hFile, 4);) void CTestCOMDlg :: OnRTS0 () (// TODO: Lägg till din kontrollaviseringshanterarkod här EscapeCommFunction (hFile, 3);)

Låt mig förklara lite hur de fungerar. Som du kan se innehåller de inuti ett anrop till samma Win API-funktioner EscapeCommFunction () med två parametrar. Den första är HANDLE på öppen port, andra - specialkodåtgärd som motsvarar det erforderliga linjevillkoret.

Det är det, låt oss kompilera det, starta det. Om allt är bra bör du se ett meddelande om att porten har öppnats. Sedan, genom att trycka på motsvarande knappar, blinkar vi lysdioderna som är anslutna till COM-porten.

© Dmitry Ivanov
december 2006