Se puede "Interrumpir" el envío de un Byte?

Estimados, reciban saludos desde Chile, que tengan una buena semana.

Quisiera hacerles una consulta, ojala me puedan ayudar.

Estoy desarrollando un programa que la idea es que corra en paralelo a una pista de audio. El programa, en su codigo principal envía mensajes MIDI a medida que avanza la canción. Estos mensajes MIDI se envían utilizando Serial Write y el pin Tx.

Ademas, cuando parte el programa se "setea" una frecuencia a la cual se lanzará una ISR utilizando TIMER 1. La función asociada solo cambia el estado de un LED (2 lineas: cambio de flag y digitalWrite). algo así como para indicar el tiempo de la canción (Bpm).

Mi consulta es: Que ocurre si justo al momento en que estoy enviando el Byte del mensaje MIDI se lanza la ISR? Como se desarrollan estos eventos? Se interrumpe el proceso de envío del Byte? o la ejecución de la función asociada a la interrupción espera?

Entiendo que hay un asunto de prioridades involucrados y aun a pesar de que la función de la interrupción son 2 lineas y probablemente sea muy corto el tiempo de ejecución, me interesaría saber que ocurre en esta situación y saber ademas que pasa con el mensaje MIDI que está siendo enviado.

Si quisiera evitar que el mensaje MIDI se interrumpa, quizá debería utilizar sei() o cli()?

Por su ayuda y aclaración, desde ya les agradezco!

Ante todo estudia como funcionan los paquetes MIDI y luego analiza que impacto tendrá tu ISR en el paquete.

Yo pondría a funcionar alguna medición de tiempos con micros() para ver que incidencia tiene o no en la rutina MIDI.
En teoría, la ISR (como cualquier interrupción) guarda en el stack los registros como para continuar la comunicación que sea, sin afectar el paquete MIDI pero eso deberías confirmarlo practicamente, aunque descarto que así debe ser.

Lo mejor que puedes hacer es lo que siempre se dice: una ISR debe ser rápida y si esa premisa se mantiene no tienes de que preocuparse.
No es lo suficientemente rápida, usa manejo de Puertos y no digitalWrite y tendras una signficativa mejora de tiempos.

Hola, gracias por su respuesta!

Cuando habla de paquete, se refiere a los byte que conforman cada mensaje MIDI? Eso, creo entenderlo... Lo que desconozco, es si el envío de un byte puede ser "interrumpido" por una ISR o si no es así, cual de los dos procesos espera aque el otro termine para ejecutarse.

Me da la impresión que me estoy complicando sin tener porque. Creo que el asunto aca es que aún si la transmisión del byte se interrumpe, enrealidad esta transmision queda "pausada" ya que mi función ISR no envía nada por serial. Cuando esta termine (que sera tan breve que no devería preocuparme), se retoma el envío del byte.

No tengo dispositivos midi para probar...

Seguire averiguando...muchas gracias!

Primero y para ponerte en contexto:
Nada absolutamente nada puede en enviar dato por serial durante una interrupción, por que no? Porque cualquier cosa enviada por serial involucra mucho tiempo y hace que el Arduino colapse o cualquier micro.

Asi que lo mejor antes de hablar en el aire es

  1. O te pones a analizar la librería MIDI y ves como envía los datos, o
  2. Simplemente asumes que esos datos son enviados vía 485, de modo que hablamos de una comunicación half duplex y por lo tanto sera interrumpida sin problemas.

Te agradezco por tu respuesta, no así por la forma y las palabras que utilizas. Creo que te equivocas y no respetas ni lo que dice tu firma, pues eso fue lo que hice antes de llegar acá y preguntar.

Saludos.

Por favor no prejuzgues mi redacción porque no intento burlarme ni ser irrespetuoso.
Solo es una expresión común en mi país.

Antes de hablar al aire o sin criterio (pero me refería a mi mismo), analizar las dos cosas posibles era lo que quise expresar pero repito no me refería a tu persona ni a lo que investigaste o no.

De todos modos, no opinaré mas.

Suerte.

Ahora si, en el contexto de moderador te tengo que llamar la atención y pedirte que decidas con que hilo te quedas porque has abierto dos hilos, uno en este foro en Españo y otro en el foro en inglés.
Interrupt Serial Write? - Sending MIDI
Y lo que has hecho se llama cross post y es una falta a las normas del foro, no importa el idioma debes quedarte con un solo hilo.