Дополнительный код 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);
}
Суперупрощенная схема

1 ответ
На схеме контакты TX/RX перепутаны: TX должен идти к DI, а RX к RO. Полагаю, это ошибка только на схеме, а не на фактическая схема.
Что касается лишнего байта 0x00 после сообщения... Я не вижу его на на графике осциллографа. Я вижу, что сигнал А падает, когда он перестает возбуждаться, и это очень похоже на стартовый бит, за которым следует поток нулей. Однако соответствующего стопового бита нет. Поэтому этого быть не должно. интерпретируется как переданный байт, а скорее отбрасывается как кадр Ошибка. Вернее, это состояние «обрыва» на линии.
Я вижу для вас два варианта:
Что касается программного обеспечения, вам, вероятно, следует настроить свои приемники так, чтобы не игнорировать ошибки кадрирования, а вместо этого отбрасывать неправильно кадрированные байты. Что касается аппаратного обеспечения, у вас, вероятно, уже есть несколько согласующих резисторов. на концах линии. Их можно заменить делителями напряжения. между GND и +5 В, чтобы сделать неактивную линию A в режиме ожидания потенциал выше, чем неиспользуемая линия B. Таким образом, неиспользуемая шина зависает на логической 1, как и положено последовательному порту. Вам следует смог найти документацию в Интернете, показывающую, как вычислить соответствующие значения резисторов.
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
- Как заставить I2C работать на RS485?
- Как соединить несколько Arduino с RPI для управления домашним освещением и выключателями
- Когда дело доходит до связи UART-RS485, в чем разница между модулем "MAX485" и модулем "HW-0519"?
- Связь Arduino Uno и ESP32 с использованием RS485
- Преобразование десятичных данных rtu Modbus в число с плавающей запятой
- Управление VFD с помощью ModBus RTU через RS485 и Arduino
Добро пожаловать в SE/Arduino! Пожалуйста, ознакомьтесь с [туром], чтобы узнать, как работает этот сайт, и прочтите раздел «[спросить]». — Помимо того, что данные в вашем источнике и записи не совпадают, в вашей схеме не указаны обязательные подтягивающие и стягивающие резисторы на шине. Пожалуйста, [отредактируйте] свой вопрос, указав, есть ли они у вас., @the busybee
В любом случае, ваша проблема на самом деле не связана с Arduino. По этой причине её могут вскоре закрыть. Лучше обратиться в [SE/EE](https://electronics.stackexchange.com/)., @the busybee