ування внутрішніх регістрів адаптера. При передачі він очікує моменту виникнення сигналу СTS (Clear To Send), а при прийомі - моменту настання події «Готовність байта даних». Програмне забезпечення для обміну в цьому випадку набагато простіше, але відсутня можливість виконання інших програм. Справа в тому, що момент «Готовність байта даних» не можна залишити в очікуванні обслуговування (читання регістра даних), так як прийнятий байт може бути перевизначений наступним байтом.
У розробляється програмному забезпеченні використовується другий спосіб - послідовне опитування. При цьому проблема відсутності при цьому можливості виконання інших програм вирішується елементарно за допомогою багатозадачною концепції операційної системи Windows. За отримання послідовності байт інформації з апаратури Контроль відповідає додаткова запускається нитка (процес), яка працює з не дуже високим пріоритетом і здійснює постійний послідовний опитування COM-порту. У разі виявлення події «Готовність байта даних», ця нитка записує прийнятий байт у внутрішній буфер і після закінчення прийому всієї послідовності, що складається, як було сказано раніше, з 32 байт, здійснює виклик функції розкодування прийнятої послідовності.
Для створення додаткової нитки використовується абстрактний клас Tthread, який дозволяє створювати окремі нитки виконання у додатку. У розробляється програмному забезпеченні створюється клас, похідний від Tthread - SerialLink:
class SerialLink: public Tthread
{:: __fastcall Execute ();:
__fastcall SerialLink (bool CreateSuspended); __fastcall DecodePacket (void);
};
У конструкторі отриманого класу проводиться встановлення пріоритету додаткової нитки:
__fastcall SerialLink :: SerialLink (bool CreateSuspended)
: Tthread (CreateSuspended)
{= true;=tpIdle;
}
У методі класу SerialLink - успадкованої від Tthread функції Execute () відбувається відкриття, початкова ініціалізація і установка таймаутів послідовного порту COM1. Для відкриття використовується функція CreateFile:
HANDLE hCom; BOOL fSuccess; hCom=CreateFile («COM1», / / ??порт COM1 GENERIC_READ, / / ??на читання 0, / * пристрої зв'язку повинні бути відкриті з ексклюзивним доступом * / NULL, / * без атрибутів безпеки * / OPEN_EXISTING, / * пристрої зв'язку повинні використовувати OPEN_EXISTING * / 0, / * без пересеченного введення-виведення * / NULL / * параметр hTemplate повинен бути NULL для пристроїв зв'язку * /);
Початкова ініціалізація COM-порту відбувається відповідно з параметрами вихідних сигналів апаратури Контроль. Для ініціалізації використовуються функції GetCommState і SetCommState:
fSuccess=GetCommState (hCom, & dcb);/* Заповнюємо структуру DCB:
швидкість=9600,
бітів даних,
без контролю парності,
стоп-біта. * / Dcb.BaudRate=9600; dcb.ByteSize=8; dcb.Parity=NOPARITY; dcb.StopBits=TWOSTOPBITS; fSuccess=SetCommState (hCom, & dcb);
Установка таймаутів проводиться за допомогою функцій GetCommTimeouts і SetCommTimeouts: <...