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

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

{{#setlogo:ArduinoCommunityLogo.png}}

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


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

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

Код

  1 /*********************************************************************
  2 
  3 Этот файл – часть прошивки SerialControl.
  4 
  5 SerialControl – это бесплатное ПО, вы можете распространять его и/или 
  6 модифицировать согласно условиям Универсальной общественной лицензии 
  7 GNU, изданной Фондом свободного ПО, а также либо 2-ой версии, либо 
  8 последней версии этой лицензии (на ваш выбор).
  9 
 10 SerialControl распространяется бесплатно в надежде на то, что окажется 
 11 полезной, но БЕЗО ВСЯКОЙ ГАРАНТИИ; включая даже обязательную гарантию 
 12 на КОММЕРЧЕСКОЕ КАЧЕСТВО и ПРИГОДНОСТЬ КОНКРЕТНОЙ ЦЕЛИ. Более подробно 
 13 читайте в Универсальной общественной лицензии GNU.
 14 
 15 Вы должны получить копию Универсальной общественной лицензии GNU 
 16 вместе с Foobar. Если не получили, ее можно найти на 
 17 http://www.gnu.org/licenses/.
 18 
 19 *********************************************************************/
 20 
 21 //#include <WString.h>
 22 
 23 template<class T> inline Print &operator << (Print &obj, T arg) { obj.print(arg); return obj; }
 24 
 25 #define maxLength 16
 26 
 27 /* 
 28 
 29 Структура команды:
 30 
 31 позиция:  01 23 4567 8901 23456
 32           id cm arg1 arg2
 33 
 34 Здесь: 
 35 
 36 * id – идентификатор платы,
 37 * cm – команда,
 38 * arg1 – 1-ый аргумент,
 39 * arg2 – 2-ой аргумент.
 40 
 41 */
 42 
 43 // Смещение для составных частей команды:
 44 #define ID  0
 45 #define CMD 2
 46 #define AR1 4
 47 #define AR2 8
 48 
 49 int ownID = 0; // это значение нужно поменять в соответствии с ID 
 50                // вашей платы Arduino
 51 boolean answer = true;
 52 
 53 String command = String(maxLength);
 54 boolean commandComplete = false;
 55 int recID;
 56 
 57 void setup() {
 58   Serial.begin(9600);
 59   recID = 0;
 60   command = "00alOUTP";
 61   allFunc();
 62   command = "00al LOW";
 63   allFunc();
 64   command = "";
 65 }
 66 
 67 void loop () {
 68   if(Serial.available() > 0) {
 69     getIncomingChars();
 70   }
 71 
 72   if (commandComplete == true) {
 73     processCommand();
 74   }
 75 
 76 }
 77 
 78 void getIncomingChars() {
 79   char inChar = Serial.read();
 80   if(inChar == 59 || inChar == 10 || inChar == 13){
 81     commandComplete = true;
 82   } else {
 83     command += inChar;
 84   }
 85 }
 86 
 87 void processCommand(){
 88   if(commandCorrect() && (recID == ownID)){
 89     if(command.charAt(2) == 'p' && command.charAt(3) == 'm'){ // pin mode
 90       pinModeFunc();
 91     }
 92 
 93     if(command.charAt(2) == 'd' && command.charAt(3) == 'w'){ // digital write
 94       digitalWriteFunc();
 95     }
 96 
 97     if(command.charAt(2) == 'a' && command.charAt(3) == 'w'){ // analog write
 98       analogWriteFunc();
 99     }
100 
101     if(command.charAt(2) == 'a' && command.charAt(3) == 'l'){ // all
102       allFunc();
103     }
104 
105   }
106   
107   command = "";
108   recID = 0;
109   commandComplete = false;
110 }
111 
112 boolean commandCorrect(){
113   boolean ret = false;
114   if(command.charAt(0) == '0' || command.charAt(0) == '1'){
115     if(isNumeric(command.charAt(1))){
116       recID = command.charAt(1) - 48;
117       if(command.charAt(0) == '1'){ recID = recID + 10; }
118       ret = true;
119     }
120   }
121   return ret;
122 }
123 
124 int parseArgument(int argOffset){
125   int ret = 0;
126   String arg = command.substring(argOffset, argOffset + 4);
127   if(isNumeric(arg.charAt(3))){
128     ret = arg.charAt(3) - 48;
129     if(isNumeric(arg.charAt(2))){
130       ret = ret + (10 * (arg.charAt(2) - 48));
131       if(isNumeric(arg.charAt(1))){
132         ret = ret + (100 * (arg.charAt(1) - 48));
133         if(arg.charAt(0) == '-'){
134           ret = -ret;
135         } else {
136           if(isNumeric(arg.charAt(0))){
137             ret = ret + (1000 * (arg.charAt(0) - 48));
138           }
139         }
140       }
141     }
142   }
143   return ret;
144 }
145 
146 boolean isNumeric(char character){
147   boolean ret = false;
148   if(character >= 48 && character <= 75){
149     ret = true;
150   }
151   return ret;
152 }
153 
154 String getArgument(int argOffset){
155   return command.substring(argOffset, argOffset + 4);
156 }

См.также

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