Библиотека Arduino ESPTelnet.h считывание данных с экрана cmd

Я новичок в Arduino. Я использовал Arduino IDE для загрузки кода в модуль ESP8266. Я написал приложение для банкомата на плате tiva-tm4c123. Я пытаюсь подключиться к приложению из Интернета, используя telnet и ip-адрес. Я загрузил пример кода библиотеки ESPtelnet в модуль ESP8266 и подключил модуль esp wifi к карте tm4c123 с помощью uart. Модуль ESP8266 отправляет данные с карты tiva на экран putty, который я подключаю через telnet. Но это не переносит то, что я пишу с экрана шпатлевки на карту tiva. Я не смог найти такую функцию, как telnet.read(). Есть ли функция telnet, которая будет считывать данные с экрана шпатлевки? Я много искал, но не мог его найти. Если я найду эту функцию, я знаю, что могу отправить считанные данные на карту tiva с помощью Serial.write(telnet.read).RX и TX ESP подключены к карте tiva. Я создал беспроводное соединение с экраном шпатлевки. Когда символ или строка вводятся на экране telnet, он отправляет их на карту tiva с последовательной записью с TX ESP8266.Я хочу написать код, который будет выполняться в следующей логике.

 if (telnet.available()) {
    Serial.print(telnet.read());
  }

Вот пример кода


#include "ESPTelnet.h"          

/* ------------------------------------------------- */

#define SERIAL_SPEED    115200
#define WIFI_SSID       "****"
#define WIFI_PASSWORD   "****"

/* ------------------------------------------------- */

ESPTelnet telnet;
IPAddress ip;

/* ------------------------------------------------- */

void setupSerial(long speed, String msg = "") {
  Serial.begin(speed);
  while (!Serial) {
  }
  delay(200);  
  Serial.println();
  Serial.println();
  if (msg != "") Serial.println(msg);
}

/* ------------------------------------------------- */

bool isConnected() {
  return (WiFi.status() == WL_CONNECTED);
}

/* ------------------------------------------------- */

bool connectToWiFi(const char* ssid, const char* password, int max_tries = 20, int pause = 500) {
  int i = 0;
  WiFi.mode(WIFI_STA);
  #if defined(ARDUINO_ARCH_ESP8266)
    WiFi.forceSleepWake();
    delay(200);
  #endif
  WiFi.begin(ssid, password);
  do {
    delay(pause);
    Serial.print(".");
  } while (!isConnected() || i++ < max_tries);
  WiFi.setAutoReconnect(true);
  WiFi.persistent(true);
  return isConnected();
}

/* ------------------------------------------------- */

void errorMsg(String error, bool restart = true) {
  Serial.println(error);
  if (restart) {
    Serial.println("Rebooting now...");
    delay(2000);
    ESP.restart();
    delay(2000);
  }
}

/* ------------------------------------------------- */

void setupTelnet() {  
  // passing on functions for various telnet events
  telnet.onConnect(onTelnetConnect);
  telnet.onConnectionAttempt(onTelnetConnectionAttempt);
  telnet.onReconnect(onTelnetReconnect);
  telnet.onDisconnect(onTelnetDisconnect);
  
  // passing a lambda function
  telnet.onInputReceived([](String str) {
    // checks for a certain command
    if (str == "ping") {
      telnet.println("> pong");
      Serial.println("- Telnet: pong");
    }
  });

  Serial.print("- Telnet: ");
  if (telnet.begin()) {
    Serial.println("running");
  } else {
    Serial.println("error.");
    errorMsg("Will reboot...");
  }
}

/* ------------------------------------------------- */

// (optional) callback functions for telnet events
void onTelnetConnect(String ip) {
  Serial.print("- Telnet: ");
  Serial.print(ip);
  Serial.println(" connected");
}

void onTelnetDisconnect(String ip) {
  Serial.print("- Telnet: ");
  Serial.print(ip);
  Serial.println(" disconnected");
}

void onTelnetReconnect(String ip) {
  Serial.print("- Telnet: ");
  Serial.print(ip);
  Serial.println(" reconnected");
}

void onTelnetConnectionAttempt(String ip) {
  Serial.print("- Telnet: ");
  Serial.print(ip);
  Serial.println(" tried to connected");
}

/* ------------------------------------------------- */

void setup() {
  setupSerial(SERIAL_SPEED, "Telnet Test");
  
  Serial.print("- Wifi: ");
  connectToWiFi(WIFI_SSID, WIFI_PASSWORD);
  
  if (isConnected()) {
    ip = WiFi.localIP();
    Serial.print(" ");
    Serial.println(ip);
    setupTelnet();
  } else {
    Serial.println();    
    errorMsg("Error connecting to WiFi");
  }
}

/* ------------------------------------------------- */

void loop() {
  telnet.loop();

  // send serial input to telnet as output
  // this part read tiva and transmit to ESP
  if (Serial.available()) {
    telnet.print(Serial.read());
  }
}
//* ------------------------------------------------- */

, 👍2

Обсуждение

я думаю, что вы можете отправлять данные только с клавиатуры ... Шпатлевка не имеет функции чтения с экрана, @jsotola

попробуйте Serial.write(telnet.read ());". лучше использовать "while", чем "если" здесь: "while (telnet.available()), @Juraj

Проблема @Juraj в том, что нет функции telnet.read() или telnet.avaible ()., @Kerim Turak

ОК. извините, я не знаю библиотеку. Я написал более простую библиотеку серверов telnet TelneStream, но на самом деле это всего лишь класс сервера, завернутый в тонкий слой. В Arduino esp8266 3.0 мой сервер ArduinoWiFiServer продемонстрирован на примере telnet-сервера PagerServer, @Juraj


1 ответ


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

0

Мне кажется, что библиотека была написана для приема ввода, заканчивающегося символом новой строки.

    char c = client.read();
    if (c != '\n') {
      if (c >= 32) {
        input += c; 
      }
    // EOL -> send input
    } else {
      if (on_input != NULL) on_input(input);
      input = "";
      }

Он будет продолжать добавлять символы во входной буфер до тех пор, пока не будет обнаружен символ новой строки, а затем передавать содержимое полученному обработчику .onInputReceived.

Если я правильно понимаю, лучшее, что вы можете сделать, не внося изменений в саму библиотеку, - это:-


  telnet.onInputReceived([](String str) {
      Serial.println(str);
  });

Опять же, если я прав, то символ новой строки всегда должен присутствовать для передачи данных.

Надеюсь, это будет полезно.

,

@Juraj Точно., @voidPointer

так почему же вы пишете об изменении библиотеки, @Juraj

@voidPointer да, когда я использую это, происходит обмен данными, но мне нужно отладить его, чтобы подтвердить правильность. Я еще свяжусь с тобой., @Kerim Turak

извините. теперь я понимаю, что ты имеешь в виду. это лямбда, @Juraj

@Juraj, потому что это не просто вопрос наличия данных. Новая линия также должна присутствовать для доставки, а не для передачи чего-либо полученного. Без этого понимания, возможно, было бы непонятно, почему данные не передаются., @voidPointer

клиенты telnet обычно отправляют новую строку. его можно настроить. автор библиотеки знает об этом, @Juraj