Я передаю RS485 через:
Моно-приложение -> Устройство Linux USBTTY -> Адаптер RS485 с добавленным терминатором 100R -> CATV ~1 м -> SN65176 с добавленным терминатором 100R -> PIC.
С помощью отладки я вижу, что передача из приложения на PIC прошла успешно, и передача PIC из последовательного порта также в порядке. Однако, когда SN65176 переключается из режима приема в режим привода, низкий уровень выходного сигнала очень шумный (см. захват):
В этом захвате осциллографа канал 1 (синий) — это сторона данных (R/D) SN65176, а канал 2 (желтый) — на разъеме RS485 рядом с ПК.
В этом конкретном случае первый байт был от ПК (00001101), а второй байт был от PIC. Он должен был быть 00011101, но был получен как 00000100.
Вот соответствующий код порта Mono/C#:
port = new SerialPort(
portName: portName,
baudRate: 115200,
parity: Parity.None,
dataBits: 8,
stopBits: StopBits.One)
{
Encoding = ASCIIEncoding.ASCII,
Handshake = Handshake.RequestToSend,
DtrEnable = false,
RtsEnable = false,
WriteTimeout = 1000 // ms
};
port.Open();
// ...
Port.ReadByte()
Адаптер RS232-to-485 представляет собой XS201A . Он утверждает, что имеет отказоустойчивое смещение; однако прямые измерения не подтверждают это утверждение. Возможно, это связано с тем, что смещение включается только тогда, когда на устройство подается питание, но я не считаю это особенно безопасным. В нем нет схемы, и это запечатанный блок, поэтому его сложнее реконструировать; однако при работе с внешней нагрузкой 100 Ом на обоих концах я вижу следующие напряжения:
Va-Vb = 44mV
Va-gnd = 311mV
Vb-gnd = 267mV
XS201A также утверждает, что использует «Автоматическое управление отправкой данных», питание от порта RTS / DTR / TXD и короткие RTS + CTS и DTR + DSR + CT.
С отключенным SN65176 и немного другим смещением кажется, что XS201A имеет недокументированный 4-битный линейный привод, после чего драйвер отключается:
Это показывает два последовательных 0x33 от ПК. Оба байта окружены одним стоповым и стартовым битами, а также конечным тайм-аутом диска.
Подведем итоги обсуждения и ответим на результаты теста:
похоже, что у XS201A есть недокументированные 4 бита линейного привода, после чего драйвер отключается
Согласен, такое поведение соответствует тому, что я видел раньше на некоторых преобразователях, и спасибо за проведение теста.
Скорее всего, это будет относительно фиксированное время , в течение которого линия активно управляется после передачи этим преобразователем RS232-RS485, а не постоянное количество битов, независимо от скорости передачи. Вы можете значительно изменить битрейт и повторно протестировать, чтобы убедиться, что «время работы линии после отправки» по-прежнему остается близким к текущему ~ 35 мкс. Вы также можете обнаружить, что существует вариация в этом «времени работы линии после отправки» в зависимости от отправляемого байта данных, поэтому я предлагаю больше тестов с разными байтами, чтобы проверить это.
Это была еще одна недавняя тема здесь, на EE.SE (Как работает этот модуль RS485?) , где частичная схема показывает тип схемы, которая может использоваться для обеспечения «автоматического» переключения между отправкой и получением по RS-485. Однако они не переключаются сразу после завершения передачи, что приводит к поведению, которое вы наблюдали.
Как я вижу, некоторые варианты включают в себя:
Вы можете изучить такие термины, как «задержка переключения RS-485» или «автоматическое переключение RS-485», чтобы получить дополнительную информацию и опыт при временном мультиплексировании нескольких передатчиков на полудуплексных шинах RS-485.
Отметка
Рейндериен
Отметка
Отметка
Сэм Гибсон
Отметка
Рейндериен
Рейндериен
Рейндериен
Отметка
Сэм Гибсон
Сэм Гибсон
Рейндериен
Сэм Гибсон
Рейндериен