Conflicto con comunicacion serial

Hola, tengo un pequeño programa en donde comunico mi pc con arduino, el problema es que al constatar si recibo la cadena que estoy enviando desde la pc se debe encender el LED pero esto no sucede a menos que tenga abierto el monitor serial. Ignoro a qué se debe este problema, espero alguien tenga experiencia con ello, aquí dejo mi código. Gracias.

int led = 13;
char texto[16];
char correcta[16]="Enviando texto";
char caracter;
void setup()  
{
  Serial.begin(9600);
  pinMode(13, OUTPUT); 
}

void loop() 
{
  int i=0;
  int error=0;
  while (Serial.available() > 0 && i<16) {
    caracter=Serial.read();
    texto[i++]=caracter;
    delayMicroseconds(500);
  }
  for(i=0;i<16;i++){
  if(texto[i]!=correcta[i]){
    error=1;
  }
  }
  if (error==0){// en esta condición se encuentra el problema, enciende el LED únicamente con el monitor serial abierto
    digitalWrite(13, HIGH);
    delay(5000);
  }
  digitalWrite(13, LOW);
  Serial.println("Recibe texto a");
}

Porque usas esto dentro del while

delayMicroseconds(500);

nunca vi que nadie lo usara.

Saludos.
Pregunto si estas verificando la informacion recibida vía serial y no tienes nada conectado a tu puerto Serial, que pretendes obtener?

Ahora prueba este codigo y me dices si te funciona. Y te repito si no conectas nada no debería encender el LED.

int led = 13;
char texto[16];
char correcta[]="Enviando texto";
char caracter;
bool comprobado=false;
void setup()  {
  Serial.begin(9600);
  pinMode(13, OUTPUT); 
}

void loop() {
  int i=0;
  int error=0;

  if(Serial.available()){
    if(Serial.find(correcta))comprobado = true;
    else comprobado = false;
  }
  if(comprobado==true){
   digitalWrite(13, HIGH);
   delay(5000);
   comprobado = false;
  }
  else digitalWrite(13, LOW);
}

surbyte: es una precaución que puse por consejo de un amigo y una página web que visité debido a que el Serial.available() puede tener un pequeño retardo y podría perder el orden de los caracteres que me llegan.
max_saeta: he probado tu código y no me ha funcionado, sucede lo mismo. El problema es que con cualquier programa que pruebe (el tuyo o el mío) aparenta encender el LED pero parpadea dos o tres veces y no se queda encendido por los 5 segundos que hemos puesto.

Ok,
Que Arduino tienes?, porque lo acabo de probar en un Arduino UNO, y funciona perfecto.
Estas enviando "Enviando texto" por el monitor Serial u otro soft conectado al Arduino?

Para mi es otro soft

Lo tengo en un arduino uno, yo mando "enviando texto" de mi pc (Ubuntu), pero para saber si lo recibía bien abrí el monitor serial y ahí es donde noté que únicamente con el monitor serial abierto enciende el led

Pero no explicas como "envias" desde Ubuntu el texto "enviando texto".

Como aseguras que existe una comunicación serial? es mas si abres el monitor serial mientras supuestamente estas enviando es porque no estas enviando nada, no existe la comunicación, ya que de existir una conexión serial al abrir el monitor serial te diría que el puerto esta siendo usado.

Ah ok, un programa en c que corro desde la terminal, cómo sé que hay comunicación? Porque yo también envío desde arduino a la pc y esa información sí llega, aún si abro el monitor

es extraño cuando una aplicación abre el puerto serial no debería permitir a otra aplicación abrirlo.

Prueba esto con tu programa en la PC

void setup(){
	Serial.begin(9600);
}

void loop(){
	if(Serial.available())Serial.write(Serial.read());
}

Carga este sketch y envia la cadena con tu programa y asi veras que recibe el arduino desde tu programa

max_saeta, gracias por tus respuestas tan prontas, no ha funcionado, se queda pasmado el arduiono, me parece que es por la estructura del programa de la pc, lo pongo, quizás sirva de algo:

#include "com/serial.h"
#include "com/serielinux.h"
int main()
{
HANDLE fd;
DCB OldConf;
char cad[16]="Enviando texto";
char cadbis[3]="";
int n;
fd=Open_Port("/dev/ttyACM0"); // Abre el puerto serie.
// fd=Open_Port("COM1");
OldConf=Get_Configure_Port(fd); // Guardo la configuración del puerto.
Configure_Port(fd,B9600,"8N1"); // Configuro el puerto serie.
// Bloqueante por defecto, pero también
// se puede usar:
Set_Hands_Haking(fd,3);
IO_Blocking(fd,FALSE);
n=Write_Port(fd,cad,16); // Escribo en el puerto serie.
while(cad[0]!='R'|cad[7]!='t'){
Clean_Buffer(fd);
while(Kbhit_Port(fd)<16); // Espero a leer hasta que se tengan
// 16 bytes en el buffer de entrada.
n=Read_Port(fd,cad,16);
Set_Time(fd,5000);
}
printf("%s",cad); // Leo el puerto serie.
// Muestro los datos.
//Set_Configure_Port(fd,OldConf); // Restituyo la antigua configuración
// del puerto.
Close_Port(fd); // Cierro el puerto serie.
printf("\nPresione ENTER para terminar\n");
getchar();
return 0;
}

es un programa muy básico que hace lo que se muestra en los comentarios, pero quizás haya algo en la lógica del mismo que no he podido ver y es lo que provoca este embrollo.

----CHRUNCH-----
Alli si me estrelle contra una pared, con eso no puedo hacer nada, tendrás que buscar ayuda con alguien mas porque no llego tan lejos.

Yo también tengo el mismo problema, se da con el IDE que viene en los repositorios de ubuntu. Hay que mantener abierto el monitor serial para poder comunicare con un programa externo. Con el ultimo IDE directamente indica que el puerto esta ocupado, es decir no sirve bajarse el ultimo IDE.
Al parecer es un bug. Cuando se produce un reset el bootloader espera un binario, luego de unos segundos cambia a "escuchar" el puerto serial. Al parecer esto falla en Ubuntu . Cuando se abre el monitor serial, el arduino cambia de modo y un programa externo puede interactuar con el Arduino, si se cierra se produce un reset y pierde la comunicación el programa externo. Si después de abrir el monitor serial se puentea el Pin Reset con el de 5V se evita el reseteo y se puede cerrar el monitor y el programa externo mantiene la comunicación, pero se pierde al desconectar el arduino.

Ok, de mucha ayuda tu respuesta PeterKant... al menos ya sé que no es un problema de lógica en mi programa. Gracias :slight_smile: