Получение ненужных значений в консоли последовательного монитора 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;
}
}
}
@Jackie, 👍0
Обсуждение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. Се ля жизнь...
- Сбой Arduino во время последовательной печати без очевидной причины
- Почему Serial Print вызывает различное поведение в зависимости от того, где он находится
- Странное последовательное поведение Arduino
- Программа работает только с Serial.begin
- Последовательный порт не работает со скоростью выше 19200
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
На панели инструментов редактора есть кнопка форматирования кода, но отступы кода — это большой беспорядок. Если вы настолько невнимательны, то вас могут ожидать неприятности. Используйте ссылку редактирования под своим вопросом, чтобы исправить его, и проверьте предварительный просмотр, прежде чем нажимать «Сохранить изменения»., @Transistor
@King: Я одобрил ваше изменение, но оно все равно неверно. Посмотрите на закрывающие скобки внизу. Есть и другие проблемы. Автору следует исправить вопрос., @Transistor
Какой бы ни была ваша реальная проблема, запись EEPROM во внешнюю безусловную часть вашего цикла() является ошибкой., @Chris Stratton
Однако ваша проблема, вероятно, заключается в том, что вы пытаетесь получить последовательный ввод с ПК. Возможно, вы имеете в виду взять его с Serial1, к которому вроде бы у вас подключен XBEE?, @Chris Stratton