Программный протокол управления потоком 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);
}