Delphi mester, dolgozó com-port Windows alatt

Munka COM-port a Windows

Tehát van a számítógép COM-port. És jó lenne neki küldésére és fogadására bájt. Általában akkor tegye a problémát így: meg kell küldeni a kívánt sorra, és meg kell válaszolni a vonalak jönnek be a port a külső eszközt.

Példa tartalmaz interfész alakja, valamint egy modul egy port. A modul ki kell venni a tényleges futás a program, de (ismét az egyszerűség kedvéért) belőle minden lehetséges fajta vizsgálatot megszakadt, és megpróbálta elhagyni a csontvázat. Egy valódi program, szükséges, hogy egy csomó ellenőrzések (ideális esetben mindegyik után API-funkció), hogy tisztítsa meg a port puffer, és állítsa azt a képességét, stb stb De kezdeni (pl küldeni valamit a modem) az anyag elég. A megkülönböztető jegye a példában - a munka az adatokat fogadó szervezet a port a rendezvény, amely a program vár egy párhuzamos áramlás.

Modul együttműködik a port tartalmaz négy eljárást:
  • PortInit - inicializáló munka és kapni adatáramlás a port.
  • KillComm - tényleges áramlási gyilkosság vétel és a port is.
  • WriteComm - belépés a port.

PortInit eljárást.

Először is létre kell hozni egy portot, és kap az azonosító számát (bár szigorúan véve, hozzon létre egy fájlt, és kap a fogantyút). Ez úgy történik, hogy egy funkció CreateFile:

CommHandle - a fogantyú, vagyis a szám a létrehozott felháborodást. Típus - THandle. Később dolgozott a programban csak vele.
Az első paraméter „COM1” - a tényleges port nevét. Meg lehet változtatni megfelelően (megjegyzendő, hogy ez nem az a típus, húr, és írja PChar). Más beállítások meglehetősen szabványos és a változás őket gyakran nem rendelkeznek. Bár persze, akkor lehet (és kell) és a HELP mászás, és szabadítsa fel a kíváncsiság.

Most adja meg a port beállításait, valamint a maszkot. Maszk - egy esemény leírása, amelyet várja a port, és ami hajt esemény feldolgozása. Ebben a példában úgy véljük, a speciális esetben - a jelképe az elkövetkező „kocsi vissza”. De elég jó, hogy SetCommMask funkciójának leírását (F1, hogy a bal felső sarokban a billentyűzet). Ez nagyon hasznos tudni, hogy mely események esetén is gondoskodik a kezelést.

SetCommMask (CommHandle, EV_RXFLAG); - set EV_RXFLAG maszk - „kezelés egy adott karaktert.” Más szavakkal, amint a port helyes karaktert - a program fogja kezelni az eseményt. Amikor követés több esemény van beállítva, vagy (logikai VAGY).

A szimbólum maga van állítva a DCB-szerkezetet. DCB- szerkezet - egy vezérlő szerkezete a port. A legfontosabb dolog. Be kell, hogy töltse meg. Tulajdonképpen port beállításait határozza meg.

GetCommState (CommHandle, DCB); - kap az aktuális DCB.
DCB.BaudRate: = CBR_9600; - beállított sebességet.
DCB.Parity: = NOPARITY; - helyezze nincs paritás
DCB.ByteSize: = 8; - 8 bit egy byte továbbított.
DCB.StopBits: = OneStopBit; - Egyetlen stop bit.
DCB.EvtChar: = CHR (13); - Ez valóban meg egy karaktert SetCommMask. Ebben az esetben - a kocsi vissza.
SetCommState (CID, DCB); - Hát most már tényleg írja felül DCB.

Természetesen ez nem minden paraméterét DCB, és csak a legfontosabb és leggyakrabban használt. DCB egész szerkezet, valamint az összes paraméter értékeket kaphatunk használatával mindegy gyönyörű kulcs úgynevezett F1.

ReadComm eljárás

Most gondosan mérlegeli ReadComm eljárást. Először is, a szokásos eljárás, amikor belépnek a modult. Másodszor, annak teljes tartalmát segítségével hurkok while true do. De ez nem halálos. Még mindig fut az eljárás csak egy külön téma, így nem rossz lesz. Takarmány meghal, adott esetben.

Így az eljárás tartalmaz egy hurkot, és a hurok vár egy eseményt itt, sőt, a jelenlegi leáll, és egy esemény előírt SetCommMask (a PortInit eljárás). Amint az esemény program megy tovább
(TransMask és EV_RXFLAG) = EV_RXFLAG - ez a kifejezés azt ellenőrizni, és hogy volt-e olyan esemény, amire szükségünk van. Úgy tűnik, ugyanaz. Itt meg kell jegyezni, hogy SetCommMask lehet szállítani segítségével az üzemeltető vagy több esemény. Majd várakozás után felvezető kell biztosítani, illetve, és kevés, ha majd. Mit írnak reakció minden eseményt.
Menj előre.

ClearCommError (CommHandle, hibázik, @ Stat); - annak ellenére, hogy a név, nem ez a funkció törli a hibát, és a valóságban az érkezési az eseményt. Enélkül RXFLAG marad lóg. Meg lehet próbálni kitalálni, hogy mi lesz a következő ciklusban a recepción.

És akkor ott van az aktuális vételi Kols: = Stat.cbInQue; - számítanak a bájtok számát a portpuffert
Readfile (CommHandle, Resive, Kols, Kols, @ Ovr); - olvasható a tömb összes Resive.

Továbbá, az összes szükséges folyamatot eredményez Resive. Hogy ez megtörtént - a kérdés, hogy egy adott fejlesztő, a kényelem és természetesen a kommunikációs protokollt. Egy dolog biztos - ne mi történik a példa. Nem szükséges, hogy kezelni az áramlás a vizuális komponensek (például, Panel1 J). A legjobb megoldás - az egység, hogy működjön együtt a port nem látta a fő egység és a fő formája. Adat kimenet a képernyőn, vagy a feldolgozás történhet úgy, hogy egy időzítő, vagy például, küld egy felhasználói üzenet (message), nos, és a felvezető szervezni a következtetést fogadott el az információkat a képernyőn.

WriteComm eljárást.

eljárás KillComm

Rakjuk a használata a port és minden elsöprő mögött. TerminateThread (CommThread, 0); - „gyilkos” a párhuzamos áram vételi
CloseHandle (CommHandle); - „gyilkos” az önálló port fájlt.

következtetés

Kapcsolódó cikkek