NodeMCU (ESP-12E) требует цикла питания для Serial.read () для работы - PullRequest
0 голосов
/ 01 июля 2019

Используя подсказки из учебных пособий, я написал простой Wi-Fi-сервер и клиент, который только передает символы, полученные из последовательной линии (подключенной через USB к ПК) по Wi-Fi, к другому узлу и, соответственно, inc / dec переменную (см. код ниже).Я использовал Arduino IDE (1.8.9) для написания этого кода на простом C / C ++.Проблема, с которой я сталкиваюсь, заключается в том, что этот код работает нормально только после отключения питания (мне нужно отсоединить USB-кабель от модуля и снова подключить его).Если я нажимаю только кнопку сброса HW на модуле или после отправки новой версии кода (в большинстве случаев), все работает нормально, кроме функций Serial.available () или Serial.read ().Они просто не видят ничего, поступающего с ПК через USB / последовательную линию.Но переподключение USB и повторное подключение программы терминала Putty (т.е. полный цикл питания) разрешает ее, и все снова работает.Он всегда работает правильно после цикла питания, но в большинстве случаев происходит сбой после нажатия кнопки RST (или загрузки новой версии).Каким-то образом последовательный модуль ESP остается застрявшим или неправильно инициализируется при перезагрузке модуля без полной потери питания.Такое же поведение на сервере и клиенте.Замена модуля на другой - тот же результат.Я использовал последние настройки платы NodeMCU / ESP, загруженные вчера с помощью менеджера плат Arduino.У вас, пожалуйста, есть какие-нибудь советы, как решить эту проблему?

Код:

Сервер:

#include <ESP8266WiFi.h>

const char* ssid = "my ssid"; //replace this with your WiFi network name
const char* password = "my passwd"; //replace this with your WiFi network password

WiFiServer server(12345);
int a;

void setup()
{
  a = 0;
  pinMode(D5, OUTPUT);  // piezo spkr
  delay(1000);
  Serial.begin(115200);
  delay(1000);
  tone(D5, 1720);

  Serial.flush();  //irrelevant whether this is here or not
  Serial.print("Wifi.begin()");
  WiFi.begin(ssid, password);

  Serial.println();
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  tone(D5, 220);

  Serial.println("success!");
  Serial.print("Server IP Address is: ");
  Serial.println(WiFi.localIP());

  delay(1000);
  noTone(D5);

  server.begin();
}

int read_and_process_packet(WiFiClient *client)
{
  char packet_type = client->read();
  switch (packet_type)
  {
    case 'a': a--; Serial.println(a); break;
    case 'q': a++; Serial.println(a); break;
    case '-': return 0;
  }
  return 1;
}

void loop() {
  WiFiClient client = server.available();
  if (client) {

    if (client.connected()) {
      Serial.println("Connected to client");

      while (client.connected())
      {
        if (!read_and_process_packet(&client)) break;
        if (Serial.available())
        {
          char c = Serial.read();
          client.write(c);
        }
        delay(50);
      }
      client.stop();
      Serial.println("Client left");
    }
  }
  delay(1);
}

Клиент:

#include <ESP8266WiFi.h>

// Replace these with your WiFi network settings
const char* ssid = "my ssid"; //replace this with your WiFi network name
const char* password = "my passwd"; //replace this with your WiFi network password

int a;

WiFiClient client;
char server_ip[20];

void setup()
{
  a = 0;
  pinMode(D5, OUTPUT);
  delay(1000);

  Serial.begin(115200);
  delay(1000);
  Serial.flush();  //irrelevant whether this is here or not

  Serial.print("Enter server IP: ");

  char *p = server_ip;
  for (int i = 0; i < 4; i++)
  {
    int ip = read_number();
    p = print_num(p, ip);  
    if (i < 3) 
      p = print_char(p, '.');
  }
  Serial.println();

  tone(D5, 1720);

  Serial.print("Wifi.begin()");
  WiFi.begin(ssid, password);

  Serial.println();
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  tone(D5, 220);

  Serial.println("success!");
  Serial.print("IP Address is: ");
  Serial.println(WiFi.localIP());

  delay(100);
  noTone(D5);

  Serial.print("connecting to ");
  Serial.print(server_ip);
  Serial.print(":");
  Serial.println(12345);

  if (!client.connect(server_ip, 12345))
  {
    Serial.println("Could not connect to the server.");
    while (1);
  }
  tone(D5, 440, 50); 
}

int read_number()
{
  int x = 0;
  while (1) {
    if (Serial.available())
    {
      int c = Serial.read();
      Serial.write(c);
      if ((c >= '0') && (c <= '9'))
        x = x * 10 + (c - '0');
      else return x;
    }
    delay(100);
  }
}

char *print_num(char *p, int num)
{
  if (num == 0) *(p++) = '0'; 
  else 
  {
    if (num < 0) { *(p++) = '-'; num = -num; }
    long q = 1;
    while (q <= num) q *= 10;
    while (q > 1)
    {
      q /= 10;
      *(p++) = (num / q) + '0';
      num %= q;
    }
  }
  *p = 0;
  return p;
}

char * print_char(char *p, int c)
{
  *(p++) = c;
  *p = 0;
  return p;
}

int read_and_process_packet(WiFiClient *client)
{
  char packet_type = client->read();
  switch (packet_type)
  {
    case 'a': a--; Serial.println(a); break;
    case 'q': a++; Serial.println(a); break;
    case '-': return 0;
  }
  return 1;
}

void loop() 
{
  if (client.connected()) {
      Serial.println("Connected to server");

      while (client.connected())
      {
        if (Serial.available())
        {
          char c = Serial.read();
          client.write(c);
        }
        if (!read_and_process_packet(&client)) break;
        delay(1);
      }
      client.stop();
  }
  delay(1);
}
...