Связь двух девайсов - с одной стороны - аппаратный UART, с другой - софтовый.

Тема в разделе "Arduino & Shields", создана пользователем Gomez, 1 дек 2017.

  1. Gomez

    Gomez Гик

    Мне нужно связать ESP8266-01 и Arduino Nano.
    С ESP работаю скетчами, загружаемыми через Arduino IDE. Дело в том, что хочется оставить возможность заливки скетчей в Nano, поэтому не хочу соединять устройства аппаратными serial. Получится аппаратный со стороны ESP8266-01 и Software serial со стороны Nano.
    1) Так же можно? Просто выставить скорость на ESP 9600 - и все.
    2) Как правильнее "давать команду" ведомой ESP - просто делать softSerial.write с Nano, а в ESP - "слушать" в цикле "Что, новый хозяин, надо"? ;)
    Код (C++):
    if (Serial.available()){
    ...Serial.read();
    ....
    }
    Где-то мельком видел упоминание какого-то способа, когда кроме RX и TX и земли девайсы соединены дополнительным проводом, как бы для прерываний.
     
  2. Airbus

    Airbus Радиохулиган Модератор

    Можно все только нужно передавать служебный символ чтоб Сериал приемника понимал что это ему (или не ему?)адресованна посылка
     
  3. Gomez

    Gomez Гик

    Airbus, в смысле, внутри "if (Serial.available()){" какой-то дополнительный if() или что-то другое?
    Да, а откуда прилетит чужая посылка со специально обученных пинов Nano, отвечающих за SoftSerial? ;)
     
    Последнее редактирование: 2 дек 2017
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    А чем аппаратный отличается от софтового в плане передачи данных? Я к тому, что вторая сторона и знать не знает каким способом отправлены данные - это может быть даже Bluetooth-модуль или ПК.
     
    Gomez нравится это.
  5. Gomez

    Gomez Гик

    Tomasina, да, спасибо, понял, что-то перестраховался. Сигнал одного типа и одного уровня - он и в Африке такой же.
    Еще бы понять, как правильно передать массив из нескольких строк (имя точки доступа, пароль, URL) и получить ответную строковую переменную. А то вроде пишут, что правильно еще контрольную сумму сравнивать...
     
  6. sdfg

    sdfg Гик

    а - нано , б - есп

    а - передаю массив
    б - дллинна массива?
    а - 3
    б - эллемент 0 ?
    а - имя_точки_доступа
    б - принят имя_точки_доступа
    а - правилно
    б - эллемент 1 ?
    а - qwerty
    б - принят qwerty
    а - правилно
    б - эллемент 2 ?
    а - http://amperka.ru/
    б - принят http://amperka.ru/
    а - правильно
    б - прием завершен
     
    БАРМАТОГРАФ и Gomez нравится это.
  7. sdfg

    sdfg Гик

    или так
    b - tx rx ok
    a - rx tx ok
    b - tx=ssid
    a - ssid
    b - ssid =
    a - ok
    b - tx=pw
    a - pw
    b - pw=
    a - ok
    b - tx=url
    a - url
    b - url=
    a - ok
    b - end tx rx
     
    Gomez нравится это.
  8. Airbus

    Airbus Радиохулиган Модератор

    А ну да не посмотрел сразу.У Вас одно устройство.Тогда ничего не надо.Я подумал что приёмников несколько и тогда надо будет разделять что и кому-совершенно правильно как Вы заметили с помощью if.
     
  9. Gomez

    Gomez Гик

    Я пока сделал очень просто - кидаю SSID, пароль и URL поочередно, с переводом строки и читаю
    Код (C++):
    void loop() {
      if (Serial.available())  {
        char c = Serial.read();
        if (c == '\n') {
          Serial.println(readString);
          if (numvar == 0)
            ssid = readString;
          else if (numvar == 1)
            password = readString;
          else if (numvar == 2)
            url = readString;
          readString = "";
          numvar++;
        }
        else {
          readString += c;
        }
      }
    /////////
    }
    Не, я не в том смысле "проверки - шмоверки... и так сойдет". ;)
    Просто пока не могу понять - а нужно ли проверять для моей задачи.
    Два девайса на расстоянии 5 см, длина всего передаваемого - и 100 байт не наберется.
    А если Ардуина не получит нужного ответа, то есть строки, где есть определенные теги, она через минуту повторит запрос. (Если искомое получено, то повторит через 15 минут для штатного обновления данных)
    Если очень коряво или наивно - буду рад любым соображениям.
     
  10. DIYMan

    DIYMan Guest

    Гляньте, когда-то писал для простой установки через Serial разных параметров, строка может содержать несколько параметров одновременно, вида "param1=value1&param2=value2". Для каждого параметра вызовется каллбак. Исходники с примером: https://github.com/Porokhnya/ArduinoParamsFromStream
     
    Gomez нравится это.
  11. Gomez

    Gomez Гик

    Спасибо, это интересно!
    Только не разобрался, как применять "в бою" - чтобы переменная была "n", получили команду из Центра - стала "y". :)
    Если пишу наподобие
    Код (C++):
    void paramsHandler(const char* param, const char* value)
    {
      if (param == "ssid")
        ssid = value;
      else if (param == "password")
        password = value;
    }
    тогда не получается ничего хорошего присвоить своим объявленным
    Код (C++):
    char* ssid;
    char* password;
    а с const не получится, потому что, есссно, изменить значение не удастся - дас ист const.
    Я же могу просто в библиотеке поубивать const или я не с той стороны зашел? ;)
     
    Последнее редактирование: 4 дек 2017
  12. DIYMan

    DIYMan Guest

    Параметры в обработчике paramsHandler валидны только внутри функции, const трогать не надо, оно не для того там сделано, чтобы его трогать. Если вам надо сохранять данные вне обработчика - не сохраняете указатели на локальные параметры, копируйте к себе. В вашем случае - надо вместо
    Код (C++):
    char* ssid;
    char* password;
    объявить
    Код (C++):
    String ssid;
    String password;
    Это самый простой вариант - класс String сам всё скопирует. И да, вот так - не делается:
    Код (C++):
     if (param == "ssid")
        ssid = value;
      else if (param == "password")
        password = value;
    Так массивы символов не сравниваются, от слова "вообще". Вы сравниваете адреса двух указателей на массив char, вместо того, чтобы сравнивать содержимое строк. За вас писать не буду, вам следует матчасть подучить, самые основы.
     
  13. Gomez

    Gomez Гик

    Разумеется, Вы не должны за кого-то дописывать свою библиотеку и ее применение - Вы же ее не продаете.
    Спасибо за нее. Просто обычно в библиотеках есть пример "боевого", а не абстрактного применения.
    Пока нет времени понять эти различия указателей и строк, а char* требует библиотека ESP8266WiFi.h, находящаяся в ESP8266. У них в примерах все просто, они на лету не меняют точку доступа, поэтому объявляют, как const char*. Вот просто char* оно еще терпит.
    Все такие требовательные на этих всяких сях. :( ;)
     
    Последнее редактирование: 4 дек 2017
  14. rkit

    rkit Гуру

    strcmp(param, "ssid") == 0
    Вот так сравниваются строки
     
    Gomez нравится это.
  15. Gomez

    Gomez Гик

    Большое спасибо! Блин, strcmp же и в php есть, но там я никогда ее не использовал.
     
  16. DIYMan

    DIYMan Guest

    Там пример есть, более чем понятный, имхо. По поводу второго: у класса String есть метод c_str() - посмотрите, что он возвращает ;)

    Код (C++):
    String ssid = "MYNETWORK";
    esp.setSSID(ssid.c_str());

    ssid = "CHANGED";
    esp.setSSID(ssid.c_str());

    void paramsHandler(const char* param, const char* value)
    {
       if(!strcmp(param,"ssid"))
       {
          ssid = value;
          esp.setSSID(ssid.c_str());
       }
       else if(!strcmp(param,"password"))
          password = value;
    }

     
    Надеюсь, пример в псевдокоде понятен ;) И не стесняйтесь читать документацию - там есть, как правило, почти всё.
     
    Gomez нравится это.
  17. Gomez

    Gomez Гик

    Да, понятен! Спасибо огромное!
     
  18. Gomez

    Gomez Гик

    "Вопросов больше не имею - сказал Остап и тут же задал следующий вопрос."(с) ;)
    Просто один маленький - если моему знакомому ;) вдруг ;) чисто гипотетически ;)
    нужно будет все же изменить переменные, заданные как char*, поскольку библиотека, загружаемая в ESP8266 иначе ругается, и setSSID там тоже нет - то как бы я, ой, то есть он, мог бы поступить, дабы не вызывать гнев компилятора "invalid conversion from 'const char*' to 'char*' [-fpermissive]" ?
    (А пример со String выше, конечно, работает, и в нем все понятно)
     
  19. DIYMan

    DIYMan Guest

    Да делайте что угодно :) Тем более, раз ругается на кривую библиотеку, которая, вангую, входные неизменяемые параметры декларирует как char* вместо const char*. Просто в моём тривиальном парсере вам наружу отдаются пары "ключ-значение", которые ссылаются на внутренний буфер парсера и которые извне менять нельзя, ибо чревато - поэтому я строго это запрещаю декларацией в коде. Ну а так - хозяин-барин, конечно.

    Я же писал: ПСЕВДОКОД. Вы понимаете значение слова "псевдокод"?

    Но считаю, что прежде чем что-то менять - надо понимать, что и зачем вы делаете. Дайте кусок кода, на который ругается, плз - посмотрим, в чём там дело.
     
  20. Gomez

    Gomez Гик

    Да я вроде ничего такого не делаю.
    В исходных примерах было
    Код (C++):
    const char* ssid = "....";
    const char* password = "....";
    Естественно, там не нужно было менять на лету.
    Для того, чтобы использовать Вашу библиотеку,
    я поменял объявление на
    Код (C++):
    char* ssid;
    char* password;
    И теперь
    Код (C++):
    void paramsHandler(const char* param, const char* value)
    {
       if(!strcmp(param,"ssid"))
          ssid = value;
       else if(!strcmp(param,"password"))
          password = value;
    }
    конечно, вызывает жалобы на неправильное конвертирование.