Автор: Пользователь скрыл имя, 19 Февраля 2013 в 02:43, курсовая работа
Значні досягнення у галузях обробки інформації, машинного зору, теорії керування та цифрової обробки сигналів як на апаратному, так і на програмному рівнях дають можливість представлення, аналізу та розуміння динамічно змінюваних дорожніх умов, а також реагування на ці умови автономних транспортних засобів. Розробка систем керування автономними транспортними засобами є актуальною задачею тому що забезпечує значно більшу безпеку та зручність ніж ручне керування..
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(); //
}
//функция открытия и
void COMOpen()
{
String portname; //имя порта (например, "COM1", "COM2" и т.д.)
DCB dcb; //структура для общей инициализации порта DCB
COMMTIMEOUTS timeouts; //структура для установки таймаутов
portname = Form1->ComboBox1->Text; //
//открыть порт, для асинхронных операций обязательно нужно указать флаг FILE_FLAG_OVERLAPPED
COMport = CreateFile(portname.c_str(),
//здесь:
// - portname.c_str() - имя порта в качестве имени файла, c_str() преобразует строку типа String в строку в виде массива типа char, иначе функция не примет
// - GENERIC_READ | GENERIC_WRITE - доступ к порту на чтение/записть
// - 0 - порт не может быть
// - 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->
dcb.fBinary = TRUE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = FALSE;
dcb.fNull = FALSE; //разрешить приём нулевых байтов
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = FALSE;
dcb.ByteSize = 8;
dcb.Parity = 0;
dcb.StopBits = 0;
//загрузить структуру DCB в порт
if(!SetCommState(COMport, &dcb)) //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
{
COMClose();
ShowMessage("Не удалось установить DCB");
return;
}
//установить таймауты
timeouts.ReadIntervalTimeout = 0; //таймаут между двумя символами
timeouts.
timeouts.
timeouts.
timeouts.
//записать структуру
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.
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(
{
bufwr[0]=0xF0;
PurgeComm(COMport, PURGE_TXCLEAR);
//очистить передающий буфер
ResumeThread(writer);
Sleep(500);
if(bufrd[0]==0xAA)
{
Form1->Memo2->Lines->Add("
nSpeed=StrToInt(Form1->
nSpeed--;
if(nSpeed!=0)
{
Form1->ComboBoxShip->Enabled=
}
else Form1->ComboBoxShip->Enabled=
Form1->EditSpeed->Text=
}
else Form1->Memo2->Lines->Add("
}
//----------------------------
void __fastcall TForm1::ButtonPlusClick(
{
bufwr[0]=0xF;
PurgeComm(COMport, PURGE_TXCLEAR);
//очистить передающий буфер
ResumeThread(writer);
Sleep(500);
if(bufrd[0]==0xAA)
{
Form1->Memo2->Lines->Add("
nSpeed=StrToInt(Form1->
nSpeed++;
if(nSpeed!=0)
{
Form1->ComboBoxShip->Enabled=
}
else Form1->ComboBoxShip->Enabled=
Form1->EditSpeed->Text=
}
else
{
Form1->Memo2->Lines->Add("
}
}
//----------------------------
void __fastcall TForm1::ButtonResetClick(
{
nSpeed=StrToInt(Form1->EditSpe
nSpeed=0;
Form1->ComboBoxShip->Enabled=
Form1->EditSpeed->Text=
bufwr[0]=0x0;
PurgeComm(COMport, PURGE_TXCLEAR);
//очистить передающий буфер
ResumeThread(writer);
Sleep(500);
if(bufrd[0]==0xAA)
{
Form1->Memo2->Lines->Add("
}
else Form1->Memo2->Lines->Add("
}
//----------------------------
void __fastcall TForm1::ComboBoxShipChange(
{
switch(Form1->ComboBoxShip->
{
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("ШИП
break;
case 0x2:
Form1->Memo2->Lines->Add("ШИП №2 выбран");
break;
case 0x3:
Form1->Memo2->Lines->Add("ШИП
break;
case 0x4:
Form1->Memo2->Lines->Add("ШИП
break;
case 0x5:
Form1->Memo2->Lines->Add("ШИП
break;
}
}
else Form1->Memo2->Lines->Add("
}
//----------------------------
void __fastcall TForm1::ButtonTestClick(
{
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(
{
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(
{
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
Информация о работе Додаток призначений для передачі керуючих команд на МК