З «точки зору» операційної системи Windows послідовний порт комп’ютерної системи відноситься до комунікаційних ресурсів – фізичним або логічним влаштуй ствам, що забезпечує обмін даними за допомогою окремого двунаправленного асінх ронного потоку даних.

У практичному плані послідовний порт персонального комп’ютера може ис

користуватися або для обміну даними між різними пристроями, або для управління ня та контролю іншими пристроями. Другий аспект менш відомий більшості читачів, оскільки застосування послідовного порту для управління іншими пристроями тре бует більш складних технічних рішень, ніж у випадку стандартного обміну даними.

Почнемо з обміну даними між пристроями. Для операційних систем Windows про мен даними по послідовному порту здійснюється за допомогою стандартних функ ций інтерфейсу WINAPI операційної системи для роботи з об’єктами файлової системи. Перш за все, зауважу, що для програмування операцій з COM портом використовуються хо рошо знайомі нам функції Win API CreateFile, CloseHandle, ReadFile і WriteFile, використовувані при роботі з файлами. Комунікаційні пристрої в опера ционной системі обробляються тими ж функціями, що і звичайні файли, при цьому вони мають спеціальні імена, наприклад, «COM1» присвоєно першого послідовного порту, а «LPT1» – паралельного порту. Так, для відкриття комунікаційного пристрою COM1 можна використовувати функцію CreateFile, першим параметром якої буде ім’я влаштуй ства, в даному випадку, COM1. Отриманий після виклику функції дескриптор пристрою (handle) можна використовувати при наступних операціях з даними у функціях ReadFile, WriteFile і CloseHandle.

Розглянемо запис і читання даних з COM порту в операційних системах Windows на практичних прикладах.

У першому прикладі виконується передача 8 бітового беззнакового числа в послідовності вальний порт. Нижче представлений вихідний текст консольного програми, написаної на мові C + + середовища Microsoft Visual Studio .NET.

#include  <windows.h>

#include  <stdio.h>

void  main(void)

{

HANDLE  hCom;

char  *pcComPort = "COM1"; DCB  dcb;

DWORD   bytesWritten;

   int8 i1;

hCom  = CreateFile(pcComPort,

GENERIC_READ  | GENERIC_WRITE,

0, NULL, OPEN_EXISTING,

0, NULL);

if (hCom  == INVALID_HANDLE_VALUE)

{

printf("COM1  opening  error!\n");

return;

}

GetCommState(hCom,  &dcb);

printf("COM1  baud rate is %d\n",  dcb.BaudRate);

{

while  (true)

{

printf("\nEnter value  to  be  outputted at COM1   port:");

scanf("%du",  &i1); WriteFile(hCom,

&i1, sizeof(i1),

&bytesWritten, NULL);

}

}

CloseHandle(hCom);

return;

}

Для читачів, трохи знайомих з програмуванням на C + + в середовищі Windows, по казанной вихідний текст не представляє особливої ​​складності. У цій програмі спочатку відкривається файл послідовного порту COM1 за допомогою функції WINAPI функції CreateFile. При відкритті комунікаційних портів в Windows необхідно вказувати режим монопольного доступу, встановивши третій параметр функції CreateFile рівним 0 і вказавши атрибут OPEN_EXISTING.

У разі успішного відкриття порту функція CreateFile повертає дескриптор hCom комунікаційного порту, куди і буде записуватися введений з клавіатури консолі сим вол. Функція GetCommState дозволяє отримати параметри послідовного порту, та кі як швидкість обміну, наявність біта парності і т. д. Отримані дані записуються в структуру dcb типу DCB. В даному випадку для контролю швидкості обміну даними последо вательного порту персонального комп’ютера на екран консолі виводиться значення змінної dcb.BaudRate. Думаю, зайве нагадувати, що параметри послідовних портів пристроїв, що обмінюються даними, повинні бути однаковими, інакше обмін дан нимі буде неможливий.

Далі, програма в циклі while виводить в послідовний порт ПК значення, вве

денное за допомогою бібліотечної функції scanf. Запис байта даних в послідовний порт здійснюється WINAPI функцією WriteFile.

Читання даних з послідовного порту зазвичай виконується в циклі, який може бути запущений як з основного потоку програми, так і з окремого потоку. Далі поки зан вихідний текст консольного програми Windows, що виконує прийом символів з послідовного порту і відображає отриманий результат на рядку дисплея.

#include  <windows.h>

#include  <stdio.h>

void  main(void)

{

HANDLE  hCom;

char  *pcComPort = "COM1"; DCB  dcb;

DWORD   bytesRead;

char  buf[128];

hCom  = CreateFile(pcComPort,

GENERIC_READ  | GENERIC_WRITE,

0, NULL, OPEN_EXISTING,

0, NULL);

if (hCom  == INVALID_HANDLE_VALUE)

{

printf("COM1  opening  error!\n");

return;

}

GetCommState(hCom,  &dcb);

printf("COM1  baud rate is %d\n",  dcb.BaudRate);

printf("Waiting  for   data   from COM1…\n");

do {

ReadFile(hCom, buf, sizeof(buf),

&bytesRead, NULL);

if (bytesRead   > 0)

{

buf[bytesRead]  = ‘\0’; printf(buf); printf("\n");

}

}while  (true); CloseHandle(hCom); return;

}

Тут, як і в попередньому Windows додатку, спочатку відкривається послідовник ний порт COM1 (WINAPI функція CreateFile), потім рядок з послідовного порту зчитується в буфер buf функцією ReadFile. Якщо кількість bytesRead прийнятих бай тов не дорівнює 0, то функція printf виводить прийнятий байт на екран консолі ПК.

При розробці графічних додатків в середовищі Visual Studio. NET для роботи з після послідовних портом можна використовувати також і компонентSerialPort, що і буде проде монстріровано в апаратно програмному проекті найпростішої системи контролю температури ри з біметалічним датчиком температури (термореле).

Апаратна частина проекту нескладна, і її схема показана на рис. 4.5.

Рис. 4.18

Вид вікна браузера при спрацьовуванні датчика переміщення

Джерело: Магда Ю. С. Комп’ютер в домашній лабораторії. – М.: ДМК Пресс, 2008. – 200 с.: Іл.