Получение ненужных значений в консоли последовательного монитора Arduino

Я хочу отправить символ с передатчика Zigbee на Arduino Mega 2560. После получения символа Arduino должен отправить некоторые данные обратно в Zigbee. Но Arduino всегда получает на консоль ненужные значения. Если я отправляю символ, предположим, «а» вместо «а», консоль Arduino всегда показывает «y». Это одинаково для каждого отправляемого мной символа.

#include <EEPROM.h>
#include <SoftwareSerial.h>
SoftwareSerial XBee(19, 18); // прием, Техас
int addr = 0;
unsigned long startMillis;  //некоторые глобальные переменные доступны в любом месте программы
unsigned long currentMillis;
const unsigned long period = 1000;  //значение — количество миллисекунд
void setup()
{

  XBee.begin(9600);
  Serial1.begin(9600);
  Serial.begin(9600);
  startMillis = millis();  //начальное время запуска
 }
void loop()
{
  int id = 1;
  EEPROM.write(addr, id);
  if (Serial1.available()>0)
    {          
      currentMillis = millis();  // получаем текущее «время» (фактически количество миллисекунд с момента запуска программы)
  if (currentMillis - startMillis >= period)  //проверяем, истек ли период
  {
    char recbyte=Serial.read();
    Serial.print(recbyte);
    // задержка(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;
  }
    }
}  

, 👍0

Обсуждение

На панели инструментов редактора есть кнопка форматирования кода, но отступы кода — это большой беспорядок. Если вы настолько невнимательны, то вас могут ожидать неприятности. Используйте ссылку редактирования под своим вопросом, чтобы исправить его, и проверьте предварительный просмотр, прежде чем нажимать «Сохранить изменения»., @Transistor

@King: Я одобрил ваше изменение, но оно все равно неверно. Посмотрите на закрывающие скобки внизу. Есть и другие проблемы. Автору следует исправить вопрос., @Transistor

Какой бы ни была ваша реальная проблема, запись EEPROM во внешнюю безусловную часть вашего цикла() является ошибкой., @Chris Stratton

Однако ваша проблема, вероятно, заключается в том, что вы пытаетесь получить последовательный ввод с ПК. Возможно, вы имеете в виду взять его с Serial1, к которому вроде бы у вас подключен XBEE?, @Chris Stratton


1 ответ


1

Вы создали экземпляр SoftwareSerial под названием XBee, который использует контакты 17 и 18. Затем вы используете Serial1, который имеет контакты 17 и 18.

Вам не нужен экземпляр XBee SoftwareSerial, поскольку вы используете аппаратные последовательные контакты. Удалите его и все ссылки на него.

Кроме того, вы отключаете Serial1 после его использования, а это значит, что он больше никогда не будет работать:

Serial1.end();

Эту инструкцию следует использовать только в очень специфических обстоятельствах. Удалите его.

После проверки наличия данных, доступных для чтения на Serial1, вы пытаетесь прочитать их с Serial:

char recbyte=Serial.read();

Это должно быть:

char recbyte=Serial1.read();

Вы записываете в EEPROM на каждой итерации цикла:

EEPROM.write(addr, id);

Вероятно, вы уже отключили EEPROM. Се ля жизнь...

,