Розробка алгоритму та програми. Для роботи з СОМ-перехідником який застосовується в даному курсовому проекті потрібно встановити драйвер для певної ОС

 

Для роботи з СОМ-перехідником який застосовується в даному курсовому проекті потрібно встановити драйвер для певної ОС.

Для реалізації нашої програми створимо два потоки для роботи функцій введення та виведення масивів даних. Так як два різних потоки не можуть одночасно працювати зі спільним ресурсом, створюємо затримки для цих потоків. Наприклад: коли потік А буде працювати зі спільним ресурсом, потік Б буде очікувати звільнення спільного ресурсу. Як тільки потік А звільнить ресурс, потік Б почне роботу з ним.

Отже, розберемо роботу програми яка зображена на рисунку 2.1.

Рис. 2.1 – Вікно робочої програми

 

1) Створимо вікно програми функцією __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { }.

2) Кнопки під номерами 2,3,4,5,6,7 створюються за допомогою void __fastcall TForm1::Button N Click(TObject *Sender) – де N номер певної кнопки.

Для правильної роботи програми потрібно спершу підключитись до потрібного COM-порту. Для цього в полі під номером 4, вводимо назву потрібного порту. Після чого натискаємо на кнопку під номером 5. Після чого проводимо перевірку чи дійсно програма підключилась до потрібного порту, як показано на алгоритмі рис. 2.1.

Рис. 2.1 – Алгоритм підключення до COM-порту

Зчитаємо дані з підключеного СОМ-порту. Якщо рівень сигналу рівний рівню логічної 1, тоді змінюємо колір індикатора на червоний (Рис. 2.1 під номером 2, Рис. 2.2, 2.6) та зчитуємо дані. Якщо ні, змінюємо колір індикатора на сірий (Рис. 2.5) і переходим до наступного пунтку.

Далі, відбудеться запис даних в СОМ-порт. Якщо є дані для передачі, змінимо колір індикатора на зелений (Рис. 3.1 під номером 3, Рис. 3.7), та передаємо дані. Якщо ж ні, колір індикатора залишається сірим (Рис. 2.5) і переходим до наступного пунтку. Останнім пунктом перевіряється чи продовжувати роботу пограми, якщо ні то виходимо з програми, якщо так вертаємось до початку програми. Повний алгоритм наведено в додатку А.

Отже, в результаті виконання цих пунктів отримуємо таку робочу програму (Рис 2.4). Код програми наведений в додатку Б.

Рис. 2.2 – Зчитування даних з СОМ-порту

 

 

Рис. 2.3 – Передача даних в СОМ-порт

 

 

Рис. 2.4 –Програма та інформація про розробників.

 

Рис. 2.5 – Підключення COM-порту

 

Рис. 2.6 – Відбувається зчитування даних.

 

Рис. 2.7 – Відбувається запис даних.

 

Дана програма може працювати в будь-якій версії Windows на яку встановлена оболонка Borland Builder C++. В результаті компілювання даної програми був створений виконуваний файл Project1.exe.


ВИСНОВКИ

В даній науково-дослідній роботі було проведено аналіз послідовних інтерфейсів COM та USB, та передача потоків даних через них. Також наведено детальну інформацію про середовище розробки Borland Builder, робота з високорівневою мовою програмування С++. Можливості реалізації передачі даних на зовнішній пристрій за допомогою мови C++.

Було розроблено програму для лабораторного стенду плати індикації вводу/виводу для передачі та зчитування потоків даних на та з COM-порту.

ЕОМ IBM PC, на якому відбувається робота програми, повинен мати наступні мінімальні конфігурації:

1. Процесор 286DX/66MHz або кращий;

2. Оперативну пам’ять не менше 16 МБ;

3. 3,19 МБ вільного місця на жорсткому диску;

4. ОС Windows 95/98/NT/ME/2000/XP/Vista/Win 7/ Win 8;

5. Монітор;

6. Відео карту.


ПЕРЛІК ПОСИЛАНЬ

1.  http://cisco.opennet.ru/docs/RUS/serial_guide/index.html#2_2 – розробка програм для RS-232;

2. http://www.softelectro.ru/rs232.html - опис RS232, COM портів;

3. http://www.denvo.ru/pub/hardware/rs-232.html - інтерфейс RS-232;

4. 4 http://www.realcoding.net/articles/programmirovanie-com-portov.html- програ-

мування COM портів;

5.  http://carradio.narod.ru/03.html - програмування портів вводу/виводу;

6. http://www.comprog.ru/Assembler/article_267.htm - програмування COM портів;

7. http://www.alterbit.ru/glossary121.html - універсальна послідовна шина;


ДОДАТКИ


ДОДАТОК А

Алгоритм програми

 

ДОДАТОК Б

Код програми

 

#include <vcl.h>

#pragma hdrstop

 

#include "Unit1.h"

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

HANDLE hComPort, hComPortW, hComPortR;

// індефікатори портів запису читання

int status = 0; // статус підключення

int thStW = 0; // статус запису в порт

DWORD bytes; // змінна яка містить зчитаних к-сть байт

char *szComPort; // змінна яка містить назву порта

char buf[4]; // допоміжний буфер даних

char *buf_out = "1"; // масив даних які відправляються в порт

char *buf_in = new char[strlen(buf_out)]; // буфер для читання даних

int a = 0;

HANDLE hThreadR, hThreadW;

// індефікатори функцій потоків читання та запису

DWORD thIDR, thIDW; // індефікатори потоків

DWORD WINAPI read(LPVOID IpParam);

// оголошення функції потоку для читання

DWORD WINAPI write(LPVOID IpParam);

// оголошення функції потоку для запису

__fastcall TForm1::TForm1(TComponent* Owner) // створення форми

: TForm(Owner)

{ }

void __fastcall TForm1::Button1Click(TObject *Sender) // створення кнопки підключення до пристрою

{

if (status == 1) { // якщо він підключений

// CloseHandle(hComPort); // відключитись від порта

SuspendThread(hThreadR); // зупитини потік читання

SuspendThread(hThreadW); // зупитини потік запису

Shape1->Brush->Color=clInactiveCaption; // задати сірим кольором запис

Button1->Caption="Підключитись"; // змінити напис на підключитись

status = 0; // занулюємо

}else{ // якщо пристрій не був підключений

hComPort = CreateFileA(COM1->Text.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // підключення до ком порта

COMMTIMEOUTS ComTimeouts={100,100,150,100,150}; // затримки запису, читання

SetCommTimeouts(hComPort, &ComTimeouts); // виконати затримки

if (hComPort == INVALID_HANDLE_VALUE) { // перевірка підключення до ком порта

MessageBox(NULL, "Неможливо підключитись до пристрою", "Помилка", MB_OK); // виведення повідомлення

}else{ //якщо підключились

CloseHandle(hComPort);

Button1->Caption="Відключитись"; // міняємо напис на відключення

szComPort = COM1->Text.c_str(); // зчитуємо дані про ком порт

hThreadR = CreateThread(NULL,0,read,0,0,&thIDR);

// запуск потік читання

status = 1; // записуєм одиничку

if(thStW == 1){

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

ResumeThread(hThreadW); // відновлюємо потік запису

}

}

}

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)

// створення кнопки для початку і зупинення запису

{

if(Shape1->Brush->Color == clLime){ // зафарбувати зеленим

SuspendThread(hThreadW); // зупиняємо потік запису

Shape1->Brush->Color=clInactiveCaption; // зафарбовуємо сірим

Button2->Caption="Почати запис";

// відображення напису "почати запис" на кнопці

}else{

Shape1->Brush->Color=clLime; // зафарбовуємо зеленим

Button2->Caption="Зупинити запис";

// відображення напису "зупинити запис" на кнопці

ResumeThread(hThreadW); // відновлюємо потік запису

if(thStW == 0){ // якщо попередньо запис не відбувався

hThreadW = CreateThread(NULL,0,write,0,0,&thIDW); // створюємо потік

thStW = 1; // вказуємо що потік попередньо запускалась

}else{

ResumeThread(hThreadW); // відновлюємо роботу потоку для запису

 

}

}

 

}

//---------------------------------------------------------------------------

DWORD WINAPI write(LPVOID IpParam){ // функція потоку для запису в порт

while(1){

 

WriteFile(hComPort, buf_out, strlen(buf_out), &bytes, NULL); // запис в порт

}

}

DWORD WINAPI read(LPVOID IpParam){ // функція потоку для читання з порту

while(1){

hComPort = CreateFileA(Form1->COM1->Text.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); // підключення до ком порта

COMMTIMEOUTS ComTimeouts={100,100,150,100,150}; // затримки запису, читання

SetCommTimeouts(hComPort, &ComTimeouts); // виконати затримки

ReadFile(hComPort, buf_in, 1, &bytes, NULL);

CloseHandle(hComPort); // читання з порту

if(bytes == 1){ // перевірка кількості прочитаних байт

 

Form1->Shape2->Brush->Color=clRed; // зміна коліру вікна читання на червоний

 

}

 

else{

Form1->Shape2->Brush->Color=clInactiveCaption; // зміна коліру вікна читання на сірий

}

}

}

void __fastcall TForm1::Button3Click(TObject *Sender) // створення кнопки розробники

{

MessageBox(NULL, "Апаратно - Дерев'яга Б.С. Програмно - Колесніченко М.А.", "Розробники", MB_OK); // виведення повідомлення

}

//---------------------------------------------------------------------------