Понимание RS-485 в Linux

Я пытаюсь изучить интерфейс RS-485, отправляя данные между двумя компьютерами Linux. Главный компьютер работает под управлением ubuntu16.04, а другой - под управлением системы на основе Debian с ядром 4.19.

Главный ПК имеет переходник с USB на RS-485, а другой ПК имеет интерфейс RS-485.

Первоначально я предполагал, что могу просто отображать данные в интерфейсе, но не мог. Если бы я подключился к picocom, я мог бы вводить данные, но не отправлять их. Осмотревшись, я понял, что это потому, что оба компьютера ждут RTS, которую нужно каким-то образом переключить.

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

Я пошел https://www.kernel.org/doc/Documentation/serial/serial-rs485.txt Где - это пример кода для настройки RS-485.

Однако, когда я пытаюсь запустить, он всегда терпит неудачу:

status = ioctl(fd,TIOCSRS485, &ctrl485);
  if (status) {
    printf("ERROR PORT 1! TIOCSERSETRS485 failed %i", status);
    return -1;
  }

Я искал в Google все возможные комбинации RS-485, но большая часть информации касается Modbus и датчиков. Я также читал об ioctls, но все еще застрял.

Если у кого-то есть опыт или советы, я был бы очень благодарен.

С уважением, W


person wild_w    schedule 24.05.2019    source источник
comment
Показать ctrl485. Покажи, как ты открываешь fd. Какой тип status?   -  person KamilCuk    schedule 24.05.2019
comment
печатные значения: status:-1,fd:3, content of ctrl485:0,1,0,1.   -  person wild_w    schedule 24.05.2019
comment
Какое значение имеет errno?   -  person KamilCuk    schedule 24.05.2019
comment
Можете ли вы дать нам ссылку или полное название ваших устройств (обоих) и драйверов, которые вы используете?   -  person Marcos G.    schedule 24.05.2019
comment
ПК1: [cincoze.com/goods_info.php?id=24] с Debian 4.19.28-2. ПК2 - это обычный ПК с Ubuntu 4.10.0-28, на котором я использую [   -  person wild_w    schedule 24.05.2019
comment
Я вижу, с вашей настройкой вам не нужно ничего делать с RTS. Ваш USB-кабель может управлять переключением автоматически. Проблема должна быть на вашем ПК Cincoze. В соответствии с таблицей данных вы можете настроить его порт как дуплексный или полудуплексный. Можете ли вы отредактировать свое сообщение, чтобы показать вывод dmesg | grep серийный?   -  person Marcos G.    schedule 24.05.2019
comment
FWIW, образец из документации ядра, на которую вы ссылаетесь, является сломанным псевдокодом, поскольку он не инициализирует struct serial_rs485 rs485conf;, если это автоматическая переменная, ее поле flags может содержать мусор (выполните инициализацию с помощью struct .. rs485conf = {0} ). Also, some ioctls may return a positive int on success -- better to check with if (статус ‹0) ...`   -  person mosvy    schedule 24.05.2019


Ответы (1)


Я не могу быть полностью уверен, но я не думаю, что вам вообще нужно играть с переключением RTS, поскольку ваши устройства, похоже, по умолчанию поддерживают аппаратный полудуплекс.

Проверьте следующее, чтобы убедиться, что ваше оборудование правильно настроено:

Согласно руководству вашего Cincoze, вы должны выбрать режим работы каждого порта на уровне BIOS:

Настройки BIOS для COM2

Затем убедитесь, что ваш USB-кабель также работает в полудуплексном режиме с микропереключателями (по умолчанию это должно быть нормально):

Настройки USB-кабеля

И, наконец, убедитесь, что вы правильно подключаете свои устройства, следуя этим схемам:

Электрические схемы

Если ваш кабель не слишком длинный (менее 50 метров, может быть?), Вам не стоит сильно беспокоиться о нагрузке или импедансе, иначе вам может потребоваться добавить сопротивление на компьютере DB9 и переместить переключатели на USB-кабеле.

В качестве заключительного комментария имейте в виду, что ваши устройства также поддерживают полнодуплексный режим; Если вы измените настройки в соответствии с приведенными выше инструкциями, но вместо этого выберите RS422 и выполните 4-проводную настройку, вы сможете открыть терминал на обоих компьютерах и отправлять и получать одновременно, если вам это нужно.

РЕДАКТИРОВАТЬ 1: Для полноты я добавляю сюда пару ссылок для тех, кто работает с устройствами, которые не поддерживают аппаратное управление направлением:

RS485: неподходящий ioctl для устройства

Pymodbus - Чтение входного регистра счетчика энергии через RS485 на UART Raspberry Pi3

РЕДАКТИРОВАТЬ 2: Как обсуждалось в комментариях ниже, для этого конкретного оборудования, где вы можете выбирать различные режимы работы в BIOS, следует помнить еще о том, что присвоение имен портов (на уровне ОС ) может измениться при выборе нового режима работы. Используйте $cat /proc/tty/driver/serial, чтобы узнать подробности о своем оборудовании.

person Marcos G.    schedule 24.05.2019
comment
Здравствуйте, спасибо за столь обстоятельно написанный ответ! У меня все настроено, как вы написали. Поскольку я использую женский кабель Dsub между адаптером и ПК Cincoze, проводка должна быть правильной. Однако я все еще не могу передавать данные между компьютерами. Если я использую picocom со своего ПК с включенным эхом (на адаптере), я могу видеть, что я печатаю, но не нажимаю Enter, не знаю, что это означает, atm, но похоже, что проблема все еще на стороне Cincoze. - person wild_w; 27.05.2019
comment
Пожалуйста. Вы уверены насчет внутренней разводки вашего кабеля? Если у вас есть стандартный кабель RS232, мужчина к женщине, я не думаю, что он будет работать (этот кабель имеет перекрестное соединение от TX с одной стороны к RX с другой). Если у вас есть такой, я бы проверил его с помощью цифрового мультиметра, чтобы убедиться. Я даже не уверен, что будет с DB9 1: 1 (GND на разных контактах). - person Marcos G.; 27.05.2019
comment
Просто чтобы прояснить: если вы изменили настройки BIOS и микропереключатели на своем кабеле (как RS485, так и оба RS422) и ваш кабель правильный (2-проводный для RS485 и 4-проводный для RS422), вы сможете открыть picocom или аналогичная терминальная утилита с одинаковыми настройками (скорость передачи, биты данных и стоповые биты) и отправка и получение с обеих сторон. Вам не нужно нажимать Enter, я считаю, что каждый символ должен появляться по мере его ввода. Возможно, единственное, что нужно проверить, - это отключить ли у вас управление потоком (это тоже по умолчанию). И убедитесь, что у вас правильный порт, их у вас много! - person Marcos G.; 27.05.2019
comment
Еще одна мысль: если вы хотите быть уверенным, что ваш кабель не является нуль-модемом (en.wikipedia.org/wiki / Null_modem, гнездо к гнезду sub D9) вы можете легко протестировать его, установив два своих порта на компьютере Cincoze как RS232 и подключив их. Затем откройте два терминала picocom (оба на Cincoze) и введите что-нибудь. Если связь работает, это означает, что у вас есть нуль-модемный кабель и вы не можете использовать его для RS485 (или RS422). - person Marcos G.; 27.05.2019
comment
Здравствуйте, GND - это контакт 5 на обоих разъемах. Я обнаружил кое-что довольно любопытное. Если я перейду на RS-422 в BIOS, он будет работать должным образом (и на адаптере). Но когда я снова переключаюсь на полудуплекс RS-485, ничего не проходит. Это также должно означать, что кабель не является нуль-модемом? - person wild_w; 27.05.2019
comment
Я удалил свой последний комментарий, взгляните на это: exsys.it/ wp-content / uploads / ex-1303.pdf Очевидно, что если ваш кабель работает с RS422, он никогда не будет работать с RS485. - person Marcos G.; 27.05.2019
comment
Оно работает!!! Это тарабарщина, но данные отправлены! По какой-то причине, которую я не могу объяснить, название изменения отображения портов при переключении с RS-232/422 на RS-485. Трудно понять это, поэтому COM2 стал ttyS1. Я смог передать эхо с ПК Cincoze, но не наоборот, по крайней мере, что-то происходит. - person wild_w; 27.05.2019
comment
Что касается кабеля, почему это так? Адаптер - штекер, от cincoze - также штекерный разъем, а затем я использую гнездо к гнезду между ними. Проводка не повлияет на кабель, поскольку он просто отправляет все, что приходит на другую сторону? - person wild_w; 27.05.2019
comment
большой! Всегда труднее делать первые шаги, потом просто сглаживает ситуацию. Неудивительно, что при таком большом количестве портов их сложно отслеживать. Тарабарщина может означать, что что-то не так с подключением (возможно, с кабелем, как мы сказали выше) или у вас другие настройки (скорость передачи, биты данных, стоповые биты). Удачи вам, и пишите, если у вас есть другие проблемы. - person Marcos G.; 27.05.2019
comment
Действительно! Большое спасибо за помощь, отмечу как решенную :) - person wild_w; 27.05.2019
comment
Кабель имеет значение, вы должны правильно настроить его в соответствии со стандартом, который вы используете: RS232, RS485 или RS422. Если вы посмотрите ссылку, которую я разместил выше, разводка RS485 отличается от RS422. И если вы используете переходник от мужчины к женщине, убедитесь, что он не добавляет никаких переходов (иногда у вас есть нуль-модемные преобразователи от мужчины к женщине!) - person Marcos G.; 27.05.2019