Arduino Mega Loopback Test с несколькими портами TX/RX

Я пытаюсь выполнить петлевой тест с помощью Arduino Mega. Что я хочу сделать, так это отправить байт по TX и получить указанный байт обратно на RX и убедиться, что байт не изменился. Более или менее у меня просто есть перемычка, соединяющая порты TX и RX (на самом деле у меня есть цепь, подключенная к портам TX RX, которая фактически действует как провод, я просто пытаюсь убедиться, что дорожки цепи исправны) .

Я также делаю то же самое с TX2/RX2 и TX3/RX3.

Проблема, с которой я столкнулся, заключается в том, что я не могу получить данные для отправки через порты TX. В своей попытке я использовал объекты Serial, где я сделал бы следующее:

void setup() {
Serial.begin(9600); //0 и 1
Serial2.begin(9600); //16 и 17
Serial3.begin(9600); //14 и 15
}

void loop() {

//RX TX
int bytesSent = Serial.write(1);
delay(500);
if(Serial.read()!=bytesSent){

  //Сделай что-нибудь

}

delay(500);

//RX2 TX2
bytesSent = Serial2.write(2);
delay(500);
if(Serial2.read()!=bytesSent){

   //Сделай что-нибудь

}

delay(500);

//RX3 TX3
bytesSent = Serial3.write(3);
delay(500);
if(Serial3.read()!=bytesSent){

   //Сделай что-нибудь

}

delay(500);

}

Мне известно, что использование "delay(500)" не оптимальна и не является хорошей практикой кодирования, но пока оставлена здесь, пока я все еще пытаюсь понять, что не так с моей передачей и приемом.

Я считаю, что мое непонимание связано с объектами Serial; Я не использую их правильно в этом случае? Я ссылался на справочное руководство Arduino Serial, поэтому кажется, что это сработает, но это не так.

Дополнительная информация: в настоящее время я питаю свой Arduino через USB (я знаю, что это может быть проблемой, но в настоящее время у меня нет источника питания от батареи). Переключение на другой источник питания решит мою проблему? Просто повторюсь, что я не пытаюсь установить связь с ПК, я просто пытаюсь убедиться, что эта внешняя цепь (которая действует как провод) может передавать сигнал.

, 👍1

Обсуждение

у вас логическая ошибка... ваш код предполагает, что bytesSent содержит отправленные данные, @jsotola

Как именно вы знаете, что это не работает? В приведенном выше коде вы ничего не делаете. У вас там только комментарии., @chrisl


1 ответ


1

Кажется, здесь небольшое недоразумение:

bytesSent = Serial2.write(2);
// [...]
if (Serial2.read() != bytesSent) // [...]

На последовательных портах:

  • метод write() возвращает количество записанных байтов, не значение записанного байта

  • метод read() возвращает прочитанный байт (или −1, если ничего был доступен), а не количество прочитанных байтов.

Я предлагаю вам изменить тест следующим образом:

uint8_t byte_sent = random(256);
Serial2.write(byte_sent);
delay(100);
if (Serial2.read() != byte_sent) // произошла ошибка
,