ПредишенСледващото

Работа с COM-портове в Windows

Така че, ние имаме в компютъра COM-порт. И това би било добре за него да се предават и получават байта. Като цяло, можете да сложите на проблема по следния начин: това е необходимо да изпратите необходимите ред и трябва да отговори на линиите, които влизат в пристанището на външното устройство.

Пример включва интерфейс форма, както и модул за порт. Модулът е взета от действителното изпълнение на програмата, но (отново за простота) от него, бе прекратена всеки възможен вид тест, а аз се опитах да оставите скелет. В една реална програма, е необходимо да се постави един куп проверки (в идеалния случай след всяко API-функция), за почистване на пристанище буфер и задайте своя капацитет и т.н. и т.н. Но да започнем с това (например, за да изпратите нещо с модема) на достатъчно материал. Отличителна черта на този пример - работа на организацията получават данните от пристанището на събитието, което програмата чака в паралелна поток.

Модул за работа с пристанището съдържа четири процедури:
  • PortInit - инициализиране на работа и да започне да получава поток от данни от пристанището.
  • KillComm - действителното приемане убийство поток и на самия порт.
  • WriteComm - влизане в пристанището.

процедура PortInit.

Първо трябва да се създаде порт и да получите своя идентификационен номер (въпреки че, строго погледнато, създадете файл и да получите на дръжката). Това се извършва чрез една единствена функция CreateFile:

CommHandle - дръжката, т.е. броят на създадените възмущение. Тип - THandle. По-късно работи в програмата само с нея.
Първият параметър "COM1" - истинското име на пристанището. Тя може да се променя в съответствие с (имайте предвид, че това не е от типа на низ, и въведете PChar). Останалите настройки са доста стандартни и ги сменят често не разполагат. Въпреки че, разбира се, вие може (и трябва) и да помогне на изкачване и отприщи любопитство.

Сега ние се конфигурират настройките на пристанищните, както и маска. Маска - описание на събитието, което ще се чака за пристанището, както и че ще карам обработка събитие. В този пример, ние считаме специалния случай - ". Връщане" символ на идването на Но е достатъчно добър, за да видите SetCommMask описание на функцията (F1, за да бъде в горния ляв ъгъл на клавиатурата). Много е полезно да се знае кои събития можете дори да организира лечението.

SetCommMask (CommHandle, EV_RXFLAG); - набор EV_RXFLAG маска - "лечение на определен характер." С други думи, веднага след като пристанището ще коригира характер - програмата ще се справят на събитието. Когато проследява множество събития са определени чрез или (логическо ИЛИ).

Самият символ е разположен в DCB-структура. DCB- структура - структура, контрол над пристанището. Най-важното нещо. Трябва да го запълни. Всъщност пристанищни настройки са определени в него.

GetCommState (CommHandle, DCB); - получите текущата DCB.
DCB.BaudRate: = CBR_9600; - зададената скорост.
DCB.Parity: = NOPARITY; - да не паритет
DCB.ByteSize: = 8; - 8 бита в предава байт.
DCB.StopBits: = OneStopBit; - единична стоп бит.
DCB.EvtChar: = CHR (13); - Това е всъщност определя характера на SetCommMask. В този случай - връщане на каретката.
SetCommState (CID, DCB); - Е, сега всъщност предписва ревизирана DCB.

Разбира се това не е всички параметри на DCB, и само най-важните и често използвани. DCB цялата структура, както и на всички стойности на параметрите могат да бъдат получени с помощта на всички едно и също красив ключ, наречена F1.

процедура ReadComm

Сега внимателно да преценят процедура ReadComm. На първо място, това е нормална процедура при влизане в модула. На второ място, цялото му съдържание с помощта на електрически вериги, докато истинската задачи. Но това не е смъртоносна. Все още тече процедурата само в отделна нишка, така че никакво зло няма. Feed е убит, както е уместно.

По този начин, процедурата съдържа една линия и в течение чака събитие тук, в действителност, настоящите ни спирки и чака за дадено събитие е предписано в SetCommMask (в процедура PortInit). Веднага след като се е случило събитието програма отива по-далеч
(TransMask и EV_RXFLAG) = EV_RXFLAG - този израз ние проверяваме, и дали е имало събитие, което ни трябва. Изглежда същото. Тук трябва да се отбележи, че в SetCommMask могат да бъдат доставени с помощта на оператор или няколко събития. После, след като чака манипулатор трябва да се предостави, съответно, и малцина, ако след това. Какво ще предпише реакция на всяко събитие.
Продължавай.

ClearCommError (CommHandle, неправилно, @ Stat); - въпреки името, не е тази функция изчиства грешката и действителната факта на пристигането на събитието. Без него RXFLAG ще остане висящ. Можете да опитате да се отгатне какво ще бъде на следващия цикъл на рецепцията.

И тогава там е действителните Kols приемни: = Stat.cbInQue; - брои броя байтове в пристанищния буфер
ReadFile (CommHandle, Resive, Kols, Kols, @ ЗАМ); - прочетете целия масив Resive.

Освен това, всички необходими процес води до Resive. Как се прави това - въпросът за конкретен разработчик, удобство и, разбира се, е комуникационният протокол. Едно нещо със сигурност - не правя това, което е направено в примера. Не е необходимо да се справят с потока на визуални компоненти (например, Panel1 J). Най-доброто решение - към устройството да работи с пристанището не видя главното устройство и основната форма. изходни данни на екрана или на обработката може да стане или чрез таймер или, например, изпращане на потребителска съобщение (съобщение), както и в манипулатор за организиране на заключение, прието от информацията на екрана.

процедура WriteComm.

процедура KillComm

Обвързването на използването на пристанището и метене задника. TerminateThread (CommThread, 0); - "убиване" на паралелен поток прием
CloseHandle (CommHandle); - "убива" самостоятелно пристанище по делото.

заключение

Свързани статии

Подкрепете проекта - споделете линка, благодаря!