Biblioteca Software Serial

El hardware Arduino ha incorporado soporte para la comunicación serie en los pines 0 y 1 (que también va al ordenadora través de la conexión USB). El soporte nativo serie pasa a través de un componente de hardware (integrado en el chip) llamado UART. Este hardware permite el chip ATmega recibir la comunicación serie incluso mientras trabaja en otras tareas, siempre que haya espacio en la memoria intermedia serie de 64 bytes.

La biblioteca SoftwareSerial ha sido desarrollada para permitir la comunicación serie en otros pines digitales del Arduino, usando el software para replicar la funcionalidad (de ahí el nombre de "SoftwareSerial"). Es posible tener múltiples puertos  serie de programas con velocidades de hasta 115200 bps. Un parámetro permite la señalización invertida para dispositivos que requieren ese protocolo.La versión de SoftwareSerial incluido en la versión 1,0 y posteriores se basa en la biblioteca NewSoftSerial escrita por Mikal Hart.

Limitaciones

La biblioteca tiene las siguientes limitaciones conocidas:

  • Si se usa con  puertos serie de programas múltiples, sólo uno puede recibir datos a la vez.
  • No todos los pines en las placas Mega y Mega 2560 soportan nterrupciones de cambio de nivel, por lo que solamente los siguientes se pueden utilizar para RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 ( 63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
  • No todos los pines de las placas Leonardo y Micro soportan interrupciones de cambio de nivel, así que solamente los siguientes se pueden utilizar para RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
  • En Arduino o Genuino 101 la velocidad máxima actual de RX es de 57600bps
  • En Arduino o Genuino 101 RX no funciona en el pin 13
  • Si su proyecto requiere flujos de datos simultáneos, consulte la biblioteca AltSoftSerial de Pablo Stoffregen. AltSoftSerial supera una serie de problemas con el núcleo SoftwareSerial, pero tiene sus propias limitaciones. Consulte el sitio AltSoftSerial para más información.

FUNCIONES

SoftwareSerial(rxPin, txPin, inverse_logic)

Descripción:
SoftwareSerial se utiliza para crear una instancia de un objeto SoftwareSerial, cuyo nombre es necesario proporcionar al igual que en el ejemplo siguiente. El argumento inverse_logic es opcional y por defecto es false. Véase más abajo para más detalles acerca de lo que hace. Con SoftwareSerial pueden ser creados objetos múltiples, sin embargo, sólo uno puede estar activo en un momento dado.Es necesario llamar a SoftwareSerial.begin () para permitir la comunicación.

Parámetros:
rxPin: el pin en que se desea recibir datos serie
TxPin: el pin en el que se transmiten los datos
serieinverse_logic: se utiliza para invertir el sentido de los bits entrantes (el valor por defecto es de lógica normal). Si se activa, SoftwareSerial pone un nivel LOW (0 voltios) en el pin Rx como 1 bit (estado de reposo) y un nivel HIGH (5 voltios) como 0 bits. También afecta a la forma en que se escribe en el pin Tx. El valor por defecto es false.

Advertencia: No se debe conectar dispositivos en los que los datos de salida serie estén fuera del rango que el Arduino puede manejar, normalmente de 0 V a 5 V, para una placa alimentada a 5 V y 0 V a 3,3 V para una placa que funciones a 3,3 V.

Ejemplo:
#include <SoftwareSerial.h>

 const byte rxPin = 2;
 const byte txPin = 3;

 // configura un nuevo objeto serie
 SoftwareSerial mySerial (rxPin, txPin);
  ________________________________________________________________________________

available()

Descripción:
Obtiene el número de bytes (caracteres) disponibles para la lectura de un puerto serie software. Se trata de datos que ya llegaron y se almacenan en la memoria intermedia de recepción serie.

Sintaxis:
mySerial.available()

Parámetros:
Ninguno

Retornos:
El número de bytes disponibles para leer.
________________________________________________________________________

begin()

Descripción:
Configura la velocidad (baudios) para la comunicación serie. Las velocidades de transmisión admitidas son 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, 38400, 57600 y 115200.

Parámetros:
speed: la velocidad de transmisión (long)

Retornos:
Ninguno

Ejemplo:
// incluye la biblioteca SoftwareSerial para poder usar estas funciones:
 #include <SoftwareSerial.h>

 #define rxPin 10
 #define txPin 11

 // configura un nuevo puerto serie
 SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

 void setup()  {
   // defines los modos de pin para tx, rx:
   pinMode(rxPin, INPUT);
   pinMode(txPin, OUTPUT);
   // configura la velocidad de datos del puerto SoftwareSerial
   mySerial.begin(9600);
 }

 void loop() {
   // ...
 }
________________________________________________________________________

isListening()

Descripción:
Prueba para ver si el puerto serie software solicitado está escuchando activamente.

Sintaxis:
mySerial.isListening()

Parámetros:
Ninguno

Retornos:
boolean

Ejemplo:
#include <SoftwareSerial.h>

 // software serial : TX = pin digital 10, RX = pin digital 11
 SoftwareSerial portOne(10,11);

 void setup()
 {
   // Inicia el puerto serie hardware
   Serial.begin(9600);

   // Inicia el puerto serie software
   portOne.begin(9600);
 }

 void loop()
 {
   if (portOne.isListening()) {
    Serial.println("El puerto Uno esta a la escucha!");
 }
________________________________________________________________________

overflow()

Descripción:
Prueba para ver si se ha producido un desbordamiento de la memoria intermedia serie de software. La llamada a esta función borra la bandera de desbordamiento, lo que significa que las llamadas posteriores retornarán false a no ser que otro byte de datos se haya recibido y se descarte mientras tato.

El buffer serie del software puede contener 64 bytes.

Sintaxis:
mySerial.overflow()

Parámetros:
Ninguno

Retornos:
boolean

Ejemplo:
#include <SoftwareSerial.h>

 // software serial : TX = pin digital 10, RX = pin digital 11
 SoftwareSerial portOne(10,11);

 void setup()
 {
   // Inicia el puerto serie hardware
   Serial.begin(9600);

   // Inicia el puerto serie software
   portOne.begin(9600);
 }

 void loop()
 {
   if (portOne.overflow()) {
    Serial.println("Desbordamiento de SoftwareSerial!");
 }
  ________________________________________________________________________________

peek()

Descripción:
Devuelve un carácter que se recibió el pin RX del puerto serie de software. A diferencia de read(), sin embargo, las posteriores llamadas a esta función devolverán el mismo carácter.

Tenga en cuenta que sólo una instancia SoftwareSerial puede recibir datos entrantes a la vez (seleccione uno de ellos con la función listen ()).

Parámetros:
Ninguno

Retornos:
el carácter leído, o -1 si no hay disponibles

Ejemplo:
SoftwareSerial mySerial(10,11);

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

 void loop()
 {
   char c = mySerial.peek();
 }
________________________________________________________________________

read()

Descripción:
Devuelve un carácter que se recibió el pin RX del puerto serie de software. 

Tenga en cuenta que sólo una instancia SoftwareSerial puede recibir datos entrantes a la vez (seleccione uno de ellos con la función listen ()).

Parámetros:
Ninguno

Retornos:
el carácter leído, o -1 si no hay disponibles

Ejemplo:
SoftwareSerial mySerial(10,11);

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

 void loop()
 {
   char c = mySerial.read();
 }
_________________________________________________________________________________

print(data)

Descripción:
Imprime datos al pin de transmisión del puerto serie software. Funciona igual que la función Serial.print ().

Parámetros:
varian, consulte Serial.print () para más detalles

Retornos:
byte

print () devolverá el número de bytes escritos, la lectura de ese número es opcional

Ejemplo:

SoftwareSerial serial(10,11);
int analogValue;

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

void loop()
{
  // lee la entrada analogica del pin A0:
  analogValue = analogRead(A0);

  // imprime en cualquiera de los formatos:
  serial.print(analogValue);         // imprime como un ASCII-codificado decimal
  serial.print("\t");                // imprime un caracter tab
  serial.print(analogValue, DEC);    // imprime como un ASCII-codificado decimal
  serial.print("\t");                // imprime un caracter tab
  serial.print(analogValue, HEX);    // imprime como un ASCII-codificado hexadecimal
  serial.print("\t");                // imprime un caracter tab
  serial.print(analogValue, OCT);    // imprime como un ASCII-codificado octal
  serial.print("\t");                // imprime un caracter tab
  serial.print(analogValue, BIN);    // imprime como un ASCII-codificado binary
  serial.print("\t");                // imprime un caracter tab
  serial.print(analogValue/4, BYTE); // imprime como un valor byte en bruto (divide el
                                     // valor por 4 porque analogRead() devuelve numeros
                                     // de 0 a 1023, pero un byte solo puede soportar valores
                                     // de hasta 255)
  serial.print("\t");                // imprime un caracter tab   
  serial.println();                  // imprime un caracter de retorno de linea

  // espera 10 millisegundos antes de la siguiente lectura:
  delay(10);
}
_________________________________________________________________________________

println(data)

Descripción:
Imprime datos al pin de transmisión del puerto serie software. Funciona igual que la función Serial.println ().

Parámetros:
varian, consulte Serial.println () para más detalles

Retornos:
byte

println () devolverá el número de bytes escritos, la lectura de ese número es opcional

Ejemplo:


SoftwareSerial serial(10,11);
int analogValue;

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

void loop()
{
  // lee la entrada analogica del pin A0:
  analogValue = analogRead(A0);

  // imprime en cualquiera de los formatos:
  serial.print(analogValue);         // imprime como un ASCII-codificado decimal
  serial.print("\t");                // imprime un caracter tab
  serial.print(analogValue, DEC);    // imprime como un ASCII-codificado decimal
  serial.print("\t");                // imprime un caracter tab
  serial.print(analogValue, HEX);    // imprime como un ASCII-codificado hexadecimal
  serial.print("\t");                // imprime un caracter tab
  serial.print(analogValue, OCT);    // imprime como un ASCII-codificado octal
  serial.print("\t");                // imprime un caracter tab
  serial.print(analogValue, BIN);    // imprime como un ASCII-codificado binary
  serial.print("\t");                // imprime un caracter tab
  serial.print(analogValue/4, BYTE); // imprime como un valor byte en bruto (divide el
                                     // valor por 4 porque analogRead() devuelve numeros
                                     // de 0 a 1023, pero un byte solo puede soportar valores
                                     // de hasta 255)
  serial.print("\t");                // imprime un caracter tab   
  serial.println();                  // imprime un caracter de retorno de linea

  // espera 10 millisegundos antes de la siguiente lectura:
  delay(10);
}


listen()

Descripción:
Permite al puerto serie software seleccionado escuchar. Sólo un software de puerto serie puede escuchar a la vez; los datos que llegan de otros puertos serán descartados. Cualquier dato recibido se descarta ya durante la llamada a listen () (a menos que la instancia dad ya esté a la escucha).

Sintaxis:
mySerial.listen()

Parámetros:
mySerial: el nombre de la instancia a escuchar

Retornos:
Ninguno

Ejemplo:

#include <SoftwareSerial.h>

// software serial : TX = pin digital 10, RX = pin digital 11
SoftwareSerial portOne(10, 11);

// software serial : TX = pin digital 8, RX = pin digital 9
SoftwareSerial portTwo(8, 9);

void setup()
{
  // Inicia el puerto serie hardware
  Serial.begin(9600);

  // Inicia ambos puertos software
  portOne.begin(9600);
  portTwo.begin(9600);

}

void loop()
{
  portOne.listen();

  if (portOne.isListening()) {
   Serial.println("Puerto Uno a la escucha!"); 
}else{
   Serial.println("Puero Uno no esta a la escucha!"); 
}

  if (portTwo.isListening()) {
   Serial.println("Puerto Dos a la escucha!"); 
}else{
   Serial.println("Puero Dos no esta a la escucha!"); 
}

}
__________________________________________________________________________________

write(data)

Descripción:
Imprime datos al pin de transmisión del puerto serie software como bytes en bruto. Funciona igual que la función Serial.write ()

Parámetros:
Ver Serial.write () para detalles

Retornos:
byte

write() devolverá el número de bytes escritos, la lectura de ese número es opcional

Ejemplo:
SoftwareSerial mySerial(10, 11);

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

 void loop()
 {
   mySerial.write(45); // envia un byte con el valor 45

    int bytesSent = mySerial.write(“Hola”); //envia la cadena “Hola” y devuelve la longitud de la cadena.
 }
  

EJEMPLOS

Software Serial ExampleUtilice esta biblioteca ... porque a veces un puerto serie no es suficiente!
Two Port ReceiveTrabaja con múltiples puertos de serie de programas.


10 comentarios:

  1. Se puede usar con pines analogicos en el arduino UNO?

    ResponderEliminar
    Respuestas
    1. En Arduino UNO los pines analogos A0~A5 se comportan como digitales 14~19.

      Eliminar
  2. Como hacemos si queremos inicializar el puerto serie en 4800 baudios, 7 bit de datos, paridad par y 2 bit de stop,

    Serial.begin(4800,7E2) No me funciona.
    Gracias

    ResponderEliminar
  3. FUNCIONES DE BIBLIOTECA VISUAL

    https://sites.google.com/site/softwareescuela/

    Utilizar el programa en varios equipos en red (Uno con la base de datos y varios ejecutables en diferentes equipos)
    si lo desea puede hacer que los equipos que no tienen la base de datos sean de solo lectura
    Utilizar contraseña si el usuario lo desea, activarla, desactivarla y cambiarla

    Utilizar lector de código de barras en el campo inventario o ISBN

    Utiliza una sola rejilla de resultados en una sola ventana solo cambian los datos dependiendo de la consulta que
    puede ser en cinco tablas ( Existencia, Prestados, Vendidos, Historial y Usuarios ) o consulta en todas las tablas
    ( La tabla actual se muestra en el titulo del programa )

    Las búsquedas pueden ser en cualquier campo, en diferentes tablas, en todas las tablas, y entre un intervalo de
    tiempos ( Principio a Fin )

    Ver los totales de cantidades y precios al ejecutar las consultas

    Agregar el registro seleccionado a prestados o a vendidos, al borrar estos registros de prestados o vendidos se
    pasan directamente a la tabla historial, también se pueden borrar del historial

    Mostrar todos los registros de una tabla con un solo botón ( Mostrar todos )

    Agregar registros a la tabla Existencia y Usuarios desde un solo botón ( Agregar registro ) o desde Internet a la
    tabla existencia

    Agregar una imagen a cada registro al agregar registros o automáticamente desde Internet

    Editar el registro seleccionado directamente o con el botón ( Editar seleccionado )

    Borrar el registro seleccionado desde el botón ( Borrar registro )

    Agregar o editar la imagen del registro desde el botón ( Seleccionar imagen )

    Ver la imagen en tamaño completo desde la imagen del registro seleccionado

    Imprimir Nota de venta y cualquier consulta realizada

    Traspasar cualquier consulta a Excel

    Configurar el programa al gusto ( Nota de venta, Colores, textos, objetos, imágenes etc. )

    Ver la ayuda en vídeos en línea

    Ordenar los registros por cualquier campo

    Cambiarse de tabla en el menú tabla a ( Existencia, Prestados, Vendidos, Historial y Usuarios )

    Cambiar el nombre de lugar a todos los registros con ese nombre de lugar en la tabla Existencia

    Buscar registros con cualquier texto en el titulo

    Si el registro guardado tiene contenido digital en línea url "Uniform Resource Locator" se puede acceder a ella
    seleccionando el registro, buscar en, ir a url de registro y abrirá su explorador con la url del registro seleccionado

    Agregar registros desde internet desde el botón ( Agregar desde internet )

    Respaldar tabla existencia y archivo mdb en Google Drive

    Envía mensajes por correo a los usuarios registrados, usuarios con ventas o usuarios con prestamos.
    descarga:
    https://sites.google.com/site/softwareescuela/

    ResponderEliminar
  4. Hola Manuel, me gustaría que me comentaras la siguiente estructura que he encontrado en un programa y no la encuentro en ninguna biblioteca y es la siguiente:
    String GetLine() // esto es lo que no entiendo "String" funcionando con un "void"
    { String S = "" ;
    if (Serial.available())
    { char c = Serial.read(); ;
    while ( c != '\n') //Hasta que el caracter sea intro
    { S = S + c ;
    delay(25) ;
    c = Serial.read();
    }
    return( S + '\n') ;
    }
    }

    Muchas gracias de antemano.

    ResponderEliminar
  5. para arduino UNO se explica cuales pines pueden trabajar como RX, pero hay pines definidos para usar como TX?

    ResponderEliminar
  6. se puede usar esta libreria en un arduino nano? que pines se pueden usar?

    ResponderEliminar
  7. tus códigos no valen verga deberes pensar en dedicarte a otra cosa perrra

    ResponderEliminar
  8. gracias por su compromiso, compartir y sus buenos aportes.

    ResponderEliminar