Читать книгу Aprender Arduino, prototipado y programación avanzada con 100 ejercicios - Rubén Beiroa Mosquera - Страница 23

014 Comunicación serie Serial.flush, Serial.availableForWrite

Оглавление

Serial.flush():

Al usar «print», «println» o «write», la transmisión de datos se realiza de forma asíncrona. Esto quiere decir que se ejecuta la siguiente instrucción sin asegurarse de que se empiece el envío de datos.

Esta cuestión se soluciona si, después de cualquiera de las tres instrucciones anteriores (print, println o write), escribimos <<Serial.flush()>>. Esta instrucción no devuelve nada, pero bloquea el programa hasta que el buffer de salida se haya vaciado, lo que significa que se han enviado todos los datos:

1.Para comprobar esto, probamos a enviar un mensaje y capturar el tiempo que tarda en ejecutarse el programa.

2.El tiempo que tardaría el programa en escribir el mensaje en el buffer de salida serían de 220 microsegundos , pero solo se han escrito en el buffer; no se han enviado.

3.Ahora haremos lo mismo pero añadiendo la instrucción <<Serial.flush()>>.

4.En este caso, el tiempo es notablemente superior, ya que se fuerza al programa a detenerse hasta que se haya enviado toda la información .

Serial.availableForWrite():

Esta instrucción devuelve el número de bytes libres en el buffer de salida; esto nos va a permitir recalcar lo que hemos visto en el punto anterior: el buffer dispone de 63 posiciones y, al ejecutar las instrucciones <<Serial.print>>, <<println>> o <<write>>, lo que se hace es escribir datos en el buffer, pero ello no significa que se hayan enviado, cosa que sí conseguimos con <<Serial.flush();>>:

1.Volvemos a enviar el mensaje anterior, pero de esta vez sin añadir <<Serial.flush()>>.

2.Si, a continuación de la instrucción <<Serial.println()>>, comprobamos el número de caracteres libres que hay en el buffer de salida, nos indica que 33 y esto es porque el mensaje que enviamos está formado por 30 caracteres, por lo que, de los 63 que puede memorizar el buffer, 30 están ocupados y 33 están libres.

3.Ahora hagamos lo mismo pero asegurándonos con la instrucciones <<Serial.flush()>> de que se vacía el buffer de salida.

4.En este caso, nos devuelve el valor 63, por lo que el buffer está completamente vacío, lo que significa que se ha enviado todo el mensaje .

Con todo esto, acabamos de analizar en profundidad el proceso de transmisión de datos por parte de un Arduino utilizando la comunicación serie. Antes de continuar con el siguiente capítulo, cabe mencionar que, en caso de querer enviar un mensaje de más de 63 caracteres, pongamos, por ejemplo, que esté formado por 90, tanto la instrucción <<Serial.print()>> como <<Serial.println()>> sí que esperan a poder escribir los 90 caracteres en el buffer.

Esto implicaría que se escribirán los 63 primeros caracteres del mensaje y, según vayan quedando espacios libres porque el buffer los transmite, la instrucción va soltando los caracteres pendientes, así hasta que suelte los 27 que le quedan pendientes y, en ese caso si, que continúa con la ejecución del programa, quedando pendientes de envío en el buffer de salida los 63 últimos caracteres del mensaje.





Aprender Arduino, prototipado y programación avanzada con 100 ejercicios

Подняться наверх