Последовательный модуль повторяет «0x00»

У меня возникла проблема с модулем MAXIM Serial (Config A) с простым повторяющимся кодом от COM-порта. При отправке символа (k:0x6b) я получаю эхо (0x00).

Без модуля и простого подключения Arduino через кабели TX/RX у меня нет эха.

Эхо сохраняется независимо от:

  • Скорость (от 38 400 до 2 000 000 бит/с),
  • Используя или не используя параметры высокой скорости (2,3 МОм для 250 000 бит/с) MAXIM,
  • Использование или отсутствие оконечных резисторов 120 Ом
  • Оба заземления 0 В, их подключение не имеет никакого эффекта,
  • Отсоединение кабелей последовательной шины A (красный) B (зеленый) (???). В этом случае сообщение не отправляется, как и ожидалось (!).

В чем может быть проблема?

Устройства:

  • Два Arduino Mega 2560,
  • Два MAX3292, по одному на каждую Arduino,
  • Кабель AWG24, короче 7 витков в каждом.

Конфигурация A: с модулем (00 echo), полудуплекс (f.19 p.13).

Конфигурация А Config A Datasheet

Конфигурация B: без модуля (без эха), только перекрестные кабели

Конфигурация B

Код:

long rate=38400;
void setup() {
    Serial.begin(rate); while (!Serial);
    Serial1.begin(rate); while (!Serial1);
    pinMode(22,OUTPUT);
    pinMode(23,OUTPUT);
}
char s;
void loop() {
    if (Serial.available()) {
        digitalWrite(22,1);
        digitalWrite(23,1);
        s=Serial.read();
        Serial1.write(s);
        Serial1.flush();
        digitalWrite(23,0);
        digitalWrite(22,0);
    }
    if (Serial1.available()){
        s=Serial1.read();
        Serial.write(s);
    }
}

Выполнение: отправлено четыре k, получено 0x00. После этого четыре k отправлены с другого arduino, успешно приняты.

Exec A

Эпилог.

На самом деле проблема заключалась в резисторе на выходе RO, не показанном на схеме ("Проблема в коде, который вы не разместили").

Это был делитель напряжения для преобразования 5V3.3 в корпусе Arduino Due, бесполезный в Arduino Mega, но все еще там.

Теоретически причина в том, что резистор вызывал всплеск на выходе (?), заставляя модуль интерпретировать его как другой байт, пустой (?).

После удаления резисторов все заработало отлично. Теперь я мигрировал это обратно в Arduino Due, но с диодом и подтягивающим резистором в качестве преобразователя 5V3.3.

, 👍0

Обсуждение

У вас есть основания Arduinos, соединенные вместе, не так ли?, @Majenko

Все подключены от одного и того же разветвителя USB, но даже подключив их в макетке, эффект сохраняется., @Brethlosze

Хорошо, если посмотреть подробнее - какой код на другом конце? У вас два мега, но показываете только один код. Во-вторых, ваша терминальная программа настроена на другую скорость передачи данных, чем ваша программа., @Majenko

Один и тот же код для обоих. Эффект одинаков для всех скоростей., @Brethlosze

С этим кодом для обоих, почему вы ожидаете, что что-то вернется? 00 - это ошибка, а не отсутствие ответа., @Majenko

Да, «0x00» — это ошибка. Не должно быть получено ни эха, ни ответа. Если я отключу шину AB, эхо останется... Если я уберу сигнал RE'DE, эхо исчезнет (но приема нет, так как он отключен)., @Brethlosze

Точно ли ваша диаграмма fritzing описывает реальность, или ваш правый чип на самом деле подключен не так, как вы его показываете?, @Majenko

Он почти такой же, как на схеме. На той же макетной плате подключите кабели, как указано, к соответствующему Arduino. Кабели named и AB имеют длину около 7 см., @Brethlosze

Значит, у тебя на самом деле неправильно подключен правый чип? Осмотрите провода, идущие между Arduino и правым чипом..., @Majenko

Ах да, это ошибка рисунка (к сожалению?)... Уже исправил., @Brethlosze

Похоже, вы подключили его к MAX3291 вместо MAX3292. Удалите провод PEE, так как это не PEE, это PSET. Подключите резистор и конденсатор к VCC. Прочитайте страницу 11 таблицы данных., @Majenko

У меня они были раньше, и я только что добавил их сейчас, но, к сожалению, все то же эхо, по одному на символ в строке, после отправки строк или отправки отдельных символов..., @Brethlosze


1 ответ


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

1

Проверьте проводку! Я предполагаю, что это витая пара (подкачка AB).

Я проверил ваш код, он кажется правильным. Обратите внимание, что /RE и DE были разработаны таким образом, что вы можете просто подключить их и управлять только одним контактом.

У меня нет точно такого же железа, у меня под рукой были MAX485 и Arduino Nano. Nano имеет только один аппаратный серийный номер, поэтому вместо него я использовал библиотеку SoftwareSerial. Я подключил их, настроил ваш код под свои настройки, и все заработало. Вот это на случай, если это поможет решить вашу проблему. Я также немного оптимизировал вашу версию (но раньше она работала, так что ошибка где-то в другом месте).

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 4); // RX, TX

const int dir_pin=9;
const int dir_transmit=1;
const int dir_receive=0;
long rate=38400;

void setup() {
    Serial.begin(rate); while (!Serial);
    mySerial.begin(rate); while (!mySerial);
    pinMode(dir_pin,OUTPUT);
}
char s;
void loop() {
    if (Serial.available()) {
        digitalWrite(dir_pin,dir_transmit);
        while(Serial.available())
        {
          s=Serial.read();
          mySerial.write(s);
        }
        mySerial.flush();
        digitalWrite(dir_pin,dir_receive);
    }
    while (mySerial.available()){
        s=mySerial.read();
        Serial.write(s);
    }
}
,

Что ж, код и конфигурация были в порядке, но... причиной проблемы был резистивный делитель на выходе RO, не показанный на схеме. После его удаления все заработало нормально. В любом случае спасибо за старания..., @Brethlosze