Почему мой клиент не получает данные с сервера, которые отправляются из функции прерывания? - PullRequest
0 голосов
/ 06 июля 2019

Я должен отправить данные клиенту в функции прерывания. Но, видимо, клиент не может получить данные. Сервер получил данные, отправленные клиентом, но клиент не может ответить обратно.

Когда я пытаюсь установить связь в пустом цикле, это успешно. Но как только я помещаю это в прерывание, я не могу получить данные обратно. Данные, которые должен отправить сервер, - это просто число, которое затем активирует светодиод на стороне клиента. Это действительно полезно, если кто-то может помочь мне понять это.

Это часть кода сервера.

void ICACHE_FLASH_ATTR detectsMovement() {
 LightValue = LightSensor.GetLightIntensity();  
 Serial.print("Light: ");
 Serial.println(LightValue);
 if (LightValue < threshold )
 {
    Serial.println("MOTION DETECTED!!!");
    analogWrite(led, 1023);
    startTimer = true;
    lastTrigger = millis(); 
    WiFiClient client = server.available();
    if (client) {
      if (client.connected()) 
      {
         digitalWrite(ledPin, LOW);  // to show the communication only 
         (inverted logic)
         Serial.println("");
         String request = client.readStringUntil('\r');    // receives the 
          message from the client
         Serial.print("From client: "); Serial.println(request);
         client.flush();
         client.println("1\r");      // sends the answer to the client
         digitalWrite(ledPin, HIGH);
      }
    client.stop();                // terminates the connection with the client
   }
  }
}

void setup() {
  Serial.begin(115200);                   // only for debug
  WiFi.config(ip, gateway, subnet);       // forces to use the fix IP
  WiFi.begin(ssid, pass);                 // connects to the WiFi router
  while (WiFi.status() != WL_CONNECTED) 
  {
    Serial.print(".");
    delay(500);
  }

   pinMode(motionSensor, INPUT_PULLUP);
   // Set motionSensor pin as interrupt, assign interrupt function and set RISING mode
   attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);

   server.begin();        // starts the server

   pinMode(light, INPUT);
   LightSensor.begin();  
   Serial.println("Running...");

   pinMode(ledPin, OUTPUT);
   pinMode(led, OUTPUT);
}

И код клиента

   void loop () {
  client.connect(server, 80);   // Connection to the server
  digitalWrite(ledPin, LOW);    // to show the communication only (inverted logic)
  Serial.println(".");
  client.println("Hello server! Are you sleeping?\r");  // sends the message to the server
  String answer = client.readStringUntil('\r');   // receives the answer from the server
  Serial.println("from server: " + answer);
  if (answer  == "1")
  {
    Serial.println("Success!");
    analogWrite(D0, 512);
  }
  client.flush();4
  digitalWrite(ledPin, HIGH);
  delay(2000);                  // client will trigger the communication after two seconds
}

Клиент должен получить значение '1'. Я не знаю, что делать.

...