Передача команд через последовательный порт

Программный протокол управления потоком XON/XOFF(Handshaking =1). Работает протокол следующим образом: если устройство, принимающее данные, обнаруживает причины, по которым оно не может их дальше принимать, оно по обратному последовательному каналу посылает байт-символ XOFF (13hex). Противоположное устройство, приняв этот символ, приостанавливает передачу. Когда принимающее устройство снова становится готовым к приему данных, оно посылает символ XON (11hex), приняв который противоположное устройство возобновляет передачу. [10-13]

Для считывания данных из последовательного порта был разработан специальный код:

Код функции считывания команды из последовательного порта:

void serialEvent() {

while (Serial.available()) { //повторять пока в буфере есть данные

char inChar = (char)Serial.read(); //считывание символа из буфера порта

inputString += inChar; //добавление символа к строке команды

if (inChar == '\n') { //если встречен завершающий символ

stringComplete = true; //поднять флаг получения команды

}

}

Обработка получаемых команд.

Команда получается в виде строки в которой указывается мотор, направление вращения мотора и мощность подаваемая на мотор.

if (stringComplete) { // Флаг получения команды

int spaceIndex1 = inputString.indexOf(' ');

int spaceIndex2 = inputString.indexOf(' ', spaceIndex1 + 1);

String command = inputString.substring(0, spaceIndex1);

String motorNo = inputString.substring(spaceIndex1 + 1, spaceIndex2);

String motorPower = inputString.substring(spaceIndex2);

int mNo = motorNo.toInt();

int mPower = motorPower.toInt();

Motor(mNo, mPower);

// clear the string:

inputString = "";

stringComplete = false;

}

Подача на моторы мощности.

После обработки команды микроконтроллером, на двигатели робота поступает команда вращать вал мотора.

void Motor(int mNo, int mPower) {

int M = 0;

int E = 0;

if (mNo == 1) {

M = M1; E = E1;

} else if (mNo == 2) {

M = M2; E = E2;

} else if (mNo == 3) {

M = M3; E = E3;

}

if (mPower > 0) {

digitalWrite(M, HIGH);

} else {

digitalWrite(M, LOW)

}

mPower = abs(mPower);

analogWrite(E, mPower);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: