LINUX.ORG.RU

эмуляция хаба последовательных портов

 , ,


0

1

Есть такая программа для организации виртуального нуль-модема com0com. Это только для винды, и то, на самых последних это даже не работает (но есть рабочие аналоги). У этой программы есть возможность организовать hub из портов, когда допустим один пишет а другие порты всё это получают. Это позволяет отлаживать и разрабатывать ПО для работы с RS-485, который именно что представляет из себя «один пишет, все читают».

Для Linux есть вот что: tty0tty. Оно работает на Ubuntu 14.04 хорошо, если задать chmod 777 то под юзером порты открываются без затруднений. Есть еще socat, но он по какой-то неведомой причине часто не позволяет открыть порт под юзером, хотя допустим предыдущий запуск программы открывался порт под юзером... (chmod +s /usr/bin/socat делал)

Вопрос: есть ли аналог программы hub4com для Linux? Может это можно создать связкой утилит?

Чую NIH и уже готов написать свою софтину, но может есть готовое решение? Прошу учесть что socat, даже если так делать:

sudo echo "root" ; socat PTY,link=/home/user/ttyGUI PTY,link=/home/user/ttySRV & sleep 3 ; sudo chmod 777 /home/user/tty* ; ls -l ~ | grep tty ; echo "ok"
то не всегда порт можно открыть под юзером как ни странно, не стабильно работает. А надо чтоб hub был, т.е. аналог RS-485 сети приборов...

если задать chmod 777

Не позорься и добавь пользователя в соответствующую группу.

P.S. Когда у меня встала подобная проблема, я для отладки напилил себе софтину, которая все гоняла через QSerialPort, могла один источник в несколько распараллелить. Плюс все интерфейсы были на QIODevice и я бесплатно получил возможность лить этот трафик по сети и удобно писать логи. Но модифицировал через исходники, никаких тебе параметров командной строки, только QPushButton, только хардкор.

g0t0 ()
Ответ на: комментарий от g0t0
ls -l /usr/bin/socat
-rwsr-sr-x 1 root root 291760 февр.  1  2014 /usr/bin/socat

ls -l ~
lrwxrwxrwx  1 root root     11 мая    6 13:36 ttyGUI -> /dev/pts/35
lrwxrwxrwx  1 root root     11 мая    6 13:36 ttySRV -> /dev/pts/36

cat /etc/group | grep dia
dialout:x:20:user

И в какую же группу добавлять? Повторяюсь: раз через раз это работает. Если бы группа не была верной или что-то иное, то у меня бы это не сработало ни единого раза ;)

Про свою софтину я понял, что ж, видимо придется велосипедировать :)

I-Love-Microsoft ★★★★★ ()
Последнее исправление: I-Love-Microsoft (всего исправлений: 1)
-module(comcom).

-export([start/1]).

start(L) ->
  P = spawn(fun() -> loop() end),
  lists:foreach(fun(E) -> P ! {add_port, E} end, L).

loop(Ports) ->
  receive
    {add_port, L} -> 
      loop([port_open({spawn, "socat " ++ params ++ ComPortName}, [use_stdio, binary, eof])|Ports]);
    {Port, {data, Data}} ->
      Receivers = lists:filter(fun(E) -> E /= Port end, Ports),
      lists:foreach(fun(P1) -> port_command(P1, Data) end, Receivers),
      loop(Ports);
    {Port, eof} ->
      loop(lists:delete(Port, Ports))
  end.

не компилил и не проверял.

anonymous ()
Ответ на: комментарий от I-Love-Microsoft

Эмм. SOCAT для этого в самый раз. Он просто создает симлинки на псевдо-терминалы. Я, например, стараюсь создавать эти симлинки где-нить в ~/home/user/dev/ttySx (без ввода sudo и прочей шняги). Там в нем вроде есть трабл (фича?) типа что оно не всегда может снова открыть созданный ранее симлинк и приходится его пересоздавать заново.

Есть еще одна интересная вещь от Tibbo: http://tibbo.com/soi/vspdl.html . Но я не пробовал с ним работать - а только скомпилить и установить пробовал и всё.. Может поможет. ;)

kuzulis ★★ ()

А есть ли смысл? Классика - полудуплекс, мастер погоняет рабами во всех смыслах, в том числе и кому когда говорить. Или на 4 нитки собрался делать?

anonymous ()

Есть такая программа для организации виртуального нуль-модема com0com. Это только для винды, и то, на самых последних это даже не работает (но есть рабочие аналоги).

Неправда - все там работает. Я в Win 8.1 (правда 32-бит) использую. Там суть в том, что необходимо чтобы драйвера были подписаны, но в самом оригинальном com0com такого нету. Но я находил в гугле (на гуглокоде) и использовал инсталлер с подписанными дровишками (только для 32-бит вроде). Ссылку не дам - забыл ее, и еще вроде как гуглокод RIP, ЕМНИП.

kuzulis ★★ ()
Ответ на: комментарий от I-Love-Microsoft

И в какую же группу добавлять?

Для начала нужны правила на udev

pinkbyte@oas1 ~ $ ls -la /dev/ttyS*
crw-rw---- 1 root uucp 4, 64 мар 17 16:38 /dev/ttyS0
crw-rw---- 1 root uucp 4, 65 мар 17 16:38 /dev/ttyS1

Вот так выглядят права на реальные порты

Pinkbyte ★★★★★ ()
Ответ на: комментарий от kuzulis

и использовал инсталлер с подписанными дровишками

Дада, видел там signed пакет, может с ним бы и работало. Но не суть, надо hub и именно под Linux.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от arson

А вот именно что я эмулирую временные задержки в программах, что выступают в роли эмулируемых приборов :P Но мысль добавить это в предполагаемую программу - хороша.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от anonymous

Есть программы для разных приборов, каждая работает через последовательный порт, каждая имитирует свой тип прибора, а есть программа, которая должна по очереди работать со всеми этими приборами слушая один порт. Это как сеть RS-485. Кто сказал что мне нужен программный арбитр? Мне бы просто порты в пучок завязать, чтобы в один пишешь а во всех вылетает. Как это сделать?

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от anonymous

А коллизии ты как собрался разбирать без арбитра

никак - зачем их разбирать при отладке верхнего уровня ? у каждого свое устройство ввода/вывода, мастер делает запрос который расходится по всем устройствам, слейв чей адрес в запросе отвечает - в чем проблемы ?

anonymous ()
Ответ на: комментарий от I-Love-Microsoft

Мне бы просто порты в пучок завязать, чтобы в один пишешь а во всех вылетает. Как это сделать?

руками вестимо..проводочки завязать в пучок и образъёмить :-)

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

руками вестимо..проводочки завязать в пучок и образъёмить :-)

Как Вы себе представляете обвязку руками виртуальных портов, которые еще надо как-то создать?

мастер делает запрос который расходится по всем устройствам, слейв чей адрес в запросе отвечает

2 anonymous: Да, именно так, проблема коллизий не стоит.

Судя по ответам мне придется накатать простую программу на python которая всё это будет делать через pts (или как там их). Но это не сейчас...

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от anonymous

Мастер и есть в данном случае арбитр, об этом и речь. Но судя по описанию ТС, в его случае все базарят когда хотят, отсюда и вопрос об арбитре. ТС приводит описание к RS485, так вот по классике среда распространения полудуплекс (вариант когда Rx Tx раздельными дифпарами я так и не увидел в теме), на уровне канала никто не контролирует целостность и очередность пакетов, забота об этом ложится на писателя драйвера или если выкинуть драйверостроителя на писателя конечного ПО.
ЗЫ для отладки такой шняги на столе в моем случае проще собрать KLine, десяток резисторов, компаратор и транзистор на канал. Будет самое оно, для отладки

anonymous ()
Ответ на: комментарий от I-Love-Microsoft

Как Вы себе представляете обвязку руками виртуальных портов

а зачем виртуальные, если __реальных__ вполне себе дохрена??

простейший адаптер USB-485 или 232-485 в пределах 200р. А если вы творите софт под 485 у вас таких штуковин должно быть как грязи

MKuznetsov ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.