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 :)

, 👍-2

Обсуждение

он действует так, как будто локальное эхо включено ... хотя, похоже, для него нет настройки, @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


2 ответа


Лучший ответ:

4

Я запустил слегка измененную версию вашего тестового кода на 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


-2

Это происходит из-за того, что вы передаете сигнал по длинному кабелю (длиннее нескольких метров), имеет место несоответствие импеданса (разомкнутая цепь) и вы получаете отражение.

Отсутствие кабеля также следует понимать как несоответствие импеданса, как немедленное размыкание цепи, отражающее всю энергию обратно в источник.

Когда вы пытаетесь сделать то же самое с любым последовательным модулем, таким как MAX232, с терминаторами импеданса на обоих концах, вы должны полностью устранить проблему, не имея отражений.

,

Как мне решить МОЮ проблему с Arduino Mega?, @HavocRC