Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
зміст Маріна - копия - копия.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
348.81 Кб
Скачать

Перлік посилань

  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 портів;

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

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

  3. 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); // виведення повідомлення

}

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