Файл: Манипулятор с микроконтроллерным управлением.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 25.10.2023

Просмотров: 90

Скачиваний: 7

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

52 void readSerial(){ if (Serial.available() == 11) if (Serial.read() == 0xFF) if (Serial.read() == 0xAA){ data[0] = Serial.read(); data[1] = Serial.read(); data[2] = Serial.read(); data[3] = Serial.read(); data[4] = Serial.read(); data[5] = Serial.read(); data[6] = Serial.read(); data[7] = Serial.read(); data[8] = Serial.read(); data[9] = Serial.read();
}
} void dataToNormal(){
// naklonnizhnii value[0] = naklonnizhniiNormal - data[3];
//osnova value[1] = data[0] - data[1] + osnovaNormal;
//naklonverhnii value[2] = data[4] - data[5] + naklonverhniiNormal;
//povorotzahvata value[3] = data[6] - data[7] + povorotzahvataNormal;
}

53
Приложение В

Form 1
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Text;
using
System.Windows.Forms;
using
System.IO.Ports;
namespace
MouseControl
{
public
partial
class
Form1
:
Form
{
bool
IsReceving =
false
;
// Создание переменной логического типа
public
Form1
()
{
InitializeComponent
();
// Вызов метода, отвечающего за отрисовку формы
}
private
void
SendAsHex
(
string
str)
// В этом методе происходит конвертация сообщения из
типа String в Byte и последующая запись полученного сообщения в SerialPort
{
int
Len = str.Length;
byte
[] send =
new
byte
[Len /
2
];
int
j =
0
;
for
(
int
i =
0
; i < Len; i = i +
2
, j++)
send[j] =
Convert
.
ToByte
(str.
Substring
(i,
2
),
16
);
serialPort1.
Write
(send,
0
, send.Length);
}
private
string
DelSpace
(
string
str)
// В этом методе происходит очистка сообщения от пробелов.
Переменная TempStr всегда имеет четное количество символов.
{
string
TempStr =
string
.Empty;
int
Len = str.Length;
for
(
int
i =
0
; i < Len; i++)
{
if
(str[i] !=
' '
)
TempStr += str[i];
}
Len = TempStr.Length;
if
(Len %
2
!=
0
)
TempStr =
'0'
+ TempStr;
return
TempStr;
}

54
private
void
ReOpenPort
()
// Метод для переоткрытия порта SerialPort
{
try
{
btClose_Click
(null, null);
if
(!serialPort1.IsOpen)
btOpen_Click
(null, null);
}
catch
(
Exception
Err)
{
controlPanel.
Close
();
MessageBox
.
Show
(Err.Message,
"Управление манипулятором"
);
}
}
private
void
Form1_Load
(
object
sender,
EventArgs
e)
// В этом методе происходит получение
имен всех доступных Sеrial портов
{
try
{
foreach
(
string
com
in
System.IO.Ports.
SerialPort
.
GetPortNames
())
this.cmPort.Items.
Add
(com);
cmPort.SelectedIndex =
0
;
}
catch
{
controlPanel.
Close
();
MessageBox
.
Show
(
"Не найден последовательный порт!"
,
"Управление манипулятором"
);
}
}
private
void
OpenPort
()
// В этом методе происходит конфигурация и открытие порта
{
serialPort1.WriteTimeout =
1000
;
//Написать тайм-аут
Установка таймаута на запись)
serialPort1.ReadTimeout =
1000
;
//Тайм-аут чтения, там же. (Установка таймаута на чтение)
serialPort1.NewLine =
"\r\n"
; serialPort1.DataReceived +=
new
System.IO.Ports.SerialDataReceivedEventHandler(this.
sComm_DataReceived
);
serialPort1.PortName = cmPort.Text;
serialPort1.BaudRate =
int
.
Parse
(cmBaudRate.Text);
serialPort1.DataBits =
8
;
serialPort1.Parity = (
Parity
)
Enum
.
Parse
(
typeof
(
Parity
),
"None"
);
serialPort1.StopBits = (
StopBits
)
Enum
.
Parse
(
typeof
(
StopBits
),
"1"
);
serialPort1.
Open
();
}
private
void
ClosePort
()
// В этом методе происходит очистка порта с последующим его
закрытием
{
serialPort1.DataReceived -= this.
sComm_DataReceived
;
while
(IsReceving)
Application
.
DoEvents
();
//Обработка последовательного приема системных сообщений и
других событий.


55
serialPort1.
Close
();
}
public
static
Form2
controlPanel = null;
// Создание экземпляра класса Form2
private
void
btOpen_Click
(
object
sender,
EventArgs
e)
// Обработчик события нажатия на кнопку
"Запуск"
{
try
{
OpenPort
();
// Вызов метода для открытия порта
//Изменения конфигурации первой формы и создание и активация второй формы
if
(serialPort1.IsOpen)
{
btClose.Enabled =
true
;
btOpen.Enabled =
false
;
cmPort.Enabled =
false
;
cmBaudRate.Enabled =
false
;
if
(controlPanel == null)
{
controlPanel =
new
Form2
(this);
controlPanel.
Show
();
}
else
{
controlPanel.
Activate
();
}
}
}
catch
(
Exception
er)
{
ClosePort
();
MessageBox
.
Show
(
"Не удалось открыть порт!"
+ er.Message,
"Управление
манипулятором"
);
}
}
private
void
cmPort_MouseDown
(
object
sender,
MouseEventArgs
e)
// Обработка события
разворачивания списка доступных портов
{
try
{
cmPort.Items.
Clear
();
foreach
(
string
com
in
System.IO.Ports.
SerialPort
.
GetPortNames
())
this.cmPort.Items.
Add
(com);
}
catch
{
controlPanel.
Form2Closing
();
MessageBox
.
Show
(
"Не найден последовательный порт!"
,
"Управление манипулятором"
);

56
}
}
// Блок создания переменных
int
stateMachine =
0
;
int
t =
0
;
public
static
byte
rxBuf;
public
static
int
rxData;
public
static
byte
rxAdd;
byte
[] dataBuf =
new
byte
[
3
];
//Конец блока создания переменных
private
void
sComm_DataReceived
(
object
sender,
SerialDataReceivedEventArgs
e)
// (В этом
методе происходит считывание данных из Serial порта)
{
try
{
rxBuf = (
byte
)serialPort1.
ReadByte
();
if
(stateMachine ==
0
)
{
if
(rxBuf ==
0xff
) stateMachine =
1
;
else
stateMachine =
0
;
}
else
if
(stateMachine ==
1
)
{
if
(rxBuf ==
0xaa
) stateMachine =
2
;
else
stateMachine =
0
;
}
else
if
(stateMachine ==
2
)
{
dataBuf[t++] = rxBuf;
if
(t >
2
)
//получение 3 байта данных
{
rxAdd = dataBuf[
0
];
rxData = (dataBuf[
2
] + (dataBuf[
1
] <<
8
)) -
32768
;
//
controlPanel.
set_data
();
stateMachine =
0
;
t =
0
;
}
}
}
catch
(
Exception
Err)
{
controlPanel.
Form2Closing
();
MessageBox
.
Show
(Err.Message,
"Управление манипулятором"
);
}
}
public
void
sendData
(
string
input)
// В этом методе происходит подготовка сообщений для
записи их в Serial порт.
{
try
{


57
if
(!serialPort1.IsOpen)
btOpen_Click
(null, null);
string
TempStr =
string
.Empty;
TempStr = input;
TempStr =
DelSpace
(TempStr);
SendAsHex
(TempStr);
// Вызов метода SendAsHex для записи подготовленных сообщений в
Serial порт
}
catch
(
Exception
err)
{
controlPanel.
Form2Closing
();
MessageBox
.
Show
(err.Message,
"Управление манипулятором"
);
}
}
public
void
btClose_Click
(
object
sender,
EventArgs
e)
// Обработчик события нажатия на кнопку
"Close Port"
{
ClosePort
();
if
(!serialPort1.IsOpen)
{
btOpen.Enabled =
true
;
btClose.Enabled =
false
;
cmPort.Enabled =
true
;
cmBaudRate.Enabled =
true
;
}
}
private
void
exit_Click
(
object
sender,
EventArgs
e)
// Обработчик события нажатия на кнопку
"Выход"
{
btClose_Click
(null, null);
this.
Close
();
}
private
void
logo_Click
(
object
sender,
EventArgs
e)
// Обработчик события нажатия на иконку
программы на форме
{
System.Diagnostics.
Process
.
Start
(
""
);
}
private
void
button1_Click
(
object
sender,
EventArgs
e)
// Обработчик события нажатия на кнопку
"?"
{
MessageBox
.
Show
(
"Инструкция по управлению:"
+
Environment
.NewLine +
" "
+
Environment
.NewLine +
"1. "
+
"Наклон верхний: W & S"
+
Environment
.NewLine +
" "
+
Environment
.NewLine +
"2. "
+
"Наклон нижний: E & Q"
+
Environment
.NewLine +
" "
+
Environment
.NewLine +
"3. "
+
"Основа: D & A"
+
Environment
.NewLine +

58
" "
+
Environment
.NewLine +
"4. "
+
"Поворот захвата: Z & X"
+
Environment
.NewLine +
" "
+
Environment
.NewLine +
"5. "
+
"Захват: ЛКМ & ПКМ"
+
Environment
.NewLine +
""
);
}
private
void
comPort_Click
(
object
sender,
EventArgs
e)
{
}
}
}
Form 2
using
System;
using
System.Collections.Generic;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Linq;
using
System.Text;
using
System.Windows.Forms;
namespace
MouseControl
{
public
partial
class
Form2
:
Form
{
int
xCount =
0
;
// инициализировали переменную типа int и назначили ей десятичный литерал.
int
yCount =
0
;
int
zCount =
0
;
int
rCount =
0
;
int
xCount_lst =
0
;
int
yCount_lst =
0
;
int
zCount_lst =
0
;
int
rCount_lst =
0
;
int
speed =
44
;
int
center =
100
;
byte
buttonData =
0x00
;
// инициализировали переменную типа byte и назначили ей
шестнадцатеричный литерал. // H->L 4:Xbutton2(+) 3:Xbutton1(-) 2:Right 1:Middle 0:Left
byte
keyData =
0x00
;
// H->L 5:- 4:+ 3:D 2:A 1:S 0:W
byte
buttonData_lst =
0x00
;
bool
release_flag =
true
;
// проверка логических условий
int
xCountMax =
110
;
// максимальное значение переменной
int
xCountMin = -
110
;
// минимальное значение переменной
int
yCountMax =
90
;
int
yCountMin = -
10
;
int
zCountMax =
60
;
int
zCountMin = -
100
;
int
rCountMax =
110
;
int
rCountMin = -
110
;


59
1   2   3