Duda comunicacion puerto serie TX y RX

Buenas, en el ejemplo de la carpeta SotwareSerial, viene dos ejemplos, uno de ellos es el siguiente, alguien me puede aclarar si el objetivo del ejemplo, es escribir por el puerto serie creado, y leerlo por el puerto serie emulado atraves del usb? De ser asi, una manera de testear el propio puerto serie seria puentear los pines TX y RX en placa de Arduino ??

 /*
  Software serial multple serial test

 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.

 The circuit:
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)

 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example

 This example code is in the public domain.

 */
#include 

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(57600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() { // run over and over
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

The circuit: * RX is digital pin 10 (connect to TX of other device) * TX is digital pin 11 (connect to RX of other device)

Dicho en español: pin 10 a TX (pin 1); pin 11 a RX (pin 0).

No hagas ninguna conexión antes de subir el programa. Súbelo primero, antes que nada...

Muchas gracias, he cogido este codigo como ejemplo, su conexion, seria la siguiente; del dispositvo el pin TX al pin 10 y el RX del dispositvo al 11 de arduino??

#include 
SoftwareSerial mySerial(10, 11);

uint8_t open_ANT[] = {0xAA, 0xBB, 0x06, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x03};

void setup() {
 Serial.begin(9600);
 mySerial.begin(9600);
 mySerial.write(open_ANT, sizeof(open_ANT));
}

void loop() {
 if (mySerial.available()) {
   Serial.write(mySerial.read());
 }
 if (Serial.available()) {
   mySerial.write(Serial.read());
 }
}

Bueno... creo que no fui muy claro al explicar la conexión. Voy de nuevo:

Pin 10 al TX del cual-sea el dispositivo (si es al mismo Arduino, ese sería el pin 1). Pin 11 al RX del cual-sea el dispositivo (si es al mismo Arduino, ese sería el pin 0).

Ahora sí me captas? :)

Si, lo he entendido, gracias, pero, no logro entender porque no funciona, salvo que el dispositivo este defectuoso. Cuando lo hago con arduino, escribir y leer asigo mismo, funciona correctamente.

Espera... de qué "dispositivo" estás hablando?

Podrías, por favor, postear una imagen o link de eso?

Ahi estan los datasheets, es un lector RFID a 134.2 khz, con protocolos para intervenciones en animales.

D-Think_M30Z134 DataSheet_ EN.pdf (585 KB)

D-Think_M30Z134.pdf (90.4 KB)

En el monitor serie, me devuelve unos caracteres raros, como si no estuvieran ajustados los baudios correctamente, el caso, es que en el datasheet, expecifica los 9600. He cambiado la velocidad de arduino por si las moscas y probado todas las velocidades en el monitor serie. Cuando se suministra corriente a arduino, se enciende el led durante un segundo, y ya no vuelve a volcar nada mas.

Leí esto en la hoja de datos:

M30Z134 module communicate via UART baud rate 9600,1 BIT start bit, 8 BIT data, 1 BIT stop bit.

Y según lo que dice aquí, esa es la configuración por defecto. Solo que me quedan varias dudas al respecto:

  • En ningún lado dice algo sobre "bit de inicio", así que asumiré que "por estándar", siempre será 1 bit.
  • Existe el llamado "bit de paridad", pero en la hoja de datos no especifica si se requiere o no :confused:

Lo que resta ahora, es que pruebes una de las siguientes configuraciones del inicio (setup):

mySerial.begin(9600, SERIAL_8N1);
mySerial.begin(9600, SERIAL_8E1);
mySerial.begin(9600, SERIAL_8O1);

Y a ver que tal ::)

Me da este error, he estado revisando la informacion, y acerca de SoftwareSerial, no he encontrado si se puede expecificar estos parametros.

no matching function for call to 'SoftwareSerial::begin(int, int)'

Asegúrate de que ambos dispositivos tienen configurada la misma velocidad, si tienes configurado 9600 baudios en uno tiene que tener la misma velocidad configurada en el otro.

Puedes usar otros más rápidos o más lentos, según tus necesidades, pero siempre tiene que ser la misma velocidad en ambos.

Si, esta ajustado a 9600. Pero, devuelve valores extraños por el monitor serie, en cuanto mas velocidad, mas caracteres y en cuanto menos velocidad, menos ... aunque no siempre son los mismos.

Oskar_Sanchez: Me da este error, he estado revisando la informacion, y acerca de SoftwareSerial, no he encontrado si se puede expecificar estos parametros.

no matching function for call to 'SoftwareSerial::begin(int, int)'

¡Houston, tenemos un problema! :cold_sweat:

Y uno complicado de resolver. Si tienes un convertidor USB a TTL, te salvaste; sino... vas a tener que encontrar una manera alternativa de mostrar texto (LCD, archivo en una SD, etc.)

Lo que ocurre es lo siguiente: SoftwareSerial no tiene cómo configurar el formato de datos; por lo tanto, sólo te queda conectar el dispositivo a los pines 0 y 1 del Arduino (0 a TX, 1 a RX) Aquí viene la parte complicada: usar el monitor serie cuando hay algo conectado en los pines 0 y 1, es motivo de conflicto en la comunicación. Si tuvieras un Arduino Mega o un convertidor USB a TTL, ya el problema estaría resuelto; pero si no... tendrás que recurrir a las alternativas que te mencioné anteriormente.

Tengo ambas alternativas, por lo general, uso Mega por las necesidades fisicas. Si no he entendido mal, me recomiendas, que deje de usar softwareSerial, siga usando Serial0 para la comunicacion del monitor serie, y utilize los demas puertos ttl como por ejemplo Serial1 para la comunicacion entre el dispositivo y arduino, verdad? Asi, ya podría quedar y probar la comunicacion Serial1.begin(9600, ....)

Algo se ha avanzado, con la siguiente configuracion, por el monitor serie, muestra el numero 7. Que quiere decir, no lo se, no hay ninguna etiqueta cerca que pueda leer, y cuando se acerca una, no muestra ningun sintoma.

#include 
//SoftwareSerial mySerial(10, 11);

uint8_t open_ANT[] = {0xAA, 0xBB, 0x06, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x03};

void setup() {
  Serial.begin(9600, SERIAL_8E1);
  Serial1.begin(9600, SERIAL_8E1);
  //Serial1.begin(9600, SERIAL_8E1);
  //Serial1.begin(9600, SERIAL_8O1);
  Serial1.write(open_ANT, sizeof(open_ANT));
    
}

void loop() {
  if (Serial1.available()) {
    Serial.write(Serial1.read());
  }
  if (Serial.available()) {
    Serial1.write(Serial.read());
  }
}

Hola. Acabo de echar un vistazo somero al datasheet y hay dos cosillas: 1- El cacharro, al parecer, trabaja a 3V, con lo que supongo que las señales también. 2- No se envían/reciben caracteres ascii legibles, sino directamente valores.

Es decir, que no esperes recibir por serial nada reconocible. La configuración del puerto es 9600 y la típica (sin paridad, 1 bit start y 1 bit stop).

De momento muestra lo que recibes por serial, en lugar de tal y como viene, como bytes en hexadecimal, a ver si reconocemos la cabecera (AABB).

  if (Serial1.available()) {
    Serial.print(Serial1.read(), HEX);
  }

Buenas, gracias Noter. He modificado el programa, por el monitor serial aparece "AABB60001302". Esto con la configuracion SERIAL_8N1, con SERIAL_8E1 "3712", con SERIAL_8O1 "AA10020". No se si puede servir de ayuda.

#include 
//SoftwareSerial mySerial(10, 11);

uint8_t open_ANT[] = {0xAA, 0xBB, 0x06, 0x00, 0x00, 0x00, 0x01, 0x03, 0x01, 0x03};

void setup() {
  Serial.begin(9600, SERIAL_8N1);
  Serial1.begin(9600, SERIAL_8O1);
  //Serial1.begin(9600, SERIAL_8E1);
  //Serial1.begin(9600, SERIAL_8O1);
  Serial1.write(open_ANT, sizeof(open_ANT));
  
    
}

void loop() {
  if (Serial1.available()) {
    Serial.print(Serial1.read(), HEX);
  }
}

noter: 2- No se envían/reciben caracteres ascii legibles, sino directamente valores.

Argh. Esa parte de que envía datos binarios fue la que no capté, por eso las pruebas.

Si con SERIAL_8N1 se lee correctamente la cabecera "AABB", entonces ya no será necesario el segundo parámetro en begin (también SoftwareSerial se podrá utilizar sin problemas).

En resumidas cuentas: noter fue quién dio la solución, yo solo te dije que hicieras cosas que al final NO SIRVIERON PARA NADA :( Por eso nos devolvemos otra vez a lo de usar el SoftwareSerial...

Gracias a ambos, todo proceso conlleva su aprendizaje, por ahora, hemos avanzado bastante, apriori, parece que estamos escribiendo sobre una etiqueta, o llevo mal las cuentas? Porque, por el momento, las etiquetas son solo de lectura, es bueno saberlo para un futuro, por ahora no le puedo dar salida. En el datasheet, el punto 4 es de lectura.

  1. Read ID Command code: 0x0104 Parameters: NONE Remarks: Please make sure that the antenna has been opened before to send command Answer data: 12 bytes of data. 1 to 5 bytes: National ID, 38 bits, High 2 bits as invalid data. 6 to 7 bytes: Country ID,10 bits, High 6 bits as invalid data. 8th byte: Data Flag, 1 bit,High 7 bits to retain data. If the Data Flag = 1, additional data is valid; otherwise, additional data is invalid. 9 bytes: Animal Flag, 1 bit,High 7 bits to retain data. 10 to 12 bytes: additional data.

Esto quiere decir, que debo escribir el codigo de comando 0x0104 para que me devuelva la lectura de la etiqueta? Gracias por aclarar la comunicacion por los demas puertos series.

Estas usando un RFID, que modelo ?
M30Z134
Porque no usas la librería que ya esta hecha en lugar de reinventar la rueda?
RFID Library