Дополнительный код 0x00, отправленный с сообщением RS485

Сейчас я пытаюсь использовать Arduino для передачи данных по RS485 через RS485-приёмопередатчик SP3078EEN. В моём коде для Arduino вывод DE устанавливается в высокий уровень, я жду 1 мс, а затем записываю данные и сбрасываю буфер данных в последовательный порт, подключенный к выводу DI приёмопередатчика. После этого вывод DE снова устанавливается в низкий уровень. Всё работает почти так, как задумано, за исключением того, что после данных, считанных осциллографом и ПК (измерения производились с помощью преобразователя RS485 в USB), я получаю дополнительный байт 0x00.

Ниже представлена важная часть моего кода, а также осциллограммы сигналов Di (вход драйвера), A (положительный выход RS485) и DE (включение драйвера). Я также предоставил упрощённую схему своей схемы. Единственное, что, как мне кажется, может быть причиной этого, — это, по-видимому, ёмкостный разряд на сигнале «A», возникающий при переключении DE с высокого уровня на низкий. Я не знаю, почему это происходит и как это исправить. Я пробовал устанавливать подтягивающие и стягивающие резисторы на RO, RE и DI, но безрезультатно. Я также пробовал увеличивать задержку перед записью и добавлять задержку после записи, тоже безрезультатно.

Если кто-нибудь сможет помочь мне разобраться, я буду очень признателен.

Осциллограф Осциллограф

Код:

void setup() {
    Serial0.begin(19200, SERIAL_8E1);
    Serial1.begin(19200, SERIAL_8E1);
}

void loop() {

    // Установка статического значения буфера для отладки
    byte buffer1 = { 0x01, 0x03, 0x00, 0x00, 0x00, 0x04, 0xC4, 0x0B };

    // Установите вывод DE_1 в высокое состояние, чтобы разрешить запись на шину RS485
    digitalWriteFast(DE_1_PIN, HIGH);

    delay(1);

    // Записать буфер в шину RS485
    Serial1.write(buffer1, 8); 
    Serial1.flush();
    
    // Отключить запись
    digitalWriteFast(DE_1_PIN, LOW);

    delay(1000);
}


Суперупрощенная схема Упрощенная схема

, 👍0

Обсуждение

Добро пожаловать в SE/Arduino! Пожалуйста, ознакомьтесь с [туром], чтобы узнать, как работает этот сайт, и прочтите раздел «[спросить]». — Помимо того, что данные в вашем источнике и записи не совпадают, в вашей схеме не указаны обязательные подтягивающие и стягивающие резисторы на шине. Пожалуйста, [отредактируйте] свой вопрос, указав, есть ли они у вас., @the busybee

В любом случае, ваша проблема на самом деле не связана с Arduino. По этой причине её могут вскоре закрыть. Лучше обратиться в [SE/EE](https://electronics.stackexchange.com/)., @the busybee


1 ответ


1

На схеме контакты TX/RX перепутаны: TX должен идти к DI, а RX к RO. Полагаю, это ошибка только на схеме, а не на фактическая схема.

Что касается лишнего байта 0x00 после сообщения... Я не вижу его на на графике осциллографа. Я вижу, что сигнал А падает, когда он перестает возбуждаться, и это очень похоже на стартовый бит, за которым следует поток нулей. Однако соответствующего стопового бита нет. Поэтому этого быть не должно. интерпретируется как переданный байт, а скорее отбрасывается как кадр Ошибка. Вернее, это состояние «обрыва» на линии.

Я вижу для вас два варианта:

Что касается программного обеспечения, вам, вероятно, следует настроить свои приемники так, чтобы не игнорировать ошибки кадрирования, а вместо этого отбрасывать неправильно кадрированные байты. Что касается аппаратного обеспечения, у вас, вероятно, уже есть несколько согласующих резисторов. на концах линии. Их можно заменить делителями напряжения. между GND и +5 В, чтобы сделать неактивную линию A в режиме ожидания потенциал выше, чем неиспользуемая линия B. Таким образом, неиспользуемая шина зависает на логической 1, как и положено последовательному порту. Вам следует смог найти документацию в Интернете, показывающую, как вычислить соответствующие значения резисторов.

,