Arduino:Библиотеки/SerialControl/serialControl

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Прошивка SerialControl[1]

В данном скетче описана сама прошивка SerialControl, позволяющая удаленно управлять платами Arduino через последовательный интерфейс.

Код

/*********************************************************************

Этот файл – часть прошивки SerialControl.

SerialControl – это бесплатное ПО, вы можете распространять его и/или 
модифицировать согласно условиям Универсальной общественной лицензии 
GNU, изданной Фондом свободного ПО, а также либо 2-ой версии, либо 
последней версии этой лицензии (на ваш выбор).

SerialControl распространяется бесплатно в надежде на то, что окажется 
полезной, но БЕЗО ВСЯКОЙ ГАРАНТИИ; включая даже обязательную гарантию 
на КОММЕРЧЕСКОЕ КАЧЕСТВО и ПРИГОДНОСТЬ КОНКРЕТНОЙ ЦЕЛИ. Более подробно 
читайте в Универсальной общественной лицензии GNU.

Вы должны получить копию Универсальной общественной лицензии GNU 
вместе с Foobar. Если не получили, ее можно найти на 
http://www.gnu.org/licenses/.

*********************************************************************/

//#include <WString.h>

template<class T> inline Print &operator << (Print &obj, T arg) { obj.print(arg); return obj; }

#define maxLength 16

/* 

Структура команды:

позиция:  01 23 4567 8901 23456
          id cm arg1 arg2

Здесь: 

* id – идентификатор платы,
* cm – команда,
* arg1 – 1-ый аргумент,
* arg2 – 2-ой аргумент.

*/

// Смещение для составных частей команды:
#define ID  0
#define CMD 2
#define AR1 4
#define AR2 8

int ownID = 0; // это значение нужно поменять в соответствии с ID 
               // вашей платы Arduino
boolean answer = true;

String command = String(maxLength);
boolean commandComplete = false;
int recID;

void setup() {
  Serial.begin(9600);
  recID = 0;
  command = "00alOUTP";
  allFunc();
  command = "00al LOW";
  allFunc();
  command = "";
}

void loop () {
  if(Serial.available() > 0) {
    getIncomingChars();
  }

  if (commandComplete == true) {
    processCommand();
  }

}

void getIncomingChars() {
  char inChar = Serial.read();
  if(inChar == 59 || inChar == 10 || inChar == 13){
    commandComplete = true;
  } else {
    command += inChar;
  }
}

void processCommand(){
  if(commandCorrect() && (recID == ownID)){
    if(command.charAt(2) == 'p' && command.charAt(3) == 'm'){ // pin mode
      pinModeFunc();
    }

    if(command.charAt(2) == 'd' && command.charAt(3) == 'w'){ // digital write
      digitalWriteFunc();
    }

    if(command.charAt(2) == 'a' && command.charAt(3) == 'w'){ // analog write
      analogWriteFunc();
    }

    if(command.charAt(2) == 'a' && command.charAt(3) == 'l'){ // all
      allFunc();
    }

  }
  
  command = "";
  recID = 0;
  commandComplete = false;
}

boolean commandCorrect(){
  boolean ret = false;
  if(command.charAt(0) == '0' || command.charAt(0) == '1'){
    if(isNumeric(command.charAt(1))){
      recID = command.charAt(1) - 48;
      if(command.charAt(0) == '1'){ recID = recID + 10; }
      ret = true;
    }
  }
  return ret;
}

int parseArgument(int argOffset){
  int ret = 0;
  String arg = command.substring(argOffset, argOffset + 4);
  if(isNumeric(arg.charAt(3))){
    ret = arg.charAt(3) - 48;
    if(isNumeric(arg.charAt(2))){
      ret = ret + (10 * (arg.charAt(2) - 48));
      if(isNumeric(arg.charAt(1))){
        ret = ret + (100 * (arg.charAt(1) - 48));
        if(arg.charAt(0) == '-'){
          ret = -ret;
        } else {
          if(isNumeric(arg.charAt(0))){
            ret = ret + (1000 * (arg.charAt(0) - 48));
          }
        }
      }
    }
  }
  return ret;
}

boolean isNumeric(char character){
  boolean ret = false;
  if(character >= 48 && character <= 75){
    ret = true;
  }
  return ret;
}

String getArgument(int argOffset){
  return command.substring(argOffset, argOffset + 4);
}

См.также

Внешние ссылки