Go Down

Topic: Problema con transmisión de datos por el puerto serie entre Arduinos (Read 2039 times) previous topic - next topic

CaCo

Buenas tardes,

Estoy intentando transmitir datos vía serie entre dos Arduino. La que transmite los datos es una Arduino Duemilanove y la que los recibe un Arduino Mega.

Para la transmisión de datos utilizo la librería SoftwareSerial. Cómo veréis abajo en el código, de momento sólo intento transmitir un carácter, a sea una letra, un número entero, lo que sea... el caso es que cuando la Arduino Mega lo recibe y veo qué es lo que ha recibido en la consola, salen símbolos de esos raros que no dicen nada, en vez de salir la letra, o el número que estoy enviando.

Entiendo que es una duda de novato, y probablemente se resuelva con nada, alguien me podría echar una mano? Gracias!

El código que tengo es el siguiente

Transmisor (Arduino Duemilanove COM4, Tx --> Pin digital nº 3)
Code: [Select]

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {
 
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
   
  mySerial.begin(2400);
}

void loop(){

  mySerial.print('c');
 
}


Receptor (Arduino Mega COM5, Rx --> Pin digital nº2)
Code: [Select]

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {

  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
 
  mySerial.begin(2400);
  Serial.begin(9600);
 
}

void loop() {

  char c = mySerial.read();
 
  Serial.println(c);
  delay(500);

}


bilbo

La librería NewSoftSerial es mucho mejor que la librería SoftwareSerial. Se puede usar exactamente como Serial normal, y probablamente resolvere la problema.
Puede descargarlo aqui: http://arduiniana.org/NewSoftSerial/NewSoftSerial10c.zip . Aqui es la programa modificada para usarla:

Buena suerte!

Transmisor:
Code: [Select]
#include <NewSoftSerial.h>

#define rxPin 2
#define txPin 3

NewSoftSerial mySerial(rxPin, txPin);

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

void loop(){

  mySerial.print('c');
 
}


Receptor:
Code: [Select]
#include <NewSoftSerial.h>

#define rxPin 2
#define txPin 3

NewSoftSerial mySerial(rxPin, txPin);

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

void loop() {


  if (mySerial.available()) {

      Serial.print((char)mySerial.read());

}
Alice asked the Chesire Cat, who was sitting in a tree, "What road do I take?"
The cat asked, "Where do you want to go?"
"I don't know," Ali

CaCo

Muchísimas gracias! Acabo de hacerme con la librería. Probaré y en cuanto tenga algo lo digo.

Muchas gracias de nuevo!

chiva

En el Arduio Mega no hace falta que emules un puerto serie por soft
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

CaCo

Sinceramente, estoy intentando ponerme al día con esto como puedo, ahora mismo estoy muy pez... Si que he visto que Arduino Mega tiene en total 4 pares de parejas de transmisión serie, pero me gustaría hacerlo como si se tratara de dos Duemilanove, no obstante, una vez lo consiga con uno de los métodos, obviamente probaré los otros para hacerlo de todas las maneras posibles.

Gracias!

chiva

Es que la librería no es compatible todavía con el Mega
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

bilbo

Chiva tiene razon que lo original no es compatible pero se puede usar esto: http://arduiniana.org/2011/01/newsoftserial-11-beta/ , que es compatible con el mega. Creo que es importante usar NewSoftSerial, para que la programa sea compatible con el Mega y el "Uno"/Duemalinove.
Alice asked the Chesire Cat, who was sitting in a tree, "What road do I take?"
The cat asked, "Where do you want to go?"
"I don't know," Ali

CaCo

Gracias por vuestra ayuda, probaré todos los métodos y cuando tenga buenos resultados (espero que sea pronto) lo publico por aquí.

CaCo

Acabo de probar esto. Mi experiencia ha sido la siguiente.

Por una parte, es muy cierto que la librería NewSoftwareSerial, no era compatible con Arduino Mega 2560, por lo que me he descargado la nueva versión beta de esta librería desde la página que indicasteis. El resultado ha sido inmediato, tan sólo unos apuntes, pero antes pego los códigos que he utilizado y funcionan perfectamente:

Emisor (Arduino Duemilanove)
Code: [Select]
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

SoftwareSerial mySerial(rxPin, txPin);

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

void loop(){

  mySerial.print('h');
  delay(500);
 
}


Receptor (Arduino Mega 2560)
Code: [Select]
#include <SoftwareSerial.h>

#define rxPin 10
#define txPin 11

SoftwareSerial mySerial(rxPin, txPin);

void setup()  {
 
  mySerial.begin(2400);
  Serial.begin(4800);
 
}

void loop() {


  if (mySerial.available()) {

      Serial.print((char)mySerial.read());

}
}



Lo primero a tener en cuenta es que la nueva librería NewSoftwareSerial (versión beta aún), pasa a llamarse de nuevo SoftwareSerial (ojo al incluir la cabezera).

Lo segundo es que esta librería no soporta todos los pines de la Arduino Mega, tal y como explica en la página. ("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")

Y otra cosa que me ha chocado es que la velocidad del puerto serie estándar (el USB) no puede ser mayor o igual a 9600 baudios, ya que en este caso, por lo menos a mi, me imprime "basura" por pantalla en lugar de imprimir el carácter deseado. En este caso he puesto que la velocidad del puerto serie estándar sea de 4800 baudios, pero podría haber valido también una velocidad menor.

Seguiré probando nuevas formas de transmisión de datos por puertos serie. Muchas gracias por vuestra ayuda, la verdad es que así da gusto.

chiva

Ten en cuenta que estás leyendo el puerto serie continuamente, no se que devolverá esta librería si el buffer de entrada está vacío.
Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Go Up