Serial esp-01 --->> Arduino Mega. Mensaje incompleto

Buenas gente,

Hoy os vengo con un problema que tengo con la comunicacion serial entre el esp01 y el arduino.

He usado el siguiente codigo en el esp01

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  Serial.print("hola$");
}

Y el siguiente codigo en el arduino mega:

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600);
  //espSerial.begin(9600);
}
 
void loop()
{
  if (Serial1.available()){
    String message = readMessage();
    Serial.println(message);
  }
}
 
String readMessage(){
  bool finish = true;
  String msg = String("Message: ");
  while(finish && Serial1.available()){
    char rec = (char) Serial1.read();
    if (rec == '

y el resultado en la consola serial que me muestra el arduino, es el siguiente:

Message: hol$
Message: hol$
Message: hol$
Message: hol$
Message: hol$
Message: hol$
Message: hol$
Message: hola$
Message: hoa$
Message: hoa$
Message: hoa$
Message: hoa$

Como podeis ver, el mensaje llega muchas veces como a medias o sin alguna letra intermedia. Pero he podido observar que si le meto un pequeño delay, por ejemplo de 20 en el esp01, el problema se me soluciona.

Querria preguntaros que pensais vosotros sobre el tema, ya que como podeis ver, estoy haciendolo con hardware serial con serial1, y con 9600 baudios entre ambos dispositivos.

Un saludo)
      finish = false;
    msg += String(rec);
  }
  return msg;
}


y el resultado en la consola serial que me muestra el arduino, es el siguiente:

§DISCOURSE_HOISTED_CODE_2§


Como podeis ver, el mensaje llega muchas veces como a medias o sin alguna letra intermedia. Pero he podido observar que si le meto un pequeño delay, por ejemplo de 20 en el esp01, el problema se me soluciona. 

Querria preguntaros que pensais vosotros sobre el tema, ya que como podeis ver, estoy haciendolo con hardware serial con serial1, y con 9600 baudios entre ambos dispositivos.

Un saludo

Hi,
Una cosa que veo es que estas enviando el mesaje si ver si el otro lado esta listo para recibir. En ell recibidor trata la instruccion de ver si esta ready asi "if (Serial.available() > 0) {" entonces lee el puerto. No soy experto pero no puedes mandar informacion hasta ver si el otro lado este listo para recibir. Para eso se usa la instruccion available.

Buenas,

En el recibidor tengo puesto:

  if (Serial1.available()){
    String message = readMessage();

Que es lo que comentabas >0

En cuanto al esp01, el no sabe cuando debe mandar el mensaje, simplemente esta todo el rato en loop mandando el mismo.

No termino de entender muy bien a que te refieres.

Un saludo

tauro dice que pruebes

if (Serial1.available()>0){

yo te sugiero que luego de leer pongas un

Serial1.flush();

Con eso borras el buffer.

prueba de a 1 por vez.

Buenas Surbyte,

En principio lo de tauro no deberia de surtir ningun efecto que yo sepa, es decir:

lo mio:

if (Serial1.available()){

Es igual a lo sugerido:

if (Serial1.available()>0){

De ahi que entre en el bucle.

En cuanto a lo del flush, lo probare mañana, pero tampoco lo tengo muy claro, es decir, de que me serviria borrar el buffer despues de leer? Podria incluso borrar algo que ha llegado despues de leer y antes de borrar, la verdad, ni idea, pero probare a ver.

Un saludo

Buenas,

He estado probando esta mañana, y efectivamente habiendo probado las 2 opciones, que me dijisteis, me sigue pasando lo mismo. Tambien probe a aumentar el tamaño del buffer del arduino, pero tampoco se arreglo.

Sin embargo, en caso de mandar mensajes no tan rapido, es decir, simplemente cuando se cumpliese 1 condicion, que se mandasen 1 o 2 mensajes, no pasa nada.

Alguna idea de por que pasa esto?

Un saludo

Estas usando la misma velocidad para las dos comunicaciones seriales, eso hace que un pequeño retraso sea acumulativo y se desborde el Buffer , aumenta la velocidad de comunicaciones entre el arduino y la PC.

Buenas,

El problema no es que se pierda parte del mensaje del arduino al pc sino del esp-01 al arduino.

Tambien probe aumentando el buffer como ya dije a 256 pero tampoco sirvio de nada.

He probado de todas formas lo que me has recomendado subiendo los baudios en la conexion serial con el pc, pero funciona incluso peor que antes.

Alguien tiene por serial un arduino con un esp01 que funcione bien?

Un saludo

En ese caso tal vez deberías comentar como esta conectado; distancia, cables, etc

Prueba variar la velocidad entre los micros, por si es alguna interferencia
Utiliza un Serial.flush() como te aconsejaron , pero en el ESP después de enviar el mensaje.

Pensándolo un poco, estás mandando cinco caracteres a 9600 bps en un look que tarda unos milisegundos en repetirse. Estás desbordando el búfer del ESP, por eso un pequeño delay hace que funcione bien . Definitivamente aumenta la velocidades de la comunicación al maximo.

Buenas,

Si puede ser que se desborde, pero tampoco puedo dejar metido un delay en el codigo.

Necesito alguna forma de establecer una comunicacion serial, sin que se me pierdan mensajes por el camino.

Un saludo

Simple. No envíes un mensaje cada loop del programa, utiliza la función millis() para enviar un mensaje cada segundo.
Saludos