2017-01-15 7 views
0

У меня есть сценарий ниже, и он работает.
Но я хочу контролировать это словом, как on или off вместо одного символа.
Я пробовал и искал много, но безуспешно.Управление Arduino с последовательным входом более 1 символа

/* 
Simple LED sketch 
*/ 

int led = 13; // Pin 13 

void setup() 
{ 
    pinMode(led, OUTPUT); // Set pin 13 as digital out 

    // Start up serial connection 
    Serial.begin(115200); // baud rate 
} 

void loop() 
{ 
    if (Serial.available()) { 

     int ser = Serial.read(); //read serial as ascii integer 

     if (ser == 'a') { //is this serial byte the ASCII equivalent of 0 through 9? 
      digitalWrite(led, HIGH); // on 
      Serial.println("aan"); 
     } 
     else if (ser == 'u') { 
      digitalWrite(led, LOW); // off 
      Serial.println("uit"); 
     } 
    } 
} 
+0

Есть ли вариант использования, который требует и оправдать увеличение размера и сложности полезной нагрузки? –

ответ

0

Используйте Serial.readStringUntil(terminator), чтобы прочитать строку из серии.

Отправленная строка должна быть завершена символом новой строки.
Выбрать Newline в серийный монитор Arduino IDE.

String cmd = ""; 

void loop() 
{ 
    if (Serial.available()) { 
     cmd = Serial.readStringUntil('\n'); 

     if (cmd == "on") { 
      digitalWrite(led, HIGH); // on 
      Serial.println("aan"); 
     } 
     else if (cmd == "off") { 
      digitalWrite(led, LOW); // off 
      Serial.println("uit"); 
     } 
    } 
} 
+0

Как вы знаете, этот код не работает, если (Serial.available()) не является условием –

+0

@IamtheLawTheLaw, что вы имеете в виду? Я думаю, что этот код должен выполнять функцию блокировки только в том случае, если в буфере есть хотя бы один символ (я думаю, что это лучшее, что вы можете сделать, не дублируя буфер). Стоит отметить, что обычно в Windows по умолчанию отправляется новый символ строки как «\ r \ n», который не делает этот код работать (вы должны отфильтровать символы \ r перед сравнением) – frarugi87

+0

@IamtheLawTheLaw Просто так вы знаете, я запустил этот код, и он отлично работает. –

-1

Ваша проблема заключается в том, что вы используете символ, Вы должны объявить строку, так что вы можете сравнить эту строку на вход, парень выше дал хорошо/очень slacky/слишком сложным для вас ответ (извините нет я просто пытаюсь показать контраст между сложным и легким ответом, не пытаясь оскорбить вас), а отчасти потому, что он не объяснил, что он делает, и потому, что он делает ненужную/бесполезную работу. Существует функция в C++, называемая Serial.readString(), намного проще, чем там. Если предположить, что уровень программирования (без обид) из вашего вопроса здесь быстрый обзор по типам данных:

String = «»

INT = целое число {1,2,3,4,5 , 6, ...}

символ = '' < - Обратите внимание на отличие от String = ""

поплавок = число с плавающей точкой {1.2,4.5, ...}

(Это не все из них, есть еще как байты и так далее, но только убедитесь, что вы знаете, как использовать выше первый)

/* 
    Simple LED sketch 
    */ 

    int led = 7; // Pin 13 
    String ser; //Declare the string that is going to store what your are going to 

//write in the serial 

    void setup(){ 

     // Start up serial connection 
     //It's good convention to start the serial before pinMode or any other thing   
//in setup 

     Serial.begin(9600); //I don't know why you need such an high baud rate in   

//your thing, 9600 for what you have to do is more than fine, this is just at 
    //what speed the serial is read (in a very general explanation) 

     pinMode(led, OUTPUT); // Set pin 13 as digital out 

    //make sure you put in here wheter you want to start the led "on" or "off" 

    //Eg you want it to start on, then digitalWrite(led, HIGH); 


    } 

    void loop(){ 

     ser = Serial.readString(); 


     if(Serial.available() == 0) { //You can also use a while loop if you want to 
    //This is telling the arduino: if there is something in the serial, then do... 

      if(ser == "on"){ 

       Serial.println("on"); 
      digitalWrite(led, HIGH); 

      }else if(ser == "off"){ 

      Serial.println("off"); 
      digitalWrite(led, LOW); 
     } 
     } 

    } 

Надеется, что это помогло! заметить также, как приведенный выше код с

if(Serial.available()) 

Это довольно странно и SHADY заявление и не может работать. Это потому, что вы на самом деле не говорит INT значение в функции Serial.available

Как Arduino руководств указать:

int incomingByte = 0; // for incoming serial data 

void setup() { 
     Serial.begin(9600);  // opens serial port, sets data rate to 9600 bps 
} 

void loop() { 

     // send data only when you receive data: 
     if (Serial.available() > 0) { 
       // read the incoming byte: 
       incomingByte = Serial.read(); 

       // say what you got: 
       Serial.print("I received: "); 
       Serial.println(incomingByte, DEC); 
     } 
} 

просматриваться here

+0

Позвольте мне угадать, парень выше дал большие пальцы, потому что я набросился на его ответ, lol –

+0

Я не запустил ваш ответ, потому что вы набросились на меня, я опустил его, потому что ваш неправ. –

+0

['Serial.readString()'] (https://www.arduino.cc/en/Serial/ReadString) основан на тайм-ауте, который по умолчанию составляет 1 секунду. Это означает, что блоки readString не менее 1 секунды при каждом вызове. Это также означает, что команды будут иметь 1 секунду задержки и что вы не можете отправлять отдельные команды быстрее, чем один раз в секунду, или вы получите несколько команд в одной строке. Тайм-аут можно сократить с помощью функции ['Serial.setTimeout (миллисекунды)'] (https://www.arduino.cc/en/Serial/SetTimeout), но это все еще не идеально. –