Обработка строк в запросе

scherkhan
Offline
Зарегистрирован: 22.04.2013

Делаю управление Ардуины через браузер. Соответственно нужно обрабатывать запросы браузера. Сравнивать строки и при свападении нужных выполнять какие либо действия, это без проблем:

if(request=="/led1-off") digitalWrite(ledPin1, LOW);

Но вот если пошимировать, или изменить какие либо переменные, на это не хватает тяму. информации на http://arduino.ru/Reference/StringObject практический нет, а скудные знания английского не позволякют обращаться к соответсквующим справочникам, на том же http://arduino.cc/en/Reference/StringObject.

Прошу помочь в следующей обработке строки. Запрос такого типа "/led4-127". 

Нужно для начала сравнить первые пять символв /led4, к какому диоду относится, затем от строки отнять /led4- шесть символов и оставшиеся перевести из string в integer. ну и после обработки должно :

..... analogWrite(ledPin4, 127);

Большое спасибо!

__Alexander
Offline
Зарегистрирован: 24.10.2012

а request у вас что? строка?

есть функции типа strcmp на сравнение строк... 

а по простому, если, допустим знаете перечень запросов, то можно проверять сначала только букву запроса if (request[1] == 'l')

потом в переменную класть число типа

char pwm =  (request[6] -0x30) * 100 +  (request[7] -0x30) * 10 +  (request[8] -0x30);

как-то так.

хотя могу посоветовать sprintf, только он ради вот той одной команды сожрет около 1кб флеша.

scherkhan
Offline
Зарегистрирован: 22.04.2013

да, request это переменная, которая содержит строку. она объявлена так :





  EthernetClient client = server.available();
  if(client){
    String request;
    ..........

я занаю перечень запросов. если я пытаюсь сравнить только букву запроса, как предложили,  if (request[1] == 'l'), то компилятор ругается: sketch_apr27a:62: error: invalid conversion from 'const char*' to 'char'.

добалю, что все запросы браузером начинаются с символа "/"

__Alexander
Offline
Зарегистрирован: 24.10.2012

странно. у меня работает, а вам говорит что request указатель? очень странно.

scherkhan
Offline
Зарегистрирован: 22.04.2013

может мне подругому объявить request? взял за основу стандартные примеры для работы с сетью.

EthernetClient client = server.available();
  if(client){
    String request;
    boolean currentLineIsBlank = true;
    boolean requestLineReceived = false;
    while(client.connected()){
      if (client.available()){
        char c = client.read();
        if(c == '\n' && currentLineIsBlank){
          request = request.substring( 
                      request.indexOf(' ') + 1, 
                      request.lastIndexOf(' '));
          if(request=="/"){
            successHeader(client);
            generatePage(client);
          }
          else if(request=="/led1-on"){
            digitalWrite(led1, HIGH);
            ........................

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

попробуй 

if (String(request[1]) == String('l'))

других соображений у меня нет.

scherkhan
Offline
Зарегистрирован: 22.04.2013

Александр! Спасибо большое! все замечательно работает!



          else if (String(request[1]) == String('l')){
            if (String(request[4]) == String('4')){
              if (String(request[6]) == String('0') || String('1') || String('2')){
                int pwm =  (request[6] -0x30) * 100 +  (request[7] -0x30) * 10 +  (request[8] -0x30);
                analogWrite(led4, pwm);
                lcd.setCursor(0,3);
                lcd.print(pwm);
                redirectHeader(client, "/");
              }
            }
          }