Diferencia entre revisiones de «SoftwareSerial»
(→Descripción) |
(→Referencias externas) |
||
(No se muestran 21 ediciones intermedias del mismo usuario) | |||
Línea 1: | Línea 1: | ||
== Descripción == | == Descripción == | ||
La librería [https://github.com/PaulStoffregen/SoftwareSerial SoftwareSerial.h] de Paul Stoffregen no esta en el Administrador de librerias del IDE. | La librería [https://github.com/PaulStoffregen/SoftwareSerial SoftwareSerial.h] de Paul Stoffregen no esta en el Administrador de librerias del IDE. | ||
+ | |||
+ | El hardware Arduino tiene soporte incorporado (via un chip UART) para la comunicación en serie en los pines 0 y 1, pero estos pines también van al conector USB por donde se cargan los [[boceto]]s por lo que es delicado usarlos. El búfer en serie de 64 bytes. | ||
+ | |||
+ | Esta libreria permitir la comunicación en serie por otros pines digitales del Arduino, usando un software para replicar la misma funcionalidad. Es posible tener múltiples puertos serie de software con velocidades de hasta 115200 bps. Un parámetro habilita la señalización invertida para dispositivos que requieren ese protocolo. | ||
== Placas aplicables == | == Placas aplicables == | ||
+ | [[UNO]], [[NANO]]... | ||
== Sintaxis == | == Sintaxis == | ||
<pre> | <pre> | ||
#include <SoftwareSerial.h> | #include <SoftwareSerial.h> | ||
− | SoftwareSerial | + | SoftwareSerial nombreT(2,3); //Rx,Tx |
</pre> | </pre> | ||
+ | |||
+ | == Parámetros == | ||
+ | ;nombre:Nombre que le asignaras al nuevo puerto serie. | ||
+ | ;Rx:Pin digtal para Recibir datos | ||
+ | ;Tx:Pin digtal para Transmitar datos | ||
== Métodos == | == Métodos == | ||
+ | {| class="wikitable" | ||
+ | |+Metodos disponible con SoftwareSerial.h | ||
+ | |- | ||
+ | ! Método !! Descripción | ||
+ | |- | ||
+ | | [[Serial.begin()|begin()]] || Abre el puerto serie, fija su configuración y velocidad de comunicación. | ||
+ | |- | ||
+ | | [[Serial.available()|available()]] || Indica el numero de bytes/caracteres disponibles para lectura. | ||
+ | |- | ||
+ | | [[Serial.read()|read()]] || Lee un carácter disponible y lo borra del buffer. | ||
+ | |- | ||
+ | | [[Serial.peek()|peek()]] || Lee un carácter disponible pero queda disponible en el buffer (no borra). | ||
+ | |- | ||
+ | | [[Serial.write()|write()]] || Envia datos binarios al puerto serie. | ||
+ | |- | ||
+ | | [[Serial.flush()|flush()]] || Espera a que la transmisión de datos de salida serie termine. | ||
+ | |- | ||
+ | | [[Serial.print()|print()]] || Imprime una representación textual de un dato. | ||
+ | |- | ||
+ | | [[Serial.println()|println()]] || Imprime una representación textual de un dato junto con un salto de línea; o solo este último. | ||
+ | |- | ||
+ | | [[Serial.overflow()|overflow()]] || Pruebas para ver si se ha producido un desbordamiento de búfer serie de software. Al llamar a esta función, se borra el indicador de desbordamiento, lo que significa que las llamadas posteriores devolverán el valor falso a menos que se haya recibido y descartado otro byte de datos mientras tanto. El búfer serial del software puede contener 64 bytes. | ||
+ | |- | ||
+ | | listen() || Habilita el puerto serie del software seleccionado para escuchar. Solo un puerto serie de software puede escuchar a la vez; Los datos que lleguen a otros puertos serán descartados. Cualquier dato ya recibido se descarta durante la llamada a listen() (a menos que la instancia dada ya esté escuchando). Devuelve un [[bool]] | ||
+ | |- | ||
+ | | isListening() || Pruebas para ver si el puerto serie del software solicitado está escuchando activamente. Devuelve un [[bool]] | ||
+ | |- | ||
+ | | [[Serial.end()|end()]] || Desactiva la comunicacion. Para reactivar usar begin() nuevamente. | ||
+ | |} | ||
− | == | + | {{Tip|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()).}} |
+ | |||
+ | == Limitaciones == | ||
+ | La librería tiene las siguientes limitaciones conocidas: | ||
+ | |||
+ | # Si utiliza varios puertos serie de software, solo uno puede recibir datos a la vez. | ||
+ | # No todos los pines del [[MEGA]] admiten interrupciones, por lo que solo se puede usar lo siguiente 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 del [[LEONARDO]] admiten interrupciones, por lo que solo se puede usar lo siguiente para RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI). | ||
+ | # En Arduino o Genuino 101, la velocidad máxima de RX actual es 57600 bps | ||
+ | # En Arduino o Genuino 101 RX no funciona en Pin 13 | ||
+ | |||
+ | {{Nota|Si su proyecto requiere flujos de datos simultáneos, consulte la biblioteca [https://github.com/PaulStoffregen/AltSoftSerial AltSoftSerial] de Paul Stoffregen, que supera una serie de problemas con el SoftwareSerial, pero tiene sus propias limitaciones.}} | ||
== Advertencias == | == Advertencias == | ||
+ | * Siempre prefiera el '''hardware serial''' tiene mucho mejor rendimiento. Arduino [[MEGA]] tiene 3 disponibles. | ||
+ | * AltSoftSerial puede transmitir y recibir simultanemanete. Consume un temporizador de 16 bits, deshabilita algunos pines PWM. | ||
+ | * SoftwareSerial puede tener varias instancias en casi cualquier pin, pero solo 1 puede estar activo a la vez. Tampoco se puede transmitir y recibir al mismo tiempo | ||
== Ejemplo 1 == | == Ejemplo 1 == | ||
+ | En este ejemplo lo que se reciba por un puesto serie se envía por el otro. | ||
+ | |||
+ | <syntaxhighlight lang="c++"> | ||
+ | #include <SoftwareSerial.h> | ||
+ | SoftwareSerial miSerial(10, 11); //Rx, Tx | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(57600); | ||
+ | miSerial.begin(4800); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | if (miSerial.available()) { | ||
+ | Serial.write(miSerial.read()); | ||
+ | } | ||
+ | if (Serial.available()) { | ||
+ | miSerial.write(Serial.read()); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Ejemplo 2 == | ||
+ | Aqui un ejemplo de implementacion de bluetooth. | ||
+ | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <SoftwareSerial.h> | #include <SoftwareSerial.h> | ||
Línea 51: | Línea 128: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | == Ejemplo | + | == Ejemplo 3 == |
+ | Otro ejemplo con el bluetooth. | ||
+ | |||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <SoftwareSerial.h> | #include <SoftwareSerial.h> | ||
Línea 94: | Línea 173: | ||
BT.print(cadena); | BT.print(cadena); | ||
Serial.println("---> " + cadena); | Serial.println("---> " + cadena); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == Ejemplo 4 == | ||
+ | Comunicar 2 Arduino UNO por bluetooth. El Maestro tiene un pulsador en pin 9 y cuando se pulse se debe conmutar el LED incorporado en el esclavo. Recuerda que ambos deben usar la misma velocidad (AT+BAUD4) y contraseña (AT+PIN123). | ||
+ | |||
+ | Maestro: | ||
+ | <syntaxhighlight lang="c++"> | ||
+ | #include <SoftwareSerial.h> | ||
+ | #include <Bounce2.h> | ||
+ | SoftwareSerial BT(2,3); //RX,TX | ||
+ | Bounce rebote = Bounce(); | ||
+ | |||
+ | void setup(){ | ||
+ | BT.begin(9600); | ||
+ | pinMode(9, INPUT_PULLUP); | ||
+ | rebote.attach(9); | ||
+ | rebote.interval(5); | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | rebote.update(); | ||
+ | if (rebote.fell()){ | ||
+ | BT.print("1"); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Esclavo: | ||
+ | <syntaxhighlight lang="c++"> | ||
+ | #include <SoftwareSerial.h> | ||
+ | SoftwareSerial BT(2,3); //RX,TX | ||
+ | |||
+ | void setup(){ | ||
+ | BT.begin(9600); | ||
+ | pinMode(13, OUTPUT); | ||
+ | } | ||
+ | |||
+ | void loop(){ | ||
+ | if (BT.available()){ | ||
+ | char x = BT.read(); | ||
+ | if (x 1){ | ||
+ | digitalWrite(13, !digitalRead(13)); | ||
+ | } | ||
} | } | ||
} | } | ||
Línea 103: | Línea 227: | ||
== Referencias externas == | == Referencias externas == | ||
* [https://www.arduinolibraries.info/libraries All Libraries] | * [https://www.arduinolibraries.info/libraries All Libraries] | ||
+ | * [https://www.arduino.cc/en/Reference/SoftwareSerial SoftwareSerial] | ||
+ | * [https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html AltSoftSerial] de Paul Stoffregen | ||
+ | * [http://manueldelgadocrespo.blogspot.com/p/biblioteca.html Software Serial] - Manuel Delgado | ||
+ | * [https://aprendiendoarduino.wordpress.com/tag/hc-05/ HC-05] - Enrique Crespo | ||
+ | * [https://naylampmechatronics.com/blog/24_configuracion-del-modulo-bluetooth-hc-05-usa.html HC-05] - Naylamp | ||
+ | * [http://www.prometec.net/bt-hc06/ HC-06] - Prometec | ||
+ | * [http://www.prometec.net/bt-hc05/ HC-05] - Prometec | ||
+ | * [http://www.prometec.net/bluetooth-le/ BLE] - Prometec | ||
+ | * [http://www.prometec.net/pc-bt/ PC BT] - Prometec | ||
+ | * [http://www.prometec.net/android-bt/ Android BT] - Prometec | ||
+ | * [http://diymakers.es/arduino-bluetooth/ Arduino Bluetooth] - DiyMarkers | ||
[[Category:Librerias]] | [[Category:Librerias]] |
Revisión actual del 16:27 4 jul 2019
Contenido
Descripción
La librería SoftwareSerial.h de Paul Stoffregen no esta en el Administrador de librerias del IDE.
El hardware Arduino tiene soporte incorporado (via un chip UART) para la comunicación en serie en los pines 0 y 1, pero estos pines también van al conector USB por donde se cargan los bocetos por lo que es delicado usarlos. El búfer en serie de 64 bytes.
Esta libreria permitir la comunicación en serie por otros pines digitales del Arduino, usando un software para replicar la misma funcionalidad. Es posible tener múltiples puertos serie de software con velocidades de hasta 115200 bps. Un parámetro habilita la señalización invertida para dispositivos que requieren ese protocolo.
Placas aplicables
Sintaxis
#include <SoftwareSerial.h> SoftwareSerial nombreT(2,3); //Rx,Tx
Parámetros
- nombre
- Nombre que le asignaras al nuevo puerto serie.
- Rx
- Pin digtal para Recibir datos
- Tx
- Pin digtal para Transmitar datos
Métodos
Método | Descripción |
---|---|
begin() | Abre el puerto serie, fija su configuración y velocidad de comunicación. |
available() | Indica el numero de bytes/caracteres disponibles para lectura. |
read() | Lee un carácter disponible y lo borra del buffer. |
peek() | Lee un carácter disponible pero queda disponible en el buffer (no borra). |
write() | Envia datos binarios al puerto serie. |
flush() | Espera a que la transmisión de datos de salida serie termine. |
print() | Imprime una representación textual de un dato. |
println() | Imprime una representación textual de un dato junto con un salto de línea; o solo este último. |
overflow() | Pruebas para ver si se ha producido un desbordamiento de búfer serie de software. Al llamar a esta función, se borra el indicador de desbordamiento, lo que significa que las llamadas posteriores devolverán el valor falso a menos que se haya recibido y descartado otro byte de datos mientras tanto. El búfer serial del software puede contener 64 bytes. |
listen() | Habilita el puerto serie del software seleccionado para escuchar. Solo un puerto serie de software puede escuchar a la vez; Los datos que lleguen a otros puertos serán descartados. Cualquier dato ya recibido se descarta durante la llamada a listen() (a menos que la instancia dada ya esté escuchando). Devuelve un bool |
isListening() | Pruebas para ver si el puerto serie del software solicitado está escuchando activamente. Devuelve un bool |
end() | Desactiva la comunicacion. Para reactivar usar begin() nuevamente. |
Tip: 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()).
Limitaciones
La librería tiene las siguientes limitaciones conocidas:
- Si utiliza varios puertos serie de software, solo uno puede recibir datos a la vez.
- No todos los pines del MEGA admiten interrupciones, por lo que solo se puede usar lo siguiente 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 del LEONARDO admiten interrupciones, por lo que solo se puede usar lo siguiente para RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
- En Arduino o Genuino 101, la velocidad máxima de RX actual es 57600 bps
- En Arduino o Genuino 101 RX no funciona en Pin 13
Nota: Si su proyecto requiere flujos de datos simultáneos, consulte la biblioteca AltSoftSerial de Paul Stoffregen, que supera una serie de problemas con el SoftwareSerial, pero tiene sus propias limitaciones.
Advertencias
- Siempre prefiera el hardware serial tiene mucho mejor rendimiento. Arduino MEGA tiene 3 disponibles.
- AltSoftSerial puede transmitir y recibir simultanemanete. Consume un temporizador de 16 bits, deshabilita algunos pines PWM.
- SoftwareSerial puede tener varias instancias en casi cualquier pin, pero solo 1 puede estar activo a la vez. Tampoco se puede transmitir y recibir al mismo tiempo
Ejemplo 1
En este ejemplo lo que se reciba por un puesto serie se envía por el otro.
#include <SoftwareSerial.h>
SoftwareSerial miSerial(10, 11); //Rx, Tx
void setup() {
Serial.begin(57600);
miSerial.begin(4800);
}
void loop() {
if (miSerial.available()) {
Serial.write(miSerial.read());
}
if (Serial.available()) {
miSerial.write(Serial.read());
}
}
Ejemplo 2
Aqui un ejemplo de implementacion de bluetooth.
#include <SoftwareSerial.h>
SoftwareSerial BT(2,3); //RX,TX
void setup() {
Serial.begin(115200);
//pinMode(4, OUTPUT); //Pin Vcc del HC-05 (On/Off)
//pinMode(5, OUTPUT); //Pin KEY del HC-05 (HIGH = AT)
//digitalWrite(5, HIGH);
//delay(500);
//digitalWrite(4, HIGH);
BT.begin(9600);
Serial.println("Mete comandos AT: ");
}
void loop() {
if (BT.available()){
Serial.write(BT.read());
}
if (Serial.available()){
String cadena = "";
char c = Serial.read(); ;
while (c != '\n'){
cadena += c ;
delay(25) ;
c = Serial.read();
}
cadena += c ;
BT.print(cadena);
Serial.println("---> " + cadena);
}
}
Ejemplo 3
Otro ejemplo con el bluetooth.
#include <SoftwareSerial.h>
SoftwareSerial BT(2,3); //RX,TX
void setup() {
Serial.begin(115200);
BT.begin(57600);
}
void loop() {
if (BT.available()){
char c = BT.read();
switch (c){
case "A":
digitalWrite(10, HIGH);
Serial.println("Prende 10");
break;
case "a":
digitalWrite(10, LOW);
Serial.println("Apaga 10");
break;
case "B":
digitalWrite(11, HIGH);
Serial.println("Prende 11");
break;
case "b":
digitalWrite(11, LOW);
Serial.println("Apaga 11");
break;
}
}
if (Serial.available()){
String cadena = "";
char c = Serial.read(); ;
while (c != '\n'){
cadena += c ;
delay(25) ;
c = Serial.read();
}
cadena += c ;
BT.print(cadena);
Serial.println("---> " + cadena);
}
}
Ejemplo 4
Comunicar 2 Arduino UNO por bluetooth. El Maestro tiene un pulsador en pin 9 y cuando se pulse se debe conmutar el LED incorporado en el esclavo. Recuerda que ambos deben usar la misma velocidad (AT+BAUD4) y contraseña (AT+PIN123).
Maestro:
#include <SoftwareSerial.h>
#include <Bounce2.h>
SoftwareSerial BT(2,3); //RX,TX
Bounce rebote = Bounce();
void setup(){
BT.begin(9600);
pinMode(9, INPUT_PULLUP);
rebote.attach(9);
rebote.interval(5);
}
void loop(){
rebote.update();
if (rebote.fell()){
BT.print("1");
}
}
Esclavo:
#include <SoftwareSerial.h>
SoftwareSerial BT(2,3); //RX,TX
void setup(){
BT.begin(9600);
pinMode(13, OUTPUT);
}
void loop(){
if (BT.available()){
char x = BT.read();
if (x 1){
digitalWrite(13, !digitalRead(13));
}
}
}
Vea también
Referencias externas
- All Libraries
- SoftwareSerial
- AltSoftSerial de Paul Stoffregen
- Software Serial - Manuel Delgado
- HC-05 - Enrique Crespo
- HC-05 - Naylamp
- HC-06 - Prometec
- HC-05 - Prometec
- BLE - Prometec
- PC BT - Prometec
- Android BT - Prometec
- Arduino Bluetooth - DiyMarkers