Recibiendo valores basura en la consola del monitor serie Arduino

0

Quiero enviar un personaje de un transmisor Zigbee a un Arduino Mega 2560. Después de recibir el personaje, Arduino debe enviar algunos datos a Zigbee. Pero Arduino siempre está recibiendo valores basura en la consola. Si envío un carácter, supongamos que 'a', en lugar de 'a', la consola Arduino siempre muestra 'y'. Es lo mismo para cada personaje que envío.

#include <EEPROM.h>
#include <SoftwareSerial.h>
SoftwareSerial XBee(19, 18); // RX, TX
int addr = 0;
unsigned long startMillis;  //some global variables available anywhere in the program
unsigned long currentMillis;
const unsigned long period = 1000;  //the value is a number of milliseconds
void setup()
{

  XBee.begin(9600);
  Serial1.begin(9600);
  Serial.begin(9600);
  startMillis = millis();  //initial start time
 }
void loop()
{
  int id = 1;
  EEPROM.write(addr, id);
  if (Serial1.available()>0)
    {          
      currentMillis = millis();  //get the current "time" (actually the number of milliseconds since the program started)
  if (currentMillis - startMillis >= period)  //test whether the period has elapsed
  {
    char recbyte=Serial.read();
    Serial.print(recbyte);
    // delay(1500);
    Serial1.write(id);
    Serial1.write(" 30 ");
    Serial1.write(" 99 ");
    Serial1.write(" 72 ");
    Serial1.write(" 1098 ");
    Serial1.write(" 728 ");
    Serial1.write(" 578 ");
    // Serial1.write("$");
    Serial1.write('PS=1\r\n');
    Serial1.end();
    startMillis = currentMillis;
  }
    }
}  
    
pregunta Jackie

1 respuesta

1

Ha creado una instancia de SoftwareSerial llamada XBee que toma los pines 17 y 18. A continuación, utiliza Serial1, que es los pines 17 y 18.

No desea, ni necesita, la instancia de XBee SoftwareSerial, ya que está utilizando pines serie de hardware. Bórralo y todas las referencias a él.

Además, está desactivando Serial1 después de usarlo, lo que significa que nunca volverá a funcionar:

Serial1.end();

Solo usarías esa instrucción en circunstancias muy específicas. Eliminarlo.

Después de verificar si hay datos disponibles para leer en Serial1, intente leerlos en Serial:

char recbyte=Serial.read();

Eso debería ser:

char recbyte=Serial1.read();

Está escribiendo en EEPROM en cada iteración de bucle:

EEPROM.write(addr, id);

Es probable que ya hayas matado a tu EEPROM. C'est la vie ...

    
respondido por el Majenko

Lea otras preguntas en las etiquetas