Arduino se cuelga si cierro el monitor serie

Hola amigos.

Pues eso. Tengo un sketch en el que realizo unos cálculos y envío el resultado por usb al pc.
Lo monitorizo con el monitor de puerto serie de la IDE.
Todo va chachi piruli mientras tengo abierta la ventana del monitor serie.
Cuando cierro la ventana el pin tx parpadea pero deja de hacerlo a los pocos segundos.
Si vuelvo a abrir el monitor serie no recibo nada y tengo que resetear el Arduino.

¿Donde puede estar el problema?

¿Se puede conectar y desconectar la conexión serie "en caliente"?

¿Puedo tener a Arduino realizando un trabajo, conectarme a él, comunicarme y desconectarme sin que deje de operar?

Muchas gracias.

no se muy bien el por qué, pero cada vez que conectas el monitor del puerto serie es como si hicieras un reset al arduino. Por elemplo si corres un sketch que cada segundo envíe por el puerto serie los segundos que lleva funcionando el programa, cada vez que actives la monitorización de puerto serie, el arduino va a empezar en 1,2,3...
el por qué lo hace no tengo ni idea, pero es una realidad.
Yo tengo un programa que graba datos en una SD y cada vez que monitorizo por el puerto serie para ver si está funcionando, me crea un archivo nuevo.

Podrias colgar el código?
Prueba de poner un delay de 50 milisegundos antes de imprimir datos en el monitor.

pongo un ejemplo simple. un segundero que empieza en cero y sique uno, dos,...
cada vez que se abre el monitor serie se reinicia y empieza en cero.

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

void loop() {
  delay(50);
  Serial.println(numero);
  delay(1000);
  numero++;
}

el delay de 50mseg no tiene ningún efecto

@pacojarcia: eso de usar variables sin inicializar... suerte que por defecto se inicializan a 0, pero puede ser una fuente de bugs importante y puede confundir bastante si otra persona intenta entender el código.

El Arduino se resetea siempre que se abre o cierra una consola debido a que es la manera en la que se hace el auto-reset para subir el código.

Prueba este código:

int numero;
void setup() {
  Serial.begin(9600);
  numero=0;
 }

void loop() {

  Serial.println(numero);
  delay(1000);
  numero=numero++;
}

A mi no se me cuelga

Chiva... supongamos este caso:

Tengo un arduino ejecutando código y alimentado por jack (nada de usb)
Una de las funciones es responder a comandos enviados por puerto serie (si le llegan)
Llego con otro arduino sin atmega y les conecto los pines 0, 1 y GND
Abro la consola de la IDE de Arduino y le mando comandos

¿se resetea el arduino inicial?
Si así fuese ¿Como puedo conectarme a un arduino "en caliente"? ¿y desconectarme también "en caliente"?

Un saludo a todos

Mientras no conectes la línea DTR, que es la que resetea el Arduino, no pasa nada con el resto, TX, RX, GND, etc.

Briconsejo: para no tener que quitar el chip, puedes puentear reset y gnd

Gracias por el apunte Chiva.

Mi idea es hacerme con un cable FTDI y usarlo como un cable programador al estilo Siemens, Omron, etc..

Estoy utilizando la librería Messenger y he creado una interfaz por consola para configurar parámetros.

Un saludo.

Hola,

No necesitas llegar con otro cable FTDI u otra placa sin micro.... Puedes conectarte directamente por el USB de la placa y deshabilitar que se haga un "reset" al abrir el puerto.
Desde las versiones Duemilanove (??-> no estoy seguro exactamente desde cuando) existe un puente en la placa que lo puedes quitar en tu disenyo final o bien el metodo de poner una resistencia de 110 ohm entre 5V y Reset.

Automatic (Software) Reset
Rather than requiring a physical press of the reset button before an upload, the Arduino Uno is designed in a way that allows it to be reset by software running on a connected computer. One of the hardware flow control lines (DTR) of the ATmega8U2 is connected to the reset line of the ATmega328 via a 100 nanofarad capacitor. When this line is asserted (taken low), the reset line drops long enough to reset the chip. The Arduino software uses this capability to allow you to upload code by simply pressing the upload button in the Arduino environment. This means that the bootloader can have a shorter timeout, as the lowering of DTR can be well-coordinated with the start of the upload.
This setup has other implications. When the Uno is connected to either a computer running Mac OS X or Linux, it resets each time a connection is made to it from software (via USB). For the following half-second or so, the bootloader is running on the Uno. While it is programmed to ignore malformed data (i.e. anything besides an upload of new code), it will intercept the first few bytes of data sent to the board after a connection is opened. If a sketch running on the board receives one-time configuration or other data when it first starts, make sure that the software with which it communicates waits a second after opening the connection and before sending this data.

The Uno contains a trace that can be cut to disable the auto-reset. The pads on either side of the trace can be soldered together to re-enable it. It's labeled "RESET-EN". You may also be able to disable the auto-reset by connecting a 110 ohm resistor from 5V to the reset line; see this forum thread for details.

Salu2 :wink:

Igor R.

Toma castaña. Va de perlas.

Muchas gracias.

Lo de cortar la pista no lo haría, por que si no cuando vayas a programar el arduino te vas a reir, pero lo de la resistencia de 110Ohm no lo sabía y puede venir bien.

Bueno, si cortas la pista, tienes que dar al boton de reset y seguido darle a mandar el programa. Es un coñazo, pero se supone que es para una aplicación final que no vas a estar todo el rato programando.

Aunque como bien dices, pudiendo hacer lo de la resistencia, te quitas de lios.

:wink:

Gracias por todas las aclaraciones. Yo últimamente para monitorizar el estatus usaba una pantalla LCD en vez del puerto serie por eso de los reinicios de la placa.