Dos puertos de recepción



Las placas Arduino y Genuino están construidas para soportar la comunicación serie en los pines 0 y 1, pero a veces se necesitan más puertos serie. La Biblioteca SoftwareSerial ha sido desarrollada para permitir la comunicación serie que tendrá lugar en otros pines digitales de sus placas, utilizando el software para replicar la funcionalidad de las líneas RX y TX. Esto puede ser extremadamente útil cuando surge la necesidad de comunicarse con dos dispositivos serie, o para hablar con un solo dispositivo, dejando el puerto serie principal abierto para propósitos de depuración.

En el siguiente ejemplo, los pines digitales 2 y 4 en la placa Arduino o Genuino se utilizan como líneas serie RX virtuales. Los pines 3 y 5 son líneas TX virtuales. La placa escucha en un puerto virtual (puerto Uno) hasta que reciba un carácter "?". Después de eso, se escucha en el segundo puerto virtual (puerto Dos).

Hardware necesario

Placa Arduino o Genuino

Circuito

No hay circuito para este ejemplo. Asegúrese de que la placa Arduino o Genuino está conectada al ordenador a través de USB para permitir la comunicación serie a través de la ventana del monitor serie del software de Arduino (IDE).


Código

// Prueba de multiples puerto serie con SoftwareSerial
 
// Recibe de dos puertos serie software,
//  envía al puerto serie del hardware.

// Con el fin de escuchar en un puerto de software, se llama a port.listen ().
// Al utilizar dos puertos de serie software, debe de cambiar los puertos con listen() cada 
// uno a su vez. Escoja un momento lógico para cambiar puertos, como el final de una transmisión 
// esperada, o cuando el buffer está vacío. 
// En este ejemplo se cambian los puertos cuando no hay nada más para leer desde un puerto

// Circuito:
// Se necesitan dos dispositivos que se comunican en serie.
// * En primer lugar TX del dispositivo serie conectado al pin digital 10 (RX), RX al pin 11 (TX)
// * En segundo lugar TX del dispositivo serie conectado al pin digital 8 (RX), RX al pin 9 (TX)

// Nota:
// No todos los pines de la Mega y Mega 2560 soportan interrupciones de cambio de nivel, por lo 
// que solamente los siguientes se pueden utilizar para RX:
// 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

// No todos los pines de Leonardo soporta las interrupciones de cambio de nivel, 
//por lo que solamente la siguiente se pueden utilizar para RX: 8, 9, 10, 11, 14 (MISO), 
// 15 (SCK), 16 (MOSI).

// Creado 18 Apr. 2011
// modificado el 19 de marzo de 2016 por Tom Igoe
// basado en twoPortRXExample de Mikal Hart

// Este código es de dominio público.

#include <SoftwareSerial.h>
// software serial #1: RX = pin digital 10, TX = pin digital 11
SoftwareSerial portOne(10, 11);

// software serial #2: RX = pin digital 8, TX = pin digital 9
// en el Mega, usar otros pines en su lugar, el 8 y el 9 no funcionan en el Mega
SoftwareSerial portTwo(8, 9);

void setup() {
  // Abre las comunicaciones serie y espera a que se abra el puerto:
  Serial.begin(9600);
  while (!Serial) {
    ; // espera a que el puerto serie se conecte. Necesario para el puerto USB nativo solamente
  }


  // inicial el puerto software serial 
  portOne.begin(9600);
  portTwo.begin(9600);
}

void loop() {
  // Por defecto, el puerto última inicialización está escuchando. 
  // Cuando desee escuchar un puerto, seleccionelo de forma explícita:
  portOne.listen();
  Serial.println("Data from port one:");
  // Si hay datos que entran, leerlos 
  // y enviarlos al puerto serie hardware:
  while (portOne.available() > 0) {
    char inByte = portOne.read();
    Serial.write(inByte);
  }

  // línea en blanco para separar los datos de los dos puertos:
  Serial.println();

  // Ahora escucha en el segundo puerto
  portTwo.listen();
  // Si hay datos que entran, leerlos 
  // y enviarlos al puerto serie hardware:
  Serial.println("Datos del puerto Dos:");
  while (portTwo.available() > 0) {
    char inByte = portTwo.read();
    Serial.write(inByte);
  }

  // línea en blanco para separar los datos de los dos puertos:
  Serial.println();
}






4 comentarios:

  1. solo s epuede usar como maximo 2 puertos en arduino? no s epodria acer un portTree(5,3);?

    ResponderEliminar
    Respuestas
    1. en arduino mega 2560 yo he podido conectar 4 sensores puertos RX, TX (19,18), (17,16), (15,14) y (13,12) los 3 primeros no se tienen que declarar los toma por defecto (seerial1, serial2, serial3), trate de conectar 5 con el puerto (11,10) pero la librería no deja (estoy trabajando en eso.). mi correo ortegamerlano@gmail.com

      Eliminar
    2. Hola estoy tratando de resolver eso con un modulo bluetooth y un tft 2.4 pero a mi no me los recibe por defecto

      Eliminar
  2. con la instrucción delay me lee los tag pero si la cambio por la instrucción millis no los lee, que puede ser, gracias de antemano

    ResponderEliminar