Додаток призначений для передачі керуючих команд на МК


МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

КРЕМЕНЧУЦЬКИЙ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ

ІМЕНІ МИХАЙЛА ОСТРОГРАДСЬКОГО

 

ІНСТИТУТ  ЕЛЕКТРОМЕХАНІКИ ЕНЕРГОЗБЕРЕЖЕННЯ І СИСТЕМ УПРАВЛІННЯ

 

Кафедра СИСТЕМ АВТОМАТИЧНОГО УПРАВЛІННЯ

 

 

Пояснювальна  записка

до курсової роботи з навчальної дисципліни

«МІКРОПРОЦЕСОРНі ПРистрої»

 

Тема курсової роботи:

«РОЗРОБКА ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ ДЛЯ

Керування процесом роботи роботу ТУР-10»

 

 

 

 

 

Розробив:      студент групи СІ-08-1

Неборак Олександр Ігорович

№ залікової книжки 083121

 

Керівник проекту:     Конох І.С.

 

 

 

Кременчук 2011 

Форма № У 6.01

 

________________________________________________________________________________

(назва вищого навчального  закладу)

 

Кафедра ________________________________________________________________________

Дисципліна _____________________________________________________________________

Спеціальність ___________________________________________________________________

Курс _________ Група _____________ Семестр _______________________________________

 

ЗАВДАННЯ

на курсовий проект (роботу) студента

________________________________________________________________________________

(прізвище, ім’я, по батькові)

1. Тема проекту (роботи) __________________________________________________________

________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

2. Строк здачі студентом закінченого  проекту (роботи) ________________________________

3. Вихідні дані до проекту  (роботи) _________________________________________________

________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

4. Зміст розрахунково-пояснювальної  записки (перелік питань, що підлягають  розробці) ____

________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

5. Перелік графічного матеріалу (з точним зазначенням обов’язкових креслень) ___________

________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

6. Дата видачі завдання ___________________________________________________________

КАЛЕНДАРНИЙ ПЛАН

 

№ п/п

 

Назва етапів курсового проекту (роботи)

 

Строк виконання етапів проекту (роботи)

 

Примітки

       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       
       

 

Студент ___________________________________

(підпис)

Керівник ___________________________________ _________________________________

(підпис)      (прізвище, ім’я, по батькові)

«_____»  ______________________________ 20 ___ р.

 

РЕФЕРАТ

 

Курсова робота містить: 16 сторінок, 8 рисунків, 6 літературних джерел.

Тема курсової роботи: додаток призначений для передачі керуючих команд на МК.

Об’єкт розробки – робота з COM-портом у ОС сімейства MS Windows.

Мета роботи – Розробка алгоритму та програми

 

 

 

 

 

 

 

 

 

 

 

COM-ПОРТ, ДОДАТОК, ПРОГРАМНЕ ЗАБЕЗПЕЧЕННЯ, КЕРУЮЧІ СИГНАЛИ, МІКРОКОНТРОЛЛЕР, ТУР-10.

 

 

 

ПЕРЕЛІК СКОРОЧЕНЬ

 

ОС – операційна система.

ПЗ – програмне забезпечення.

МК – мікроконтроллер.

 

ЗМІСТ

 

 

 

Вступ

 

 

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

 

  1. Аналіз технічного завдання

Мета роботи і задачі дослідження. Розробка алгоритму та програми керування процесом роботи роботу ТУР-10.

 

Для досягнення поставленої мети необхідно вирішити наступні задачі:

  • розробити конструкцію нестійкого двоколісного транспортного засобу;
  • розробити алгоритм керування;
  • розробити програмне забезпечення.

Об'єкт дослідження є нестійкий двоколісний транспортний засіб на базі Mindstorm LegoNXT .

Предмет дослідження являється система керування транспортним засобом з ПІД-регулятором. В якості якого виступає датчик світла.

При вирішенні поставлених задач  використовувались загальні методи теорії автоматичного керування  та програмування.

Розроблена модель нестійкого двоколісного транспортного засобу. Для забезпечення стійкого положення рівноваги була розроблена програма керування з  ПІД-регулятором.

У роботі показана можливість розробки систем керування транспортними  засобами з використанням регуляторів.

  1. Схемотехнічне завдання
    1. Огляд продукції LEGO NINDSTORMS як елементної бази для створення зразків транспортних засобів 

NXT є «мозком» робота MINDSTORMS®. Це інтелектуальний, керований комп'ютером елемент конструктора LEGO®, що дозволяє роботу MINDSTORMS ожити і здійснювати різні дії.

Структура NXT:

  • NXT оснащений трьома портами виходу для підключення моторів. Щоб мотор працював, він повинен бути підключений до одного з портів A, В або C
  • NXT Оснащений чотирма портами входу для підключення сенсорів. Сенсори необхідно підключати до портів 1, 2, 3 або 4.
  • Є можливість підключитт кабель USB до порту USB та завантажувати програми c комп'ютера на NXT (або передавати дані від робота на комп'ютер). Для завантаження та обміну даними можна також використовувати 6еспроводний канал Bluetooth.
  • Створіть програму з реальними звуками, при запуску програми звуки будуть відтворюватися. Кнопки NXT Помаранчева кнопка: Вкл. / Введення Світло-сірі стрілки: використовуються для переміщення вліво-вправо по меню NXT. Темно-сіра кнопка: Видалити / повернутися.
  • Помаранчева кнопка: Вкл. / Введення Світло-сірі стрілки: використовуються для переміщення вліво-вправо по меню NXT. Темно-сіра кнопка: Видалити / повернутися.

 

Технічні параметри:

  • 32-бітовий мікроконтроллер ARM7 256 Кбайт FLASH, 64 КБ RAM 8 - бітовий мікроконтроллер AVR 4 Кбайта FLASH, 512 байт RAM Бездротовий канал Bluetooth (пристрій відповідає вимогам Bluetooth Class IIV 2.0)
  • Швидкісний порт USB (12 Мбіт / с)
  • порта входу, 6-дротовий кабель для цифрової платформи (Один з портів включає порт розширення, відповідний вимогам I ЄС 61158 Туре 4/EN 50170 для використання в майбутньому)
  • порти виходу, 6-дротовий кабель для цифрової платформи
  • Графічний ЖК-дисплей 100 х 64 пікселів
  • Гучномовець - якість аудіо 8 кГц. Аудіоканал c 8-бітовим квантуванням і частотою семплірованія 2-16 КГц. Джерело живлення: 6 батарей типу АА
    1. Вибір датчика для системи керування

Сенсор освітленості (або колірної сенсор) з набору Lego Mindstorms NXT (Що зображений на рис. 2.1), один з найбільш використовуваних сенсорів при конструюванні та програмуванні Lego-роботів.

Рисунок 2.1 – Датчик освітлення

 

По внутрішньому устрою, він не такий складний як сенсор відстані. Основним елементом у ньому є  світлочутливий елемент (фоторезистор або фототранзистор рис. 2.2).

Рисунок 2.2 – Будова  датчика

У режимі вимірювання навколишнього  освітлення, кількість світла, що потрапило  на світлочутливий елемент, перетворюється в цифрове значення, яке вже  використовується в програмі. Наприклад, з датчиком, що працює в цьому режимі, можна зібрати робота, який шукає саме освітлене місце у кімнаті як на рис.1.3.

Рисунок 2.3 – Принцип дії датчика

У режимі вимірювання відбитого  кольору, крім світлочутливого елемента, активується світовипромінюючий елемент (світлодіод). Світло, випущене цим елементом, відбивається від якої-небудь поверхні і потрапляє назад у світлочутливий елемент.

Залежно від того наскільки світла відбиває поверхня, в світлочутливий елемент приходить більше світла. Ця кількість світла перетворюється в цифрове значення і передається в програму. Чим темніше поверхню, тим менше світла приходить - в програму приходять маленькі значення; чим світліше поверхню, тим більше світла приходить - програма оперує з великими значеннями.

Датчик світлочутливості являється  ПІД-регулятором. Пропорційно-інтегрально-диференціальний (ПІД) регулятор - це пристрій у колі зворотного зв'язку, що використовується в системах автоматичного управління для формування керуючого сигналу. ПІД-регулятор формує керуючий сигнал, який є сумою трьох доданків, перше з яких пропорційно вхідного сигналу, друге - інтеграл вхідного сигналу, третє - похідна вхідного сигналу.

Якщо якісь із складових не використовуються, то регулятор називають пропорційно-інтегральним, пропорційно-диференціальним, пропорційним і т. п.

Призначення ПІД-регулятора - в підтримці  заданого значення x0 деякої величини x за допомогою зміни іншої величини u. Значення x0 називається установкою, а різниця e = (x0 - x) - нев'язкої або неузгодженістю.

Вихідний сигнал регулятора u визначається трьома складовими:

,

де Кp, Кi, Кd - коефіцієнти посилення  пропорційної, інтегральної і диференціальної складових регулятора, відповідно.

Пропорційна складова, відповідає за позиціонування системи у заданому стані. У певних випадках може викликати пере регулювання з послідуючими автоколиваннями. Тобто ПІД-регулятор може «перестаратися» і робота буде заносити із сторони у сторону.

Інтегральна складова накопичує від’ємний  досвід (сумує помилки) і викликає компенсуючи дію. При найменших відхиленнях пропорційна складова «ослабіває» і інтегральна, за рахунок свого швидкого збільшення сумуванням, допомагає «дотягнути» установлену величину до встановленої.

Диференційна складова слідкує за швидкістю зміни стану системи і протидіє можливому пере регулюванню. В деяких випадках Д-складова має протилежний знак навідмінно пропорційної, а в деяких співпадає.

    1. Розробка конструкції транспортного засобу

На рис. 2.4 зображено структурну схему транспортного засобу на базі Lego NXT.

Рисунок 2.4 – Структурна схема

Наша программа в LabView, компілюється і передається на пристрій по каналу Bluetooth або за допомогою USB.

Lego Mindstorm має два мікроконтролери ARM7 і Atmega48, що взаємодіють між собою за допомогою інтерфейсу I2C.

Рисунок 2.5 – Внутрішня будова Lego NXT

Дисплей  з’єднаний з ARM7 SPI-шиною. А Bluetooth шиною UART. До цього ж мікроконтроллера приєднаний динамік. Клавіші приєднані  до Atmega48. До обох контролерів під’єднанні порти вводу/виводу.

На рисунку 1.6 зображений зовнішній вигляд транспортного засобу segway. Ця конструкція вибрана не випадково, адже від неї залежить на скільки стійкий буде наш транспортний засіб. Саме тому головний блок був закріплений як найнижче так як являється центром маси. До головного блоку Lego NXT ми додали мотори з колесами з кожного боку. З верху був закріплений «водій» на серводвигуні. Датчик освітленості був закріплений максимально близько до землі, перпендикулярно головному блоку.

Серводвигун що підключений до порту  А знаходиться в рухомому стані, для того щоб можна було скоригувати  центр маси робота. Після запуску програми він фіксується.

Рисунок 2.6 – Транспортний засіб segway

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

  1. Програмна частина
    1. Алгоритм керування транспортним засобом

Рисунок 3.1 – Алгоритм керування

Спочатку ми фіксуємо мотор, що підключений  до порту А. Далі через одну секунду  вмикається датчик світла. Наступний  крок – цикл, умовою виходу з якого є нерівність 100<x<-100, де x – керуючий сигнал. Якщо умова не виконується  програма завершує свою роботу. Якщо ж керуючий сигнал задовольняє умові, отримуємо початкове значення датчику світла. Після цього подаємо звуковий сигнал, що підтверджує початок роботи програми. Далі отримуємо поточне значення датчику і вираховуємо різницю між початковим і поточним. Задаємо коефіцієнти і формуємо керуючий сигнал. Наступне що робить програма, перевіряє результат порівняння поточного і початкового значень. Якщо вони рівні, ми переходимо на цикл, що відповідає за рух сігвея вздовж чорної лінії. Якщо початкове значення більше за поточне, подаємо керуючий сигнал на мотори С і В, інакше ми подаємо реверсний сигнал. Після чого переходимо до циклу що відповідає за рух вздовж чорної лінії. Умовою якого є реакція датчику дотику. Доки він не спрацював ми повторюємо формувати керуючий сигнал і подавати його на двигуни, інакше знову переходимо на цикл, що відповідає за рівновагу.

    1. Вибір програмного забезпечення для написання програми

Програмне забезпечення LEGO® MINDSTORMS® NXT дозволяє програмувати ваших NXT роботів і завантажувати програми NXT через USB або Bluetooth з'єднання. Інтуїтивне Mac і PC сумісне програмне забезпечення ,на базі National Instruments LabVIEW, постачається  з інструкціями зборки та керівництв з програмування. Тому почати програмування з MINDSTORMS NXT досить легко.

Програма RoboLab фірми LEGO Dacta A / S дозволяємо зсередини вивчити робототехніку на основі NXT навчиться конструювати розумні керовані машини.

Програма RoboLab заснована  на більш потужною програмою LabView - це потужна середовище програмування, що використовується інженерами і вченими в дослідницьких інститутах і промисловості.

У 1997 році, коли NASA розсекретила свою програму SOJOURNER ROVER'S, з'ясувалося, що для забезпечення орієнтації, приземлення  і функціонування космічних апаратів застосовувалася програма LabVIEW National Instruments (Техас, США).

 

Програму розробили  три гіганти:

Tufts University College of Engineering

LEGO Group

National Instruments LabVIEW

RoboLab - це спрощена модель  для програмування ЛЕГО-комп'ютера RCX яке буде зрозуміло і дітям.

Він чимось нагадує Бейсік, Фортран або Сі, але головна  відмінність RoboLab в тому, що він базується  на графіку замість текстових  рядків. Це означає, що LabVIEW заснований на логічному узгодженні уявлень  і абсолютно не залежить від писемної мови.

У RoboLab ви зможете схематично будувати схеми і проводити розрахунки, після чого тестувати їх і переносити схему в програму NXT-G.

LabVIEW (англ. Laboratory Virtual Instrumentation Engineering Workbench) - це середовище розробки  і платформа для виконання програм, створених на графічній мові програмування «G» фірми National Instruments (США). Перша версія LabVIEW була випущена в 1986 році для Apple Macintosh, в даний час існують версії для UNIX, Linux, Mac OS і пр., а найбільш розвиненими і популярними є версії для Microsoft Windows.

LabVIEW використовується в системах збору й обробки даних, а також для управління технічними об'єктами і технологічними процесами. Ідеологічно LabVIEW дуже близька до SCADA-системам, але на відміну від них більшою мірою орієнтована на вирішення завдань не стільки в області АСУ ТП, скільки в області АСНІ.

    1. Реалізація програми керування

На рис. 3.2 зображена програма керування яка була розроблена у середовищі LabView. Окрім якого нам довелося використати плагін LabVIEW Toolkit.

 

Рисунок 3.2 – Программа керування

 

LEGO® MINDSTORMS® NXT Software 1.0 використовує графічний мову програмування NXT-G, це мова програмування на основі National Instruments LabVIEW 7.1. На високому рівні програмування блоків в NXT-G блок-схеми побудовані з більш низького рівня блок діаграми LabVIEW.

У кінцевому  рахунку, NXT-G блоки це просто особливий  вид VI, розроблені для використання з MINDSTORMS.

Використання LabVIEW Toolkit для Lego Mindstorms NXT з LabVIEW дозволяє обхід  високого рівня обмежень, що накладаються NXT-G. Це інструмент дозволяє створювати передові  програм з використанням ВП і завантажити їх на NXT. Крім того, LabVIEW надає більш розширені можливості редагування навколишнього середовища, ніж Lego Mindstorms NXT Software 1.0.

Для завантаження нашої програми потрібно ввімкнути  мікрокомп’ютер NXT і відкрити нашу програму в середовищі LabView. Підключимо NXT через USB-порт або ввімкнемо Bluetooth.

Далі потрібно відкрити NXT Terminal, що знаходиться в Tools->NXT Tools->NXT Terminal.

Рисунок 3.3 – NXT Terminal

У з’явившомуся вікні потрібно вибрати  Find NXT. Для того щоб знайти і підключити ваш NXT. Потрібно враховувати що при підключенні по Bluetooth пошук може зайняти досить тривалий період часу. Після того як всі пристрої будуть знайдені, потрібно виділити необхідний і натиснути Connect.

В NXT Terminal буде відображено інформацію про підключений мікрокомп’ютер. Після чого можна запускати програму в режимі відладки, або за допомогою команди File->Target to NXT ви зможете компілювати і завантажувати програми безпосередньо на NXT.

Рисунок 3.4 – Find NXT

Під час розробки даної  програми ми використали деякі не стандартні для LabView блоки з тулкіту NXT:


- Це блок двигуна. У випадаючому списку якого можна призначити дію. У даному випадку це повна зупинка. Також до цього блоку потрібно підвести порт до якого підключений двигун. На малюнку він зазначений синьою лінією.

- Це датчик світла. До нього  потрібно підвести порт (клема  зверху), а також можна отримати  значення(нижня клема справа).

-Цей блок відображає затримку. Інтервал якої можна задати  числовим значенням під’єднаним  до нижньої клеми зліва.

-Блок звукового супроводження.  У випадаючому списку можна  хадати характер звуку. А числом  можна задати його тривалість  під’єднавши до клеми знизу зліва.

Висновки

 

В результаті роботи над  даним проектом, ми розробили алгоритм і програму для управління нестійкою транспортною системою Segway. В процесі розробки був використаний датчик світла для стабілізації об’єкту керування. Це є досить не типово на відміну від гіроскопа, але значно дешевше та простіше. Завдяки досягненням у галузях обробки інформації, машинного зору, теорії керування та цифрової обробки сигналів як на апаратному, так і на програмному рівнях ми змогли розробити систему яка може аналізувати та реагувати на динамічні зміни дорожніх умов. Розробка систем керування автономними транспортними засобами є актуальною задачею тому що забезпечує значно більшу безпеку та зручність ніж ручне керування.

 

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

 

  1. Белиовская Л.Г. Программируем микрокомпьютер NXT в LabView. − М.: ДМК Пресс, 2010.  − 280 с.: ил.
  2. Бардов В.М, "Интеллектуальные системы управления и обработки данных.
  3. Тревис Д. LabView для всех. – 2011
  4. Жуков К. Модельное проектирование встраиваемых систем в LabVIEW
  5. Суранов А.Я. LabView Справочник по функциям. – 2011
  6. Mindstorms.su – http://mindstorms.su/index.html.
  7. Mindstorms – http://mindstorms.lego.com/eng/default.aspx.
  8. Wikipedia The Free Encyclopedia – http://ru.wikipedia.org/
  9. Образовательные инициативы –  http://edu.holit.ua

Додаток А

Лістинг вихідного коду програми

Unit1.h

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

 

#ifndef Unit1H

#define Unit1H

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

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Buttons.hpp>

#include <ComCtrls.hpp>

#include <Dialogs.hpp>

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

class TForm1 : public TForm

{

__published: // IDE-managed Components

        TGroupBox *GroupBox1;

        TLabel *Label1;

        TComboBox *ComboBox1;

        TLabel *Label2;

        TComboBox *ComboBox2;

        TSpeedButton *SpeedButton1;

TButton *Button3;

        TButton *ButtonTest;

        TButton *ButtonStop;

        TEdit *EditSpeed;

        TButton *ButtonMinus;

        TButton *ButtonPlus;

        TButton *ButtonReset;

        TComboBox *ComboBoxShip;

        TCheckBox *CheckBoxRevers;

        TMemo *Memo2;

        void __fastcall SpeedButton1Click(TObject *Sender);

 

void __fastcall Button3Click(TObject *Sender);

        void __fastcall ButtonMinusClick(TObject *Sender);

        void __fastcall ButtonPlusClick(TObject *Sender);

        void __fastcall ButtonResetClick(TObject *Sender);

        void __fastcall ComboBoxShipChange(TObject *Sender);

        void __fastcall ButtonTestClick(TObject *Sender);

        void __fastcall ButtonStopClick(TObject *Sender);

        void __fastcall CheckBoxReversClick(TObject *Sender);

        void __fastcall FormClose(TObject *Sender, TCloseAction &Action);

 

private: // User declarations

public:  // User declarations

        __fastcall TForm1(TComponent* Owner);

};

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

extern PACKAGE TForm1 *Form1;

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

#endif

 

Unit1.cpp

 

#include <vcl.h>

#pragma hdrstop

 

#include "Unit1.h"

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

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

 

#define BUFSIZE 255     //ёмкость буфера

 

unsigned char bufrd[BUFSIZE], bufwr[BUFSIZE]; //приёмный и передающий буферы

 

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

 

HANDLE COMport;  //дескриптор порта

 

//структура OVERLAPPED необходима для асинхронных операций, при этом для операции чтения и записи нужно объявить разные структуры

//эти структуры необходимо объявить  глобально, иначе программа не  будет работать правильно

OVERLAPPED overlapped;  //будем использовать для операций чтения (см. поток ReadThread)

OVERLAPPED overlappedwr;        //будем использовать для операций записи (см. поток WriteThread)

 

 

bool fl=0; //флаг, указывающий на успешность операций записи (1 - успешно, 0 - не успешно)

bool bPortOpen = false;

unsigned long counter; //счётчик принятых байтов, обнуляется при каждом открытии порта

 

void COMOpen(void);             //открыть порт

void COMClose(void);            //закрыть порт

 

 

HANDLE reader; //дескриптор потока чтения из порта

HANDLE writer; //дескриптор потока записи в порт

 

DWORD WINAPI ReadThread(LPVOID);

DWORD WINAPI WriteThread(LPVOID);

 

void ReadPrinting(void);

 

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

 

//главная функция потока, реализует  приём байтов из COM-порта

DWORD WINAPI ReadThread(LPVOID)

{

 COMSTAT comstat;  //структура текущего состояния порта, в данной программе используется для определения количества принятых в порт байтов

 DWORD btr, temp, mask, signal; //переменная temp используется в качестве заглушки

 

 overlapped.hEvent = CreateEvent(NULL, true, true, NULL); //создать сигнальный объект-событие для асинхронных операций

 SetCommMask(COMport, EV_RXCHAR);                            //установить маску на срабатывание по событию приёма байта в порт

 while(1)      //пока поток не будет прерван, выполняем цикл

  {

   WaitCommEvent(COMport, &mask, &overlapped);                //ожидать события приёма байта (это и есть перекрываемая операция)

   signal = WaitForSingleObject(overlapped.hEvent, INFINITE); //приостановить поток до прихода байта

   if(signal == WAIT_OBJECT_0)            //если событие прихода байта произошло

    {

     if(GetOverlappedResult(COMport, &overlapped, &temp, true)) //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent

      if((mask & EV_RXCHAR)!=0)     //если произошло именно событие прихода байта

       {

        ClearCommError(COMport, &temp, &comstat);  //нужно заполнить структуру COMSTAT

        btr = comstat.cbInQue;                           //и получить из неё количество принятых байтов

        if(btr)                            //если действительно есть байты для чтения

        {

         ReadFile(COMport, bufrd, btr, &temp, &overlapped);     //прочитать байты из порта в буфер программы

         counter+=btr;                                          //увеличиваем счётчик байтов

         ReadPrinting();                        //вызываем функцию для вывода данных на экран и в файл

        }

       }

    }

  }

}

 

void ReadPrinting()

{

   memset(bufrd, 0, BUFSIZE);         //очистить буфер (чтобы данные не накладывались друг на друга)

}

 

DWORD WINAPI WriteThread(LPVOID)

{

DWORD temp, signal; //temp - переменная-заглушка

 

overlappedwr.hEvent = CreateEvent(NULL, true, true, NULL);      //создать событие

while(1)

  {WriteFile(COMport, bufwr, 1, &temp, &overlappedwr);  //записать байты в порт (перекрываемая  операция!)

   signal = WaitForSingleObject(overlappedwr.hEvent, INFINITE);   //приостановить поток, пока не завершится перекрываемая операция WriteFile

 

   SuspendThread(writer);

  

  }

}

 

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)

{

}

 

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

 

//обработчик нажатия на кнопку "Открыть порт"

void __fastcall TForm1::SpeedButton1Click(TObject *Sender)

{

if(SpeedButton1->Down)

  {

   COMOpen();                   //если кнопка нажата - открыть  порт

 

   //показать/спрятать элементы на форме

Додаток призначений для передачі керуючих команд на МК