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

Автор: Пользователь скрыл имя, 19 Февраля 2013 в 02:43, курсовая работа

Описание работы

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

Работа содержит 1 файл

курсовой.doc

— 5.61 Мб (Скачать)

   Form1->ComboBox1->Enabled = false;

   Form1->ComboBox2->Enabled = false;

 

   Form1->SpeedButton1->Caption = "Закрыть порт"; //сменить надпись на кнопке

 

   counter = 0; //сбрасываем счётчик байтов

   bPortOpen = true;

    }

 

 else

  {

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

 

   Form1->SpeedButton1->Caption = "Открыть порт"; //сменить надпись на кнопке

 

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

   Form1->ComboBox1->Enabled = true;

   Form1->ComboBox2->Enabled = false;

   bPortOpen = false;

 

  }

}

 

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

 

//кнопка "Очистить поле"

void __fastcall TForm1::Button3Click(TObject *Sender)

{

Form1->Memo2->Clear(); //очистить Memo1

}

 

//функция открытия и инициализации  порта

void COMOpen()

{

 String portname;       //имя порта (например, "COM1", "COM2" и т.д.)

 DCB dcb;                //структура для общей инициализации порта DCB

 COMMTIMEOUTS timeouts;  //структура для установки таймаутов

 

 portname = Form1->ComboBox1->Text; //получить имя выбранного порта

 

//открыть порт, для асинхронных операций обязательно нужно указать флаг FILE_FLAG_OVERLAPPED

 COMport = CreateFile(portname.c_str(),GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

 //здесь:

// - portname.c_str() - имя порта в качестве имени файла, c_str() преобразует строку типа String в строку в виде массива типа char, иначе функция не примет

// - GENERIC_READ | GENERIC_WRITE - доступ к порту на чтение/записть

// - 0 - порт не может быть общедоступным  (shared)

// - NULL - дескриптор порта не наследуется, используется дескриптор безопасности по умолчанию

// - OPEN_EXISTING - порт должен открываться как уже существующий файл

// - FILE_FLAG_OVERLAPPED - этот флаг указывает на использование асинхронных операций

// - NULL - указатель на файл шаблона не используется при работе с портами

 

 if(COMport == INVALID_HANDLE_VALUE)            //если ошибка открытия порта

  {

   Form1->SpeedButton1->Down = false;           //отжать кнопку

   return;

  }

 

//инициализация порта

 dcb.DCBlength = sizeof(DCB);  //в первое поле структуры DCB необходимо занести её длину, она будет использоваться функциями настройки порта для контроля корректности структуры

 

//считать структуру DCB из порта

 if(!GetCommState(COMport, &dcb)) //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния

  {

   COMClose();

   ShowMessage("Не удалось считать DCB");

   return;

  }

 

//инициализация структуры  DCB

 dcb.BaudRate = StrToInt(Form1->ComboBox2->Text);       //задаём скорость передачи 115200 бод

 dcb.fBinary = TRUE;                                    //включаем двоичный режим обмена

 dcb.fOutxCtsFlow = FALSE;                              //выключаем режим слежения за сигналом CTS

 dcb.fOutxDsrFlow = FALSE;                              //выключаем режим слежения за сигналом DSR

 dcb.fDtrControl = DTR_CONTROL_DISABLE;                 //отключаем использование линии DTR

 dcb.fDsrSensitivity = FALSE;                           //отключаем восприимчивость драйвера к состоянию линии DSR

 dcb.fNull = FALSE;                                     //разрешить приём нулевых байтов

 dcb.fRtsControl = RTS_CONTROL_DISABLE;                 //отключаем использование линии RTS

 dcb.fAbortOnError = FALSE;                             //отключаем остановку всех операций чтения/записи при ошибке

 dcb.ByteSize = 8;                                      //задаём 8 бит в байте

 dcb.Parity = 0;                                        //отключаем проверку чётности

 dcb.StopBits = 0;                                      //задаём один стоп-бит

 

//загрузить структуру DCB в порт

 if(!SetCommState(COMport, &dcb)) //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния

  {

   COMClose();

   ShowMessage("Не удалось установить DCB");

   return;

  }

 

//установить таймауты

 timeouts.ReadIntervalTimeout = 0;   //таймаут между двумя символами

 timeouts.ReadTotalTimeoutMultiplier = 0; //общий таймаут операции чтения

 timeouts.ReadTotalTimeoutConstant = 0;         //константа для общего таймаута операции чтения

 timeouts.WriteTotalTimeoutMultiplier = 0;      //общий таймаут операции записи

 timeouts.WriteTotalTimeoutConstant = 0;        //константа для общего таймаута операции записи

 

//записать структуру таймаутов  в порт

 if(!SetCommTimeouts(COMport, &timeouts)) //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния

  {

   COMClose();

   ShowMessage("Не удалось установить тайм-ауты");

   return;

  }

 

//установить размеры очередей  приёма и передачи

 SetupComm(COMport,2000,2000);

 

 

 PurgeComm(COMport, PURGE_RXCLEAR); //очистить принимающий буфер порта

 

 reader = CreateThread(NULL, 0, ReadThread, NULL, 0, NULL);   //создаём поток чтения, который сразу начнёт выполняться (предпоследний параметр = 0)

 writer = CreateThread(NULL, 0, WriteThread, NULL, CREATE_SUSPENDED, NULL); //создаём поток записи в остановленном состоянии (предпоследний параметр = CREATE_SUSPENDED)

 

}

 

//функция закрытия порта

void COMClose()

{

//Примечание: так как при прерывании  потоков, созданных с помощью  функций WinAPI, функцией TerminateThread

//       поток может быть прерван жёстко, в любом месте своего выполнения, то освобождать дескриптор

//       сигнального объекта-события, находящегося в структуре типа OVERLAPPED, связанной с потоком,

//       следует не внутри кода потока, а отдельно, после вызова функции TerminateThread.

//       После чего нужно освободить и сам дескриптор потока.

 

 if(writer)  //если поток записи работает, завершить его; проверка if(writer) обязательна, иначе возникают ошибки

  {TerminateThread(writer,0);

   CloseHandle(overlappedwr.hEvent); //нужно закрыть объект-событие

   CloseHandle(writer);

  }

 if(reader)     //если поток чтения работает, завершить его; проверка if(reader) обязательна, иначе возникают ошибки

  {TerminateThread(reader,0);

   CloseHandle(overlapped.hEvent); //нужно закрыть объект-событие

   CloseHandle(reader);

  }

 

CloseHandle(COMport);                  //закрыть порт

COMport=0;    //обнулить переменную для дескриптора порта

 

}

 

int nSpeed;

bool bRevers = false;

int nComPortNum = 0;

int nShipNum = 0;

 

void __fastcall TForm1::ButtonMinusClick(TObject *Sender)

{

 

bufwr[0]=0xF0;

PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта

ResumeThread(writer);

Sleep(500);

if(bufrd[0]==0xAA)

       {

       Form1->Memo2->Lines->Add("Скорость уменьшена");

       nSpeed=StrToInt(Form1->EditSpeed->Text);

        nSpeed--;

        if(nSpeed!=0)

                {

                Form1->ComboBoxShip->Enabled=false;

                }

        else Form1->ComboBoxShip->Enabled=true;

Form1->EditSpeed->Text=IntToStr(nSpeed);

       }

       else Form1->Memo2->Lines->Add("Проверьте  связь с САУ");

}

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

 

void __fastcall TForm1::ButtonPlusClick(TObject *Sender)

{

bufwr[0]=0xF;

PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта

ResumeThread(writer);

Sleep(500);

if(bufrd[0]==0xAA)

       {

       Form1->Memo2->Lines->Add("Скорость увеличена");

       nSpeed=StrToInt(Form1->EditSpeed->Text);

       nSpeed++;

        if(nSpeed!=0)

                {

                Form1->ComboBoxShip->Enabled=false;

                }

        else Form1->ComboBoxShip->Enabled=true;

        Form1->EditSpeed->Text=IntToStr(nSpeed);

       }

       else

                {

                Form1->Memo2->Lines->Add("Проверьте связь  с САУ");

                }

}

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

 

void __fastcall TForm1::ButtonResetClick(TObject *Sender)

{

nSpeed=StrToInt(Form1->EditSpeed->Text);

nSpeed=0;

Form1->ComboBoxShip->Enabled=true;

Form1->EditSpeed->Text=IntToStr(nSpeed);

bufwr[0]=0x0;

PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта

ResumeThread(writer);

Sleep(500);

if(bufrd[0]==0xAA)

       {

       Form1->Memo2->Lines->Add("Скорость сброшена на 0");

       }

       else Form1->Memo2->Lines->Add("Проверьте  связь с САУ");

}

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

 

void __fastcall TForm1::ComboBoxShipChange(TObject *Sender)

{

switch(Form1->ComboBoxShip->ItemIndex)

        {

        case -1:

                ShowMessage("Выберите ШИП!");

                break;

        case 0:

                nShipNum = 0x1;

                break;

        case 1:

                nShipNum = 0x2;

                break;

        case 2:

                nShipNum = 0x3;

                break;

        case 3:

                nShipNum = 0x4;

                break;

        case 4:

                nShipNum = 0x5;

                break;

        }

 

 memset(bufwr,0,BUFSIZE);   //очистить программный передающий буфер, чтобы данные не накладывались друг на друга

 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта

 bufwr[0]=nShipNum;

 ResumeThread(writer);               //активировать поток записи данных в порт

 Sleep(500);

if(bufrd[0]==0xAA)

       {

       switch(nShipNum)

       {

       case 0x1:

                Form1->Memo2->Lines->Add("ШИП №1 выбран");

                break;

       case 0x2:

                Form1->Memo2->Lines->Add("ШИП №2 выбран");

                break;

       case 0x3:

                Form1->Memo2->Lines->Add("ШИП №3 выбран");

                break;

       case 0x4:

                Form1->Memo2->Lines->Add("ШИП №4 выбран");

               break;

       case 0x5:

                Form1->Memo2->Lines->Add("ШИП №5 выбран");

                break;

       }

       }

       else Form1->Memo2->Lines->Add("Проверьте  связь с САУ");

}

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

 

void __fastcall TForm1::ButtonTestClick(TObject *Sender)

{

 

 memset(bufwr,0,BUFSIZE);   //очистить программный передающий буфер, чтобы данные не накладывались друг на друга

 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта

 bufwr[0] = 0x0;

 ResumeThread(writer);               //активировать поток записи данных в порт

 Sleep(500);

if(bufrd[0]==0xAA)

       {

       Form1->Memo2->Lines->Add("Связь с САУ установлена");

       }

       else Form1->Memo2->Lines->Add("Проверьте связь с САУ");

}

 

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

 

void __fastcall TForm1::ButtonStopClick(TObject *Sender)

{

 memset(bufwr,0,BUFSIZE);   //очистить программный передающий буфер, чтобы данные не накладывались друг на друга

 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта

bufwr[0] = 0x13;

 ResumeThread(writer);               //активировать поток записи данных в порт

 Sleep(500);

if(bufrd[0]==0xAA)

       {

       Form1->Memo2->Lines->Add("Работа остановлена");

       }

       else Form1->Memo2->Lines->Add("Проверьте  связь с САУ");

}

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

 

void __fastcall TForm1::CheckBoxReversClick(TObject *Sender)

{

 memset(bufwr,0,BUFSIZE);   //очистить программный передающий буфер, чтобы данные не накладывались друг на друга

 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта

 bufwr[0] = 0x28;

 ResumeThread(writer);               //активировать поток записи данных в порт

 Sleep(500);

if(bufrd[0]==0xAA)

       {

       Form1->Memo2->Lines->Add("Произведен реверс движения");

       }

       else Form1->Memo2->Lines->Add("Проверьте связь с САУ");

}

 

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

{

 if(bPortOpen == true)

{

 memset(bufwr,0,BUFSIZE);   //очистить программный передающий буфер, чтобы данные не накладывались друг на друга

 PurgeComm(COMport, PURGE_TXCLEAR);             //очистить передающий буфер порта

 bufwr[0] = 0x13;

 ResumeThread(writer);               //активировать поток записи данных в порт

 Sleep(500);

COMClose();

}

}

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

 

#include"p16f877a.inc"

 

#define BANK0   bcf  STATUS,RP0          ;выбрать Bank 0

#define BANK1   bsf  STATUS,RP0          ;выбрать bank 1

 

INT_STATUS   EQU   20h

DIGIT        EQU   21h

CCPR2L_TEMP  EQU   22h

REG_R        EQU   23h

REG1_R       EQU   24h

TIME_1       EQU   25h

 

;Разряды дешифрирования PORTC

 

RC3      EQU    03h

RC4      EQU    04h

RC5      EQU    05h

 

 

ORG 0H

GOTO BEGIN

;==================================================

 

ORG 20H

;____________________________________

INVERT

      BTFSS PORTC,2

      GOTO SET_1

      BCF PORTC,2

      RETURN

SET_1 BSF PORTC,2

      RETURN   

 

REWERS

 

 

 

   MOVF CCPR2L,W

   MOVWF CCPR2L_TEMP

   MOVF CCPR2L,W

   BTFSS STATUS,Z

   GOTO $+3

   CALL INVERT

   RETURN

 

 

CLRF REG_R

CLRF REG1_R

 

OSTANOV

 

INCFSZ REG_R

GOTO OSTANOV

   

       

INCFSZ REG1_R

GOTO   OSTANOV

 

 

   

   

    BTFSS PIR1,RCIF

    GOTO $+0Ah

    MOVF RCREG,W

    SUBLW 013h

    BTFSS STATUS,Z

    GOTO $+6

    CLRF CCPR2L  

    CLRF REG_R

    CLRF REG1_R

 

    BCF  PIR1,RCIF  

    RETURN

 

    MOVLW  .1            

    SUBWF  CCPR2L,1

    MOVF   CCPR2L,W

    BTFSS STATUS,Z

    GOTO  OSTANOV

 

;__________ЗАДЕРЖКА____________

 

movlw .255

movwf TIME_1

decfsz TIME_1

goto $-1

 

 

    BTFSS PIR1,RCIF

    GOTO $+0Ah

    MOVF RCREG,W

    SUBLW 13h

    BTFSS STATUS,Z

    GOTO $+6

    CLRF CCPR2L  

    CLRF REG_R

    CLRF REG1_R   

   

    BCF  PIR1,RCIF

    RETURN

 

 

 

CALL INVERT

 

    CLRF REG_R

    CLRF REG1_R

 

RASGON

   

    INCFSZ REG_R

    GOTO RASGON

   

       

        INCFSZ REG1_R

        GOTO RASGON

 

    BTFSS PIR1,RCIF

    GOTO $+0Ah

    MOVF RCREG,W

    SUBLW 013h

    BTFSS STATUS,Z

    GOTO $+6

    CLRF CCPR2L  

    CLRF REG_R

    CLRF REG1_R   

   

    BCF  PIR1,RCIF

    RETURN

 

   

 

    MOVLW  .1             

    ADDWF  CCPR2L,1

    MOVF   CCPR2L,W

    SUBWF CCPR2L_TEMP,0

    BTFSS STATUS,Z

    GOTO RASGON

  

 

 

 

RETURN

 

;_____________________________________

 

RESET_CHOOSE

 

  

  BCF PORTC,RC3

  BCF PORTC,RC4

  BCF PORTC,RC5

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