Arduino Mega считывает ту же информацию, что и через последовательный порт
Итак, у меня есть Arduino Mega, и я пытаюсь установить последовательную связь с другим устройством и столкнулся с этой странной проблемой.
Допустим, я использую Serial1.write для отправки шестнадцатеричного AF. Если я читаю через тот же порт (Serial1, распечатываю то, что читаю через Serial0), БЕЗ проводов, подключенных к последовательному порту, я получаю зеркало того, что отправляю в своей функции чтения . Я проверил эту теорию на нескольких последовательных портах, а также на разных Megas.
Как происходит это вмешательство? У меня неправильное представление о последовательных буферах? Что я могу сделать, чтобы остановить это? Это вызывает помехи при обмене данными с моим внешним устройством.
Вот очень короткая программа для проверки этой теории.
void setup()
{
Serial.begin(9600);
Serial1.begin(115200);
}
void loop()
{
char test[15];
for (int i = 0; i < 15; i++)
test[i] = i;
for (int i = 0; i < 15; i++)
Serial1.write(test[i]);
while(Serial1.available() > 0 )
{
byte c = Serial1.read();
Serial.print(' ');
Serial.print(c, HEX);
}
}
ОБНОВЛЕНИЕ: я вернулся на следующий день со своим O-scope, желтая линия — это TX, а синяя — RX. Я больше не получал перекрестных помех в последовательном порту, но осциллограф показывает, что линия RX подвергалась воздействию только около 250 мВ в идеальном унисоне с TX. Я попытался подключить все обратно таким же образом, но мне не удалось воспроизвести проблему. Каким-то образом, что бы я ни делал, когда я опубликовал это, это привело к тому, что линия RX была затронута достаточно сильно, чтобы Mega могла уловить ее по серийному номеру. А пока я просто виню в этом сбежавших пришельцев из Зоны 51 :)
@HavocRC, 👍-2
Обсуждение2 ответа
Лучший ответ:
Я запустил слегка измененную версию вашего тестового кода на Mega 2560 и вообще не получил эха; Если я полностью неправильно понял ваше описание проблемы, должно быть что-то еще. Вот код, который я запустил:
char test[15];
void setup()
{
Serial.begin(9600);
Serial1.begin(115200);
for (int i = 0; i < 15; i++)
{
//Serial.print(i);
test[i] = i;
Serial.print(test[i],HEX);
}
Serial.println();
for (size_t j = 0; j < 15; j++)
{
Serial.print("test["); Serial.print(j);
Serial.print("] = ");Serial.println(test[j],HEX);
}
}
void loop()
{
for (int i = 0; i < 15; i++)
{
Serial1.write(test[i]);
}
Serial.println(Serial1.available());
while (Serial1.available() > 0)
{
byte c = Serial1.read();
Serial.print(' ');
Serial.print(c, HEX);
}
}
А вот часть вывода на Serial0:
Opening port
Port open
VMDPV_1|1_�Se�
0123456789ABCDE
test[0] = 0
test[1] = 1
test[2] = 2
test[3] = 3
test[4] = 4
test[5] = 5
test[6] = 6
test[7] = 7
test[8] = 8
test[9] = 9
test[10] = A
test[11] = B
test[12] = C
test[13] = D
test[14] = E
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Как видите, буфер чтения Serial1 всегда был пуст.
Я неправильно понял что-то из того, что вы сказали?
Я обновил свой пост, смотрите новую информацию. Я повторил то же самое через несколько дней и не смог воспроизвести его, однако идеально совпадающие RX и TX на осциллографе заставили меня поверить, что что-то, что я делал, сделало помехи достаточно сильными, чтобы я мог прочитать их обратно., @HavocRC
Спасибо за помощь, @HavocRC
Это происходит из-за того, что вы передаете сигнал по длинному кабелю (длиннее нескольких метров), имеет место несоответствие импеданса (разомкнутая цепь) и вы получаете отражение.
Отсутствие кабеля также следует понимать как несоответствие импеданса, как немедленное размыкание цепи, отражающее всю энергию обратно в источник.
Когда вы пытаетесь сделать то же самое с любым последовательным модулем, таким как MAX232, с терминаторами импеданса на обоих концах, вы должны полностью устранить проблему, не имея отражений.
Как мне решить МОЮ проблему с Arduino Mega?, @HavocRC
- Я хочу, чтобы мой arduino mega одновременно читал со всех 4 последовательных портов, последовательно проходя через каждый из них.
- Arduino Mega Loopback Test с несколькими портами TX/RX
- Arduino Mega чтение с внешнего датчика. Проблема
- Как разделить входящую строку?
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
- Какова максимальная длина провода для последовательной связи между двумя Arduino?
- Последовательная связь между двумя Arduino (запрос и получение)
- Как использовать Serial.setTimeout()
он действует так, как будто локальное эхо включено ... хотя, похоже, для него нет настройки, @jsotola
это произойдет, если вы поменяете местами серийный номер и серийный номер 1? Что произойдет, если вы попробуете их оба на 9600?, @esoterik
вы заново изобрели радиосвязь :-), @Juraj
@esoterik idk, мне нужен серийный номер для просмотра моих данных, поэтому я не поменял местами. Я попробовал это на Serial2, та же проблема, затем я попробовал на Serial3, и это сработало лучше, но не очень хорошо. Я также пробовал разные скорости передачи данных, @HavocRC
Обратите внимание, что осциллограф обычно имеет входное сопротивление 1 МОм. Это может быть увеличено в 10 раз при использовании зонда 10×. Подключение осциллографа к RX эквивалентно добавлению чрезвычайно слабого подтягивающего резистора, которого достаточно, чтобы значительно уменьшить эффект перекрестных помех., @Edgar Bonet
Я получил те же результаты от моей установки; 0-5В на линии Tx, 0-0,3В на линии Rx. В качестве эксперимента я подключил два параллельных 30-сантиметровых провода к Tx и Rx. Это привело к более высокому уровню перекрестных помех, но все еще не привело к каким-либо «эхо-чтениям». Я почти уверен, что для получения необходимых 0-3 В или около того на линии Rx для успешного чтения данных потребуется какое-то проводное соединение. Я думаю, что ваши сбежавшие инопланетяне, возможно, натянули на вас одного ;-)., @user3765883