
Перлік посилань
http://cisco.opennet.ru/docs/RUS/serial_guide/index.html#2_2 – розробка програм для RS-232;
http://www.softelectro.ru/rs232.html - опис RS232, COM портів;
http://www.denvo.ru/pub/hardware/rs-232.html - інтерфейс RS-232;
4 http://www.realcoding.net/articles/programmirovanie-com-portov.html- програ-
мування COM портів;
http://carradio.narod.ru/03.html - програмування портів вводу/виводу;
http://www.comprog.ru/Assembler/article_267.htm - програмування COM портів;
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); // виведення повідомлення
}
//---------------------------------------------------------------------------