Maeștri de delphi, care lucrează cu com-porturi sub ferestre

Lucrul cu porturile COM în Windows

Deci, avem un com-port pe calculator. Și ar fi bine să trimiteți și să primiți octeți pe el. În general, puteți seta sarcina astfel: trebuie să trimiteți linia corectă și trebuie să răspundeți la linia de intrare către port de pe dispozitivul extern.

Exemplul conține o formă de interfață, precum și un modul de lucru cu portul. Modulul este preluat dintr-un program care funcționează cu adevărat, dar (din nou pentru simplitate) au fost aruncate tot felul de controale și am încercat să las o coloană vertebrală. Într-un program real, trebuie să faceți o mulțime de verificări (în mod ideal după fiecare funcție API), să curățați portul tampon și să setați capacitatea acestuia etc. și altele asemenea. Dar pentru a începe (de exemplu, pentru a trimite ceva la modem) acest material este suficient. O caracteristică distinctivă a acestui exemplu este organizarea primirii de date de la port după eveniment, pe care programul îl așteaptă într-un fir paralel.

Modulul de lucru cu portul conține patru proceduri:
  • PortInit - inițierea lucrării și lansarea unui flux de recepție de date din port.
  • KillComm - de fapt, uciderea fluxului de recepție și a portului în sine.
  • WriteComm - Scrieți la port.

Procedura PortInit.

În primul rând, trebuie să creați un port și să obțineți numărul său de identificare (deși, strict vorbind, creați un fișier și obțineți un mâner). Aceasta se face printr-o funcție CreateFile:

CommHandle - mâner, adică numărul de urâțenie creat. Tip - Thandle. În viitor, vom lucra în program numai cu ea.
Primul parametru este "COM1" - numele portului real. Se poate schimba în consecință (rețineți că acesta nu este un tip de șir, ci un tip PChar). Setările rămase sunt destul de standard și nu vor fi adesea modificate. Deși, bineînțeles, poți (și ai nevoie) să te urci și să-ți dai drumul la curiozitate.

Acum configurați parametrii portului, precum și masca. O mască este o descriere a unui eveniment pe care portul îl va aștepta și care va procesa procesarea evenimentelor. În acest exemplu, considerăm un caz special - sosirea simbolului "retur de transport". Dar faceți probleme pentru a vedea descrierea funcției SetCommMask (tasta F1 este în partea stângă sus a tastaturii). Este foarte util să știm ce evenimente pot fi procesate ulterior.

SetCommMask (CommHandle, EV_RXFLAG); - am setat masca EV_RXFLAG - "procesarea de către un anumit simbol". Cu alte cuvinte, de îndată ce simbolul necesar ajunge la port, programul va începe procesarea acestui eveniment. La urmărirea mai multor evenimente, acestea sunt specificate prin sau (logic sau).

Personajul însuși este setat în structura DCB. Structura DCB este structura de control a portului. Chestia cheie. Este necesar să o umpleți. De fapt, definește setările portului.

GetCommState (CommHandle, DCB); - obținem DCB curent.
DCB.BaudRate: = CBR_9600; - Setați viteza de lucru.
DCB.Paritate: = NOPARITY; - stabilirea absenței unui control al parității
DCB.ByteSize: = 8; - 8 biți în octetul transmis.
DCB.StopBits: = OneStopBit; - un singur element de oprire.
DCB.EvtChar: = chr (13); - de fapt, setați simbolul pentru SetCommMask. În acest caz, carul se întoarce.
SetCommState (cld, DCB); - Ei bine, acum fixăm DCB corectat.

Bineînțeles, acestea nu sunt toți parametrii DCB, ci doar cei mai importanți și cei mai des folosiți. Toată structura DCB, precum și toate valorile parametrilor pot fi obținute cu ajutorul aceleiași taste frumoase numite F1.

Procedura ReadComm

Acum, vom examina mai îndeaproape procedura ReadComm. În primul rând, aceasta este o procedură comună, care intră în componența modulului. În al doilea rând, tot conținutul său este realizat cu buclă folosind în timp ce face adevărat. Dar acest lucru nu este fatal. Totuși, începem procedura exclusiv într-un fir separat, astfel încât să nu existe probleme. Debitul este ucis după cum este necesar.

Procedura conține o buclă și bucla așteaptă evenimentul. De fapt, firul nostru se oprește și așteaptă un eveniment înregistrat în SetCommMask (în procedura PortInit). Odată ce evenimentul a avut loc, programul continuă
(TransMask și EV_RXFLAG) = EV_RXFLAG - cu această expresie verificăm dacă evenimentul sa întâmplat, de ce avem nevoie. Se pare că așa. Aici trebuie notat că în SetCommMask puteți pune mai multe evenimente utilizând operatorul sau. Apoi, în manipulator după așteptare, este necesar să se furnizeze în consecință și mai multe, dacă atunci. Aceasta ar prescrie reacția la fiecare eveniment.
Mergem mai departe.

ClearCommError (CommHandle, Errs, @ Stat); - spre deosebire de nume, aici această funcție elimină nu erorile, ci, de fapt, sosirea evenimentului. Fără ea, RXFLAG va rămâne suspendat. Puteți încerca să ghiciți ce se va întâmpla în următorul ciclu de recepție.

Ei bine și atunci există de fapt recepția Kols: = Stat.cbInQue; - luați numărul de octeți din buffer-ul portului
ReadFile (CommHandle, Resive, Kols, Kols, @Ovr); - citiți totul în matrice Resive.

Mai mult, toate primite în Resive este necesar să se proceseze. Cum se face acest lucru este o chestiune de dezvoltator specific, confort și, bineînțeles, protocolul de schimb. Un lucru pe care pot sa-l spun cu siguranta este NU faceti ca in exemplu. Nu vă referiți la componentele vizuale din flux (de exemplu, la Panel1 J). Cea mai bună soluție este ca unitatea să lucreze împreună cu portul pentru a nu vedea deloc unitatea principală și forma principală. Ieșirea datelor pe ecran sau pentru procesare poate fi realizată fie printr-un cronometru, fie prin trimiterea unui mesaj de utilizator, dar în dispozitivul de gestionare, organizați ieșirea informațiilor primite pe ecran.

Procedura WriteComm.

Procedura KillComm

Legăm folosirea portului și măturăm totul pentru noi înșine. TerminateThreadă (CommThread, 0); - "uciderea" fluxului paralel al recepției
CloseHandle (CommHandle); - "uciderea" portului propriu de fișiere.

concluzie

Articole similare