Arduino Mega Server

Модератор: Alex

Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пн фев 01, 2016 8:58 pm

Рабочий код это хорошо. Вопрос: эта штука универсальная (в смысле количества параметров)?

Как она себя поведёт при 2-х парамерах? А при 10-и?

Имеется в виду сам парсинг, не обёртка в виде rgba.
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Arduino Mega Server

Сообщение Xseon » Пн фев 01, 2016 9:11 pm

Да, абсолютно универсальная у меня в скетче стоит константа обработки до 20 параметров. Но ключевое слово в запросе rgb=1, но само собой тоже правится на нужное.
На правильность кода не претендую, думаю Дима лучше вариант опубликует.
SPbDima
Сообщения: 113
Зарегистрирован: Пн окт 19, 2015 8:27 am
Благодарил (а): 9 раз
Поблагодарили: 21 раз

Re: Arduino Mega Server

Сообщение SPbDima » Пн фев 01, 2016 9:35 pm

Почти универсальный. Почти - по причине пропуска значения до первого амперсанда. Значение может быть и ненужно, но это надо учитывать.
И, непонятно, зачем используется "params[parsedParams]."? Который, в добавок, объявлен где то снаружи.
Для чего params[parsedParams].name? Если нет контроля? Да и вообще, нужно ли имя параметра в строке?
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Arduino Mega Server

Сообщение Xseon » Пн фев 01, 2016 10:18 pm

Обновил свой предыдущий пост с кодом!
Как выяснилось тестил не ту функцию и потом только увидел, что sizeof(parameter) определяет размер в конкретном примере как int 6, а длина строки как раз в моём случае должна быть 20.
Код выше исправил и оттестировал многократно, проблем и зависаний при обработке переданных параметров не обнаружил.
По поводу универсальности. Мне примерно так и надо было, чтобы штатным парсером отсекалась команда, если команда найдена в списке команд, то я вызываю нужный мне обработчик.
Xseon
Сообщения: 51
Зарегистрирован: Ср сен 18, 2013 12:21 am
Благодарил (а): 9 раз
Поблагодарили: 7 раз

Re: Arduino Mega Server

Сообщение Xseon » Пн фев 01, 2016 10:25 pm

SPbDima писал(а):Почти универсальный. Почти - по причине пропуска значения до первого амперсанда. Значение может быть и ненужно, но это надо учитывать.
И, непонятно, зачем используется "params[parsedParams]."? Который, в добавок, объявлен где то снаружи.
Для чего params[parsedParams].name? Если нет контроля? Да и вообще, нужно ли имя параметра в строке?
Исключительно для красоты и полноты ООП))) А вот имена параметров в строке считаю очень правильным и с МД удобнее обращаться да и в скетче тоже, хотя если обратить вничание на мою функцию, то на данный момент они не используются и не проверяются!
Pitti
Сообщения: 3
Зарегистрирован: Пт янв 29, 2016 7:41 pm
Благодарил (а): 2 раза
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение Pitti » Пн фев 01, 2016 11:01 pm

Подскажите , на стадии загрузки скетча выходит ошибка на вкладке "noo"!!
Папку темп очистил( пустая)

Arduino: 1.6.5 (Windows 7), Плата"Arduino/Genuino Uno"

noo.ino: In function 'void nooInit()':
noo:18: error: 'Serial1' was not declared in this scope
noo.ino: In function 'void nooSendCommand(byte, byte, byte, byte)':
noo:50: error: 'Serial1' was not declared in this scope
'Serial1' was not declared in this scope
dkhv
Сообщения: 12
Зарегистрирован: Пт янв 29, 2016 3:07 am
Благодарил (а): 0
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение dkhv » Пн фев 01, 2016 11:14 pm

Автор, но все таки что не правильно делаю.
1. подключил Arduinu mega 2560. выбрал настройки подключения в IDE
2. раскрыл библиотеки в arduino/lib/ (получил dallastemperature,ds1307rtc,..) причем и в текущую где скетч и туда где скетч
3. указал в IDE путь запуска скетча, почистил Temp
4. открыл скетч. заливаю. и получаю ошибки
такое ощущение, что не видится библиотеки.
Arduino: 1.6.5 (Windows 8.1), Плата"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

arduino_mega_server.ino: In function 'void setup()':
arduino_mega_server:181: error: 'timersInit' was not declared in this scope
arduino_mega_server:183: error: 'ethernetInit' was not declared in this scope
arduino_mega_server:187: error: 'SDcardInit' was not declared in this scope
arduino_mega_server:188: error: 'serverInit' was not declared in this scope
arduino_mega_server:192: error: 'rtcInit' was not declared in this scope
arduino_mega_server:197: error: 'majordomoInit' was not declared in this scope
arduino_mega_server:198: error: 'majordomoMegaLive' was not declared in this scope
arduino_mega_server:223: error: 'uploadInit' was not declared in this scope
arduino_mega_server:228: error: 'pirsInit' was not declared in this scope
arduino_mega_server:232: error: 'contactsInit' was not declared in this scope
arduino_mega_server:236: error: 'tempInit' was not declared in this scope
arduino_mega_server:240: error: 'electroInit' was not declared in this scope
arduino_mega_server:248: error: 'ledsInit' was not declared in this scope
arduino_mega_server.ino: In function 'void loop()':
arduino_mega_server:257: error: 'uploadWorks' was not declared in this scope
arduino_mega_server:262: error: 'rtcWorks' was not declared in this scope
arduino_mega_server:266: error: 'profStart' was not declared in this scope
arduino_mega_server:267: error: 'timersWorks' was not declared in this scope
arduino_mega_server:270: error: 'serverWorks' was not declared in this scope
arduino_mega_server:282: error: 'pirsWorks' was not declared in this scope
arduino_mega_server:286: error: 'contactsWorks' was not declared in this scope
arduino_mega_server:291: error: 'tempWorks' was not declared in this scope
arduino_mega_server:298: error: 'electroWorks' was not declared in this scope
arduino_mega_server:299: error: 'freqWorks' was not declared in this scope
arduino_mega_server:303: error: 'freqWorks' was not declared in this scope
arduino_mega_server:309: error: 'majordomoMegaLive' was not declared in this scope
arduino_mega_server:341: error: 'rtcSync' was not declared in this scope
arduino_mega_server:346: error: 'cyclosInSecWork' was not declared in this scope
arduino_mega_server:355: error: 'eraseCyclos' was not declared in this scope
arduino_mega_server:356: error: 'profCalc' was not declared in this scope
arduino_mega_server:358: error: 'cyclosDelayWork' was not declared in this scope
'timersInit' was not declared in this scope
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Arduino Mega Server

Сообщение Alex » Пн фев 01, 2016 11:33 pm

Arduino: 1.6.5 (Windows 7), Плата"Arduino/Genuino Uno"
У вас неправильно указана плата — с Уно АМС не работает
Автор, но все таки что не правильно делаю.

2. раскрыл библиотеки в arduino/lib/ (получил dallastemperature,ds1307rtc,..) причем и в текущую где скетч и туда где скетч
Вот этого делать не надо. Архив это целый проект, нужно только разархивировать и указать правильный путь.
Arduino: 1.6.5 (Windows 8.1), Плата"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"
Под Windows 8 не тестировалось — должно работать, но возможны варианты.
За это сообщение автора Alex поблагодарил:
Pitti (Ср фев 03, 2016 4:30 pm)
Рейтинг: 1.16%
SPbDima
Сообщения: 113
Зарегистрирован: Пн окт 19, 2015 8:27 am
Благодарил (а): 9 раз
Поблагодарили: 21 раз

Re: Arduino Mega Server

Сообщение SPbDima » Вт фев 02, 2016 8:13 am

Под win8 IDE отлично работает
SPbDima
Сообщения: 113
Зарегистрирован: Пн окт 19, 2015 8:27 am
Благодарил (а): 9 раз
Поблагодарили: 21 раз

Re: Arduino Mega Server

Сообщение SPbDima » Вт фев 02, 2016 9:55 am

Парсинг get запроса:

Код: Выделить всё

(не тестировал, но должно работать)
  else if (StrContains(HTTP_req, "GET /renamefile&")) {
    sendXmlAnswer(cl);
    strtok(HTTP_req, "&");
    renameFile(cl, String(strtok(NULL, "&")), String(strtok(NULL, "&")), String(strtok(NULL, "&")));//каталог, старый файл, новый файл
  }
Второй вариант с отдельной процедурой

Код: Выделить всё

void procedure(EthernetClient cl) {
  String monthCount=strtok(HTTP_req, "GET /&"); //первый параметр отвечает за количество запрашиваемых месяцев
  char* numSensor=strtok(NULL, "GET /&"); //второй параметр - порядковые номера запрашиваемых сенсоров через запятую
  for(String nSensor=strtok(numSensor, ","); nSensor!=NULL; nSensor=strtok(NULL, ",")) {
    byte num=nSensor.toInt();//число месяцев в формате int    
По поводу передачи параметра через "имя=значение", не забывайте что размер буфера запроса и команды 128 и 64 символов соответственно, поэтому использовать "имя" желательно только при острой необходимости. МД не использую, поэтому нюансов не знаю.
Если необходимо использовать "имя", можно сделать функцию разбивающая строчку "имя=значение" по "=" и возвращающая отдельно "имя" и "значение". Использовать ".substring(0,buffer1.indexOf('='));", насколько я понимаю, не лучший вариант по скорости.
Последний раз редактировалось SPbDima Чт фев 04, 2016 11:06 pm, всего редактировалось 1 раз.
Ответить