Пытаюсь отправить данные на сервер, но AT+CIPSEND работает неправильно.

Отправка данных на сервер (thingspeak.com/184.106.153.14) с помощью AT-команд на последовательном мониторе работает нормально, но всякий раз, когда я загружаю скетч, следующее всегда возвращает false if(Serial.find( ">" ) ). Я не уверен, что AT+CIPSEND работает неправильно или что-то в этом роде. Я использую Arduino с ESP8266. Любая помощь будет оценена по достоинству. Заранее спасибо. Вот мой код.

  #include <SoftwareSerial.h>
  SoftwareSerial softSerial(2, 3); // RX, TX

  #define SSID "myssid"
  #define PASS "Mypass"
  #define IP "184.106.153.149" // ThingSpeak

  void setup() 
  {
   uint32_t baud = 9600;
   Serial.begin(baud);
   softSerial.begin(baud);

   connectWiFi();
   }

   void loop() 
   {
    updateTS();
    }

    void updateTS()
    {
    String cmd = "AT+CIPSTART=\"TCP\",\"";// Настройка TCP-соединения
    cmd += IP;
    cmd += "\",80";
    sendDebug(cmd);
    delay(2000);

    String url = "GET /update?key=P55Z0BDASNQBFQKT&field1=15&field2=25\r\n\r\n"; //значение жесткого кода 15 и 25
    String stringLength="AT+CIPSEND=";
    stringLength +=String(url.length( ));
    Serial.println(stringLength);
    //задержка(10000); Я даже пытался задержаться на несколько секунд.

   //Здесь происходит сбой, он переходит к закрытию соединения
   if(Serial.find( ">" ) )
    {
     softSerial.print(">");
     softSerial.print(cmds);
     Serial.print(cmds);
    }
    else
    {
     sendDebug( "AT+CIPCLOSE" );//закрываем TCP-соединение
    }

    }


   void sendDebug(String cmd)
    {
      softSerial.print("SEND: ");
      softSerial.println(cmd);
      Serial.println(cmd);
     }

     boolean connectWiFi()
    {
      Serial.println("AT+CWMODE=1");
      delay(2000);
      String cmd="AT+CWJAP=\""; // Присоединяемся к точке доступа
      cmd+=SSID;
      cmd+="\",\"";
      cmd+=PASS;
      cmd+="\"";
      sendDebug(cmd);
      delay(5000);
      if(Serial.find("OK"))
      {
       softSerial.println("RECEIVED: OK");
       return true;
      }
      else
      {
       softSerial.println("RECEIVED: Error");
       return false;
       }
     }

, 👍1

Обсуждение

К каким контактам Arduino вы подключили ESP?, @SoreDakeNoKoto

На Arduino я сделал контакт 2 как Rx, а контакт 3 как Tx. Все это проходит через логический преобразователь. Но, как я уже упоминал выше, когда я запускаю AT-команды на последовательном мониторе, данные отправляются на сервер нормально только тогда, когда я загружаю эскиз., @sparks


1 ответ


Лучший ответ:

1

Ваш код выглядит так, будто вы подключили ESP к аппаратному последовательному порту, но ваш комментарий говорит об обратном:

Ваш скетч не работает, потому что вы половину времени пишете не на тот последовательный порт, и даже когда вы используете правильный последовательный порт (softSerial), вы отправляете вместе с ним мусор.

Serial.println(stringLength); и Serial.find("OK") должны быть softSerial.println(stringLength); и softSerial.find("OK").

Serial.find( ">" ) должно быть softSerial.find( ">" ). Вам следует искать '>' в буфере между Arduino и ESP8266, а не между Arduino и ПК.

softSerial.print(">");, softSerial.println("RECEIVED: OK"); и подобных операторов вообще не должно быть. Они не являются командами или аргументами команды, так зачем же вы печатаете их в ESP? Всякий раз, когда вы пишете в softSerial, убедитесь, что это команда. Не отправляйте свои отладочные сообщения в softSerial; вместо этого используйте Serial.

Нет переменной с именем cmds, и все же вы печатаете ее в последовательный порт. Если предположить, что этот код скомпилирован, то, вероятно, это опечатка в вашем вопросе?

Наконец, структура вашего кода в лучшем случае ненадежна, учитывая все задержки в ней и отсутствие Serial.available() или softSerial.available(), не говоря уже об обильном использовании строк Arduino. Я предлагаю вам сначала научиться читать из последовательного порта и создавать строки C из результатов, а затем затем перепроектировать свой код заново. Блог Majenko — это такой же хороший учебник, как и любой другой. Или вы можете загрузить библиотеку, например эту, которая предоставляет простой API для ESP8266, защищая вас от беспорядка AT-команд, в то же время предоставляя вам примеры скетчей, которые уже делают то, что вам нужно. Конечно, вы можете выбрать просмотр их библиотеки (файлы .cpp и .h — это то, что нужно) и выяснить, как они использовали AT-команды с ESP, а затем написать свой собственный скетч, библиотеку или что-то еще. Удачи.

,