Rēzeknes Augstskola
Inženieru fakultāte
Datorzinātņu un matemātikas katedra
DATORU ARHITEKTŪRA
Referāts
Datora portu programmēšana
Autors
Dienas nodaļas
Inženiera programmētāja specialitātes
3.kursa studente
Sandra Lobazova
St. apliecības Nr.:04I1020
Docētājs
Docents ______________ Pēteris Grabusts
Rēzekne 2006
Satura rādītājs
Ievads3
1. Paralēlo datoraparatūras portu programmēšana5
1.1.Uzbūve, adresācija un paralēlo portu veidi5
1.2.Paralēlo portu programmēšanas iespējas un kodu paraugi6
1.3.Iespējamās problēmas, programmējot paralēlos portus8
2.Seriālo datoraparatūras portu programmēšana10
2.1.Seriālo portu pamata jēdzieni, uzbūve un darbības principi10
2.2.Datu formāti11
2.3.Datora seriālo portu programmēšana11
Izmantotā literatūra15
Datoraparatūras terminos, ports kalpo kā saskarne starp datoru un citiem datoriem vai aparatūru elektriski savienotas ar vadu kontaktligzdas veidā uz aprīkojuma vai iekārtas, kurai tiek pieslēgts kabelis vai spraudkontakts. Šiem datoraparatūras portiem ir dažādas fiziskas formas (female, male, apaļi, taisnstūrveida utt.). Portu fiziskajās īpašības un funkcijas ir daļēji standartizētas, piemēram, vairākumam datoru ir tastatūras ports, kuram pievieno tastatūru. Datoraparatūras portus gandrīz vienmēr var iedalīt divās lielās grupās:
•seriālie porti sūta un saņem vienu bitu vienā laika posmā pa vienstieples vadu pāri;
•paralēlie porti nosūta vairākus informācijas bitus, izmantojot vairākus vadu kopu.
Sistēmas maģistrāle, kas satur mātesplates paplašināšanas slēdžus ir paralēlā porta forma. Datoraparatūras portu apvienošana ir tehnoloģija, kas ļauj vairākus datoraparatūras portus apkopot vienā grupā, efektīvi radot vienu pieslēgumu ar lielāku joslas platumu. Šī tehnoloģija dod arī augstāku bojājumpiecietības pakāpi.
Programmnodrošinājuma ports ir virtuāls datu savienojums, ko var izmantot programmas, lai tiešā veidā apmainītos ar datiem, nevis izejot caur failu vai kādu citu laicīgu datu glabātuvi. Visizplatītākie no šādiem portiem ir TCP un UDP porti, kuri tiek izmantoti, pārsūtot datus starp datoriem Internetā.
Ievada/izvada operācijām gandrīz visas procesoru ģimenes lieto līdzīgas asamblera instrukcijas piekļūšanai gan atmiņai, gan datoraparatūras ievadam/izvadam. Tomēr Intel mikroprocesoriem ir asamblera instrukcijas (IN un OUT), kas tiek lietotas sevišķi datoraparatūras ievadam/izvadam. Šīs instrukcijas aprēķina, ar kuru datoraparatūras ierīci sazināties, izmantojot izvada/ievada porta jeb mašīnporta koncepciju. Šie porti ir numurēti, balstoties uz tā, uz kuru datoraparatūras ierīci tie atsaucas. Intel mikroprocesori galvenokārt atļauj sūtīt vai saņemt vienu oktetu (8-bitu baitu vai vārdu) katras instrukcijas laikā. Datoraparatūras ierīce nolemj kā interpretēt datus, kas tai nosūtīti un kādus datus nosūtīt procesoram. Piemēram, parasti tiek sūtīts vaicājums datoraparatūras ierīcei par to, kāds baits (datu pārsūtīšanā) tiks sūtīts nākamais.
1.tabula – Populārāko datora interfeisu salīdzinājums
(vietās, kur standarts nenosaka maksimumu, rakstīts parasti pielietojamais maksimums)
InterfeissFormātsIerīču skaits (maksimums)Maksimālais garums (pēdas)Ātrums (maksimālais, biti/sek)
RS-232 (EIA/TIA-232)asinhronais seriālais250-10020k (ar dažiem draiveriem 115k)
RS-485 (TIA/EIA-485)asinhronais seriālais32 (unit loads)40001M
IrDAasinhronais seriālais infrasarkanais26115k
Microwiresinhronais seriālais8102M
SPIsinhronais seriālais8102.1M
I2Csinhronais seriālais4018400k
USBasinhronais seriālais1271612M
Firewireseriālais6415400M
IEEE-488 (GPIB)paralēlais15601M
Ethernetseriālais1024160010M
MIDIseriālais (current loop)21531.5k
Paralēlais printera portsparalēlais2, vai 8 ar daisy-chain atbalstu10-301M
1.1.Uzbūve, adresācija un paralēlo portu veidi
Oriģinālajam datora paralēlajam portam bija astoņi izvadi, pieci ievadi un četras divvirziena līnijas. Tas ir pietiekoši, lai komunicētos ar daudzām perifērijas ierīcēm. Daudzos jaunākos datoros astoņi izvadi var kalpot arī ievadīšanai, lai ātrāk sazinātos ar skeneriem, pievadiem un citām ierīcēm, kas nosūta savus datus uz datoru.
Standarta paralēlais ports izmanto trīs 8-bitu portu reģistrus datorā. Dators piekļūst paralēlā porta signāliem, nolasot un rakstot uz šiem reģistriem, ko parasti sauc par Datu, Statusa un Kontroles reģistriem. Katram no signāliem ir vārds, kas apzīmē tā funkciju printera interfeisā. Saskarnē ar citiem ierīču tipiem, signālus nevajag izmantot to oriģinālajiem mērķiem. Piemēram, ja nesazinās ar printeri, paper-end signāls nav vajadzīgs, un ievadi var izmantot citiem nolūkiem.
Paralēlais ports tika izstrādāts kā printera ports, un daudzi porta signālu oriģinālie nosaukumi atspoguļo šādu pielietojumu (PaperEnd, AutoLineFeed). Tomēr mūsdienās blakus printerim var atrast daudzas ierīces pieslēgtas pie šī porta. Mūsdienās izstrādātas daudzas paralēlā porta modifikācijas lielākas efektivitātes (galvenokārt ātruma) palielināšanai. Šādi modificētie porti ir, piemēram, EEP (Enchanced Parallel Port), ECP (Extended Capabilities Port), Multi-Mode porti utt.
Standarta paralēlais ports izmanto trīs saistītas adreses, parasti vienā no šiem apgabaliem:
3BCh, 3BDh, 3BEh
378h, 379h, 37Ah
278h, 279h, 27Ah
Pirmā adrese apgabalā ir porta bāzes adrese, ko sauc arī par Datu reģistru vai vienkārši porta adresi. Otrā adrese ir porta Statusa reģistrs, un trešā ir Kontroles reģistrs.
Daudzos datoros tiek izmantoti tādi paralēlie porti kā SCSI un IEEE-488. SCSI (small computer sustem interface) ir paralēlais interfeiss, kas atļauj pieslēgt līdz septiņām ierīcēm uz viena kabeļa, turklāt katrai ierīcei ir unikāla adrese. Daudzi datori izmanto SCSI saskarnei ar ārējiem vai iekšējiem cietajiem diskiem, diskus lasošām iekārtām u.c. SCSI interfeisi ir ātri, un kabelis var būt līdz par 6 metrus garš. Tomēr standarta paralēlā porta saskarne ir vienkāršāka, lētāka un izplatītāka. IEEE-488 ir paralēlais interfeiss, ko izstrādāja Hewlett Packard, un kas spēj apvienot uz viena kabeļa līdz 15 ierīcēm, kas sazinās ar ātrumu līdz 1 Mb sekundē.
1.2.Paralēlo portu programmēšanas iespējas un kodu paraugi
Windows, DOS un Visual Basic piedāvā vairākas iespējas, kā nolasīt un ierakstīt informāciju paralēlajos portos. Vistiešākais veids ir nolasīt un ierakstīt porta reģistros. Vairākums programmēšanas valodu atbalsta šo iespēju, vai vismaz atļauj to pievienot. Visual Basic iekļauj arī citas opcijas, tādas kā Printer objekta iekļaušanu, PrintForm metodi un Open LPTx. Windows ir arī API izsaukumi piekļūšanai LPT portiem, un 16-bitu programmas, kas izmanto BIOS un DOS programmnodrošinājuma pārtraukumus piekļūšanai LPT.
Ir daudz veidu, kā piekļūt paralēlajam portam no pielietojumprogrammām, bet parasti notiek rakstīšana vai lasīšana no porta reģistriem. Reģistri ir speciālā apgabalā, kas domāta piekļūšanai ievada/izvada ierīcēm, ieskaitot printerus un tastatūru, disku iekārtas, displeju un citām komponentēm. Lai atšķirtu ievada/izvada ierīces un sistēmas atmiņu, mikroprocesors izmanto atšķirīgas instrukcijas un kontroles signālus katram. Ierakstīt informāciju vai nolasīt to no portiem var, izmantojot asamblera valodu vai augsta līmeņa valodas, tādas kā Basic, Pascal un C.
Tiešā rakstīšana un lasīšana no porta reģistriem dod gandrīz pilnīgu kontroli pār paralēlo portu signāliem. Atšķirībā no citām metodēm, tiešā rakstīšana/nolasīšana nepieliek kontroles vai t.s. handshaking signālus; tā vienkārši nolasa vai nosūta baitu uz norādīto portu (tomēr EEP un ECP arī vienkāršajā portu rakstīšanā/lasīšanā pievienos automātisku handshake).
Lai tieši rakstītu portā, jānorāda porta reģistrs un dati, kas jāraksta, un jāinstruē CPU ierakstīt datus pieprasītajā portā. Lai nolasītu no porta, norāda porta reģistru un vietu, kur uzglabāt nolasītos datus, un noinstruē CPU nolasīt datus norādītajā vietā.
Piemēram, programma, kas vienkārši ieraksta noteiktu vērtību paralēlajā portā, rakstīta asamblera valodā, izskatās šādi (paskaidrojumi komentāros, x86):
title Parallel Port Writer
; Šī programma ieraksta vienu vērtību paralēlajā portā.
; Pielietota out instrukcija (out accumulator, port).
; Ports var būt konstante diapazonā 0-FF hex,
; vai vērtība DX no 0 un FFFF hex.
dosseg
.model small
.stack 100h
.code
main proc
mov al,48; 8-bitu izvada vērtība, uzglabāt al
mov dx,378h; paralēlais ports ir 378 hex
out dx,al; ieraksta vērtību
mov ax,4C00h; atgriežas DOS
int 21h
main endp
end main
Lai nolasītu vērību no porta, izmantojot asamblera valodu, izmanto instrukciju in, piemēram, lai nolasītu 379h Status porta vērtību:
mov dx,379h ; uzglabāt porta adresi dx
in al,dx ; nolasīt datus no porta adreses al
Visual C++ ierakstīšana paralēlajā portā var tikt izpildīta, izmantojot bibliotēku conio.h, kas satur funkciju _outp. Šī funkcija var ierakstīt datus norādītajā portā. Zemāk redzamais piemērs paņem lietotāja ievadītu vērtību un ieraksta to paralēlajā portā:
#include <conio.h>
#include <stdio.h>
// Šī programma saņem ievada vērtību no lietotāja
// decimālajā formā un izvada šo vērtību kā 8-bitu
// bināro skaitļ portam pēc adreses 378 hex, parasti LPT1
int main () {
int inval = 0;
while ( inval < 256) {
printf("Enter a value in decimal (256 to quit)>");
scanf("%d", &inval);
_outp(0x378, inval);
}
_outp(0x378, 0);
return 0;
}
Pascal programmētāji var izmantot funkciju port, lai piekļūtu paralēlajiem portiem, piemēram, lai ierakstītu AAh Datu portā 378h:
port[378h]:=AAh
Lai nolasītu Status portu 379h:
value:=port[379h]
1.3.Iespējamās problēmas, programmējot paralēlos portus
Programmējot paralēlos portus ar tiešās piekļuves palīdzību no Windows NT/2000/XP vides, nākas saskarties ar problēmu: augstāk minētie programmkodi neizpildās. Iemesls tam ir tāds, ka Windows NT kodols neatļauj lietotāju rakstītu programmu tiešu piekļuvi ievada/izvada portiem. Risinājums šeit ir uzrakstīt draiveri vai izmantot kāda cita izstrādātāja izveidotus rīkus tiešai portu piekļuvei. Piemēram, šim nolūkam izmantojama programma ar nosaukumu UserPort. UserPort ir kodola režīma draiveris, ko var izmantot Windows NT/2000/XP, lai atļautu lietotāja rakstītām programmām piekļūt ievada/izvada portiem. UserPort pamata pielietojums ir:
1. Nokopēt UserPort.sys uz %windir%system32drivers
2. Palaist UserPort.exe, lai uzstādītu portu diapazonu, ko vēlas izmantot pašveidotām pielietojumprogrammām.
Izskatās pietiekoši vienkārši, tomēr mīnuss ir tāds, ka līdz ar to tiek atvērts “caurums” drošības sistēmā, ko var izmantot ļaundabīgas programmas. Tāpēc ir jāatver pieejai tikai to portu diapazonu, kuram ir nepieciešama pieeja. Lai novērtētu nepieciešamo diapazonu, var pārbaudīt resursus, ko izmanto paralēlais ports. Sīkāku informāciju par UserPort pielietojumu un tehniskajām īpatnībām var atrast UserPort dokumentācijā.
2.Seriālo datoraparatūras portu programmēšana
2.1.Seriālo portu pamata jēdzieni, uzbūve un darbības principi
Mūsdienās nedaudziem datoriem ir vairāk par diviem seriālajiem portiem. Paralēlie porti ir jaunāks izgudrojums, kas atļauj ātrāku datu apmaiņu. Lēš, ka nākošo dažu gadu laikā gan paralēlos, gan seriālos portus aizvietos pilnīgi ar USB portiem. Tomēr visas operētājsistēmas atbalsta seriālos portus, jo tie salīdzinoši sen tiek izmantoti.
Būtībā seriālie porti nodrošina standarta konektoru un protokolu, lai ļautu pieslēgt ierīces, tādas kā modems, pie datora. Nosaukums „seriālais” radies no fakta, ka seriālais ports datus „izlaiž sērijās” (serializes). Tas ir, tas ņem datu baitu un pārraida šos astoņus bitus vienā baitā vienā laika sprīdī. Priekšrocība ir tāda, ka seriālajam portam ir nepieciešams tikai viens vads, lai pārraidītu 8 bitus (tajā pašā laikā paralēlajam portam vajag 8 vadus). Trūkums ir tāds, ka šī procedūra aizņem 8 reizes ilgāk, lai pārraidītu datus, nekā tas ir gadījumā, ja būtu pieejami 8 vadi. Seriālie porti samazina kabeļu izmaksas un veido šos kabeļus mazākus.
Pirms katra datu baita seriālais ports nosūta starta vienu starta bitu ar vērtību 0. pēc katra datu baita ports nosūta stop signālu, paziņojot, ka baits ir vesels (pabeigts). Var tikt nosūtīts arī vienlīdzības bits (parity).
Seriālie porti, kurus sauc arī par komunikāciju (COM) portiem, ir divvirzienu (bi-directional). Šāda komunikācija atļauj katrai ierīcei saņemt datus un vienlaicīgi nosūtīt tos. Seriālās ierīces izmanto dažādas adatas (pins), lai saņemtu un nosūtītu datus, jo vienu un to pašu adatu izmantošana limitētu komunikāciju – informācija varētu tikt pārsūtīta tikai vienā virzienā vienā laika posmā.
Seriāli porti korektai funkcionēšanai bāzējas uz speciālas kontrollera mikroshēmas – Universal Asynchronous Receiver/Transmitter (UART). UART mikroshēma saņem paralēlo izvadi no datora sistēmas maģistrāles un pārveido to seriālajā formā raidīšanai caur seriālo portu. Ātrākai funkcionēšanai vairākums UART mikroshēmu ir iebūvēts buferis (16 līdz 64 Kb). Šis buferis ļauj mikroshēmai uzglabāt datus, kas tiek sūtīti no sistēmas maģistrāles, kamēr pati mikroshēma apstrādā datus, kurus ir jāizsūta uz seriālo portu.
Svarīgs seriālo komunikāciju aspekts ir datu plūsmas kontroles koncepcija. Tā ir iespēja vienai ierīcei paziņot citai ierīcei pārstāt sūtīt datus uz kādu laiku. Komandas Request to: Send (RTS), Clear To Send (CTS), Data Terminal Ready (DTR), Data Set Ready (DSR) tiek pielietotas, lai veicinātu plūsmas kontroli.
2.2.Datu formāti
Datu biti seriālajā pārraidē var simbolizēt jebko, ieskaitot komandas, sensora nolasījumus, statusa informāciju, kļūdu kodus, teksta paziņojumus. Informācija var būt iekodēta kā binārie vai teksta dati.
Bināro datu gadījumā uztvērējs interpretē saņemto baitu kā bināro skaitli ar iespējamo vērtību no 0 līdz 255. Biti ir nosacīti numurēti no 0 līdz 7. Daudzām saiknēm binārie dati ir apmierinoši, bet dažām saitēm ir nepieciešams nosūtīt ziņojumus vai failus, kas satur tekstu. Lai nosūtītu tekstu, tiek izmantots kods, kas piešķir skaitlisku vērtību katram teksta simbolam. Ir vairākas kodēšanas konvencijas. Viena no vispopulārākajām ir ASCII, kas sastāv no 128 kodiem un pieprasa tikai septiņus datu bitus.
2.3.Datora seriālo portu programmēšana
Daudzas programmēšanas valodas atbalsta seriālo komunikāciju, iekļaujot funkcijas seriālo portu konfigurācijai un datu nolasīšanai/ierakstīšanai. Seriālo portu pārvaldes rīki ir pieejami arī no citiem avotiem. Windows ir seriālo komunikāciju funkcijas tā API (Applications Programmers’ Interface), un jebkura programmēšanas valoda, kas var izsaukt API funkcijas, var tās izmantot.
Viens no veidiem, kā programmēt datoraparatūras seriālos portus, ir izmantojot Visual Basic MSComm – seriālo komunikāciju klienta kontroli. Šāda pieeja dod iespēju daudz vienkāršāk un efektīvāk programmēt seriālos portus, nekā izmantojot citi pieejas portam veidi. MSComm ir saistītās funkcijas, kas sīki uzskaitītas Visual Basic dokumentācijā. Tās aptver konfigurācijas iespējas (CommID, CommPort, InBufferSize, OutBufferSize, Setting u.c.), datu pārraides iespējas (CommEvent, EOFEnable, Input, Output u.c.), identifikācijas iespējas (Index, Name, Object, Parent u.c.). Sākot no Visual Basic 5, datus var pārsūtīt gan binārajā, gan teksta formā. InputMode definē, kādu formātu izmantos MSComm.
Teksta formātā darbs ar seriālo portu programmēšanu notiek šādi: InputMode īpašību uzstāda comInputModeText, līdz ar to MSComm sūta un saņem datus ANSII rindu režīmā. Lai nosūtītu rindu uz seriālo portu, MSComm Output jāuzstāda vienādu ar rindu:
Dim SampleText As String
‘Nosūtāmais teksts:
SampleText = „ABC”
‘Nosūta tekstu uz portu
MSComm1.Output = SampleText
Lai nolasītu rindu no porta, MSComm Input jāuzstāda vienādu ar rindu:
Dim SampleText As String
‘Nolasa ievada datus rindā
SampleText = MSComm1.Input
Lai nosūtītu un saņemtu datus binārajā formā, MSComm InputMode jāuzstāda comInputModeBinary. Visual Basic atbalsta mainīgo datu tipu Byte bināro datu glabāšanai. Baitus, kas tiek nolasīti/ierakstīti seriālajā portā, uzglabā mainīgajos, kas satur baitu masīvus. Pat ja tikai ir viens apstrādājamais baits, tam ir jābūt baitu masīvam, nevis vienkārši Byte tipa mainīgajam. Baitu masīva rakstīšana seriālajā portā ir 2-soļu process. Vispirms baitu masīvu piešķir mainīgajam, tad nosūta datus, mainīgo pielīdzinot porta Output īpašībai:
Dim BytesToSend (0 To 1) As Byte
Dimm Buffer As Variant
‘Uzglabā datus binārajā masīvā
BytesToSend(0) = &H4A
BytesToSend(0) = &H23
‘Uzstāda mainīgo vienādu ar masīvu
Buffer = BytesToSend()
‘Ieraksta mainīgo portā
MSComm1.Output = Buffer
Lai nolasītu datus no porta, rīkojas otrādi: nolasa mainīgo no porta, un tad pielīdzina baitu masīvu šim mainīgajam:
Dim BytesReceived () As Byte
Dimm Buffer As Variant
‘Nolasa datus no porta
Buffer = MSComm1.Input
‘Uzglabā datus baitu masīvā
BytesReceived() = Buffer
Ir divi veidi, kā konvertēt datus no baitu masīviem uz variantēm un otrādi. Var uzstādīt mainīgo vienādu ar vēlamā datu tipa mainīgo, un Visual Basic izdarīs konvertāciju automātiski:
Dim DimendionedByteArray(15) As Byte
Dim DynamicByteArray() As Byte
Dim Buffer As Variant
Dim Count As Integer
‘Uzglabā baitu masīvu mainīgajā:
‘Masīvam jābūt dimensionālam
Buffer – DimensionedByteArray()
‘Nokopē mainīgā saturu baitu masīvā
‘Masīvam jābūt dinamiskam (ne dimensionālam)
DynamicByteArray() = Buffer
Jeb var izmantot Visual Basic datu tipa konversijas funkcijas:
‘Uzglabā baitu masīvu mainīgajā:
Buffer = CVar(DynamicByteArray())
‘Uzglabā mainīgā saturu baitu masīvā:
For Count = 0 To (LenB(Buffer)-1)
DimensionedByteArray(Count) = CByte(Buffer(Count))
Next Count
MSComm nav vienīgais veids, kā komunicēt ar seriālajiem portiem no Visual Basic vides. Alternatīvas iekļauj Windows API funkciju izmantošanu vai DLL izmantošanu, vai jebkura cita draivera, kas nodrošina datu nolasīšanu/ierakstīšanu seriālo portu reģistros izmantošanu. Daži draiveri nodrošina arī tiešu piekļuvi porta reģistriem.
Tāpat kā paralēlos portus, arī seriālos portus var programmēt un pārvaldīt no DOS vides. Ierīcei, kas domāta datu iegūšanai un nosūtīšanai kādam specifiskam nolūkam, var nebūt vajadzīgas Windows papildus iespējas. Nodošanās viena uzdevuma izpildei pilnīgi nozīmē, ka nav vajadzīgs Windows vairākuzdevumu režīms. Programmai, kas darbojas ar minimālu vai neesošu operatora starpniecību, nav nepieciešamības pēc Windows vizuālā interfeisa. Šajos gadījumos seriālajiem portiem var piekļūt, izmantojot Microsoft QuickBasic vai līdzīgus DOS Basic. Darbošanās ar seriālajiem portiem QuickBasic vidē daudzējādā ziņā ir līdzīga seriālo portu programmēšanai Visual Basic vidē.
Protams, izņemot Visual Basic, arī citas valodas atbalsta iespēju programmēt seriālos portus, tādas kā C++, C, Pascal u.c.
1. Jan Axelson, Parallel Port Complete, Lakeview Research, 1998, 179 pages
2. Jan Axelson, Serial Port Complete, Lakeview Research, 2000, 321 pages
3. http://www.lammertbies.nl/comm/index.html (29.11.2006.)
4. http://en.wikipedia.org/wiki/Computer_port_%28hardware%29 (29.11.2006.)
5. http://en.wikipedia.org/wiki/Computer_port_%28software%29 (29.11.2006.)
6. http://www.mattjustice.com/parport/ (30.11.2006.)
7. http://www.lvr.com/serport.htm(30.11.2006.)
8. http://www.lvr.com/parport.htm(30.11.2006.)
9. http://www.computerhope.com/network/ports.htm(30.11.2006.)