VictorJAM.zapto.org
Software 

2023-01-29

SoftwareSerial

Esta librería implementa un puerto serie vía software permitiendo poder usarse en casi cualquier pin digital; incluso es posible tener varios puertos serie a la vez.

A partir de la versión 1.0 del IDE la librería esta basada en la librería de 'Mikel Hart' NewSoftSerial.

Para usar la librería debemos incluirla:

#include <SoftwareSerial.h>

Limitaciones de la librería

La librería no es perfecta y tiene las siguientes limitaciones:

  • No se puede transmitir y recibir a la vez.
  • Si se usan múltiples puertos serie por software, solo uno podrá recibir datos.
  • En modelos como el Mega2560 en los que el microcontrolador no soporta interrupción por cambio en el puerto (port change interrupts) por lo que no se podrá usar todos los pines para el puerto serie. Lo mismo ocurre para los modelos Leonardo y Micro.
  • En los Arduino 101 la velocidad máxima de recepción es de 57600bps y tampoco trabaja con el pin 13 para recibir.
  • Si se requiere flujo de datos simultaneo se puede utilizar la librería de 'Paul Stoffregen' AltSoftLibrary

    Referencia de la librería.


    SoftwareSerial(rx, tx, i) - Es el constructor de la clase, le pasamos como parámetros los pines que usaremos para recibir (RX) y transmitir (TX). Opcionalmente podemos pasarle como parámetro un valor booleano para indicar si queremos que la lógica sea invertida.

    available() - Nos devuelve el número de bytes (o caracteres) que están en el búfer de entrada. Si no hay devolverá 0.

    begin(s) - Iniciamos el puerto serie indicando la velocidad a la que queremos que funcione.

    Las velocidades pueden ser: 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, 38400, 57600 y 115200 baudios.

    A diferencia de un puerto serie por hardware no podemos modificar el tamaño de cada formato ya que solo soporta SERIAL_8N1 ( ocho bits datos, sin paridad, y un bit de parada).

    listen - Cuando utilizamos varios objetos de la clase SoftwareSerial solo uno puede recibir en un momento dado, para ello tenemos que llamar a esta función para ponerlo en modo "escucha".

    isListening() - Con esta función sabremos si el objeto está en modo "escucha" o recibiendo, se usa junto listen

    overflow() - Indica que ha habido un desbordamiento del búfer de datos. El tamaño del búfer son 64 bytes.

    peek() - Lee un carácter del búfer de datos, pero no lo borra.

    read() - Lee un carácter del búfer de datos y lo borra.

    print - Imprime por el puerto serie, funciona igual que si fuera un objeto hardware.

    println - Lo mismo que print

    pero añade al final CR y LF.
    Recuerda que CR y LF son los valores 0x0D y 0x0A y en C se representa como '\r' y '\n'.

    write - Escribe un byte, es decir, envía un byte por el puerto serie.

    Al igual que las función print también van a funcionar las funciones readString y readStringUntil.

    Observaciones

    Si queremos simular un puerto serie software en Proteus hemos de tener en cuenta que no va a funcionar en un simulino o similar. Debemos usar el chip atMega correspondiente para que funcione correctamente.

    Cuando utilizamos lógica inversa, entonces todo se interpreta al revés:

    • El bus estará en estado inactivo con un valor LOW en vez HIGH.
    • El bit de inicio será LOW.
    • El bit de parada será HIGH.
    • En el byte de datos los valores 0 y 1 del valor estará invertido.

    Ejemplo:

    Esto puede resultar útil en la que queramos utilizar el puerto serie de manera opto aislada y utilizar la salida del Arduino como SOURCING en vez de SINKING

    Referencias.

    Referencia Arduino.

    Librería AltSoftSerial.