Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Serial-over-Ethernet
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
Doka
что нужно:
иметь возможность пробрасывать UART в LAN с собственной ембеддед-коробочки и чтобы этот UART на хосте отображался как виртуальный последовательный порт (/dev/ttyX; COMx).
в первую очередь для Linux, во вторую - для M$ XP/Vista

начал ковырять инфопространство по поиску такого стандарта:
http://en.wikipedia.org/wiki/Serial_over_LAN - implemented as a payload type under the RMCP+ protocol in IPMI (аппаратная поддержка материнками???.. из серии KVM-over-LAN?)
http://sourceforge.net/projects/serialoverip/ - 2002г, линукс-то-линукс (не создаётся виртуального девайса)

огромное число коммерческих решений, использующих проприетарные(?) протоколы??
http://www.netburner.com/products/serial_to_ethernet.html
http://www.dcbnet.com/datasheet/ss1ds.html
http://www.industrialethernet.com/net232-dte.html
http://www.moxa.ru/group/listAll/14890/
- но это железки, а интересует лишь "стандартный" драйвер для хоста (виртуальный ком-порт) и описание инкапсуляции протокола для реализации на стороне ембеддед-девайса.

вот интересный продукт (Win & Lin) - http://www.virtualserialport.com/ :



но как это реализовывать на стороне ембеддед-девайса???




UPD: http://en.wikipedia.org/wiki/COM_port_redi...ource_solutions - вот тут список решений еще, кто-нибудь использовал что-нибудь из этого?..
rx3apf
Цитата(Doka @ Jan 5 2011, 14:10) *
что нужно:
иметь возможность пробрасывать UART в LAN с собственной ембеддед-коробочки и чтобы этот UART на хосте отображался как виртуальный последовательный порт (/dev/ttyX; COMx).

но как это реализовывать на стороне ембеддед-девайса???

Может, я что не понимаю, но... Те решения, которые я видел, никакими особенными протоколами не страдали. Т.е. приходит пакет, и все его поле данных уходит на UART. Приходит с UART - укладывается в пакет и, по превышению границы и/или таймауту отправляется. Тупо и незатейливо. Беру, скажем, Xport, UART которого соединен с моим UARTом, на другом конце ихний же "Redirector", создающий виртуальный COM, и терминалом работаю со своим устройством как напрямую. Но не нравится мне этот редиректор, на самом деле. Взял TCP-COM от Taltech. Ну, чуток его "вылечил" от черезмерной жадности, и все так же работает (причем еще умеет и через UDP). Вместо Xport у меня сейчас SIM900 с встроенным GPRS-стеком в прозрачном режиме - а все так же работает, даже и на задумываюсь... Можно глянуть, как работает мост IP-UART вот в этой игрушке - http://trt.ru/design/solutions/trt-ethernet.htm (там все сырцы есть).
Однако, "кстати о птичках" - если мне кто подскажет альтернативу TCP-COM, правильно работающую через UDP (у него проблема - если на другом конце меняется порт, то он это не замечает, продолжает слать на тот, от которого пришло изначально, реагирует только на смену IP отправителя) - было бы весьма интересно...
Doka
>> Можно глянуть, как работает мост IP-UART вот в этой игрушке - http://trt.ru/design/solutions/trt-ethernet.htm (там все сырцы есть).

спасибо, это вот уже близко к тому что надо
однако, в "Microchip TCPIP User's Guide" я не нашёл модуля STACK_USE_UART2TCP_BRIDGE (мост UART/TCP), т.е. это какая-то нестандартная штука, дописанная потом.
а хотелось бы более-менее стандартное решение, (и желательно более-менее нативное в линуксе - в плане нативных средств для поднятия "витруальных" tty оторбажённых на LAN)
rx3apf
Цитата(Doka @ Jan 6 2011, 00:45) *
однако, в "Microchip TCPIP User's Guide" я не нашёл модуля STACK_USE_UART2TCP_BRIDGE (мост UART/TCP), т.е. это какая-то нестандартная штука, дописанная потом.

Ну, я не вчитывался, а исходник есть...
Цитата
а хотелось бы более-менее стандартное решение, (и желательно более-менее нативное в линуксе - в плане нативных средств для поднятия "витруальных" tty оторбажённых на LAN)

Про линукс ничего сказать не могу, и под винды ничего не писал (обходился готовым софтом), но речь-то о другом - никаких особых протокольных тонкостей там нет (я, по крайней мере не встречал). Данные туда - данные обратно. И ничего кроме данных. Тривиально. Можно любым сниффером (Wireshark, к примеру) поглядеть, что там бегает...
khach
А как же тогда скорость задавать, линии квитирования контролировать и управлять ими? Работать с 7 битными данными и сданными с битом четности (9-битовыми)? А если софтовый флоу контрол обрабатывать надо?
rx3apf
Цитата(khach @ Jan 6 2011, 03:02) *
А как же тогда скорость задавать, линии квитирования контролировать и управлять ими? Работать с 7 битными данными и сданными с битом четности (9-битовыми)? А если софтовый флоу контрол обрабатывать надо?

Со стороны COM ->IP это в принципе не особо нужно нужно (можно игнорировать, в общем-то, байт данных есть - его достаточно), если только нет потребности манипулировать скоростью и режимами на лету (тогда облом, естественно), софтовый flow control пройдет прозрачно и будет работать (если его обеспечит клиентская часть). А обратно, IP->UART - это уже клиент должен сам настроить, иначе никак. Ну, может быть и есть такие решения - но я не встречал, обычно все прозрачно и незатейливо.
khach
Flow control вроде реализован в Stellaris® Serial-to-Ethernet Reference Design Kit http://www.luminarymicro.com/products/rdk-s2e.html . Исходники дают.
Doka
Цитата(khach @ Jan 6 2011, 03:30) *
Flow control вроде реализован в Stellaris® Serial-to-Ethernet Reference Design Kit http://www.luminarymicro.com/products/rdk-s2e.html . Исходники дают.


этот вообще судя по документации использует Telnet для обёртывания UARTов (RFC2217, RFC854)
rx3apf
Цитата(Doka @ Jan 6 2011, 22:26) *
этот вообще судя по документации использует Telnet для обёртывания UARTов (RFC2217, RFC854)

А Telnet - это ведь все то же самое, за исключением того, что некоторые коды обрабатываются специальным образом. Я, кстати, так и не понял, почему байт 00 не проходит через Telnet, вроде бы все спецкоды в конце ? Или невнимательно читал ? А так - все то же (зацеплялся со своими устройствами с RAW-потоком)...
sasamy
Цитата(Doka @ Jan 5 2011, 14:10) *
что нужно:
иметь возможность пробрасывать UART в LAN с собственной ембеддед-коробочки и чтобы этот UART на хосте отображался как виртуальный последовательный порт (/dev/ttyX; COMx).
в первую очередь для Linux


В Linux это элементарно делается без всякого драйвера и протокол наистандартнейший - как уже тут писали просто нет никакого протокола sm.gif данные из сокета пишутся в порт. По Вашей же ссылке есть такой проект
http://lpccomp.bc.ca/remserial/

там кода 10 кб который работает и как сервер расшаривающий реальный uart и как "эмулятор" виртуального порта.

PS только что проверил на localhost Ubuntu с преобразрователем usb<->serial в качестве расшариваемого uart - работает.
Ostrov
Очень, очень давно успешно использовался ser2net ( sourceforge.net/projects/ser2net/ )
позволяет настраивать /dev/ttyXX, TCP port, (raw, rawlp, telnet, off) timeout, speed, parity-bits, stop-bits, data-bits, xonxoff rtscts
Для удобства на стороне Win использовался (Tibbo Device Server Toolkit на тот момент был последний релиз версии 3.x,
сейчас там поновее есть, (бесплатно с оговоркой) с последними "не знаком" (в то время и выбирать не пришлось на устройстве сетевом была интегрирована плата конвертер интерфейсов. (tibbo.com/downloads/soi/tdst.html)




Для удобства на стороне Win использовался (Tibbo Device Server Toolkit
Включает VSPD (Драйвер Виртуального COM-порта) и Мастер настройки подключения - для быстрой настройки нового соединения.
и прямо под ним в списке программ Драйвер Виртуального COM-порта для Linux (не знаком)
Doka
Цитата(Ostrov @ Jan 9 2011, 09:25) *
Очень, очень давно успешно использовался ser2net ( sourceforge.net/projects/ser2net/ )
позволяет настраивать /dev/ttyXX, TCP port, (raw, rawlp, telnet, off) timeout, speed, parity-bits, stop-bits, data-bits, xonxoff rtscts
Для удобства на стороне Win использовался Tibbo Device Server Toolkit


вот это уже ближе к теме. учитывая что ser2net входит в дистрибутив ред-хата,
а на виндовз стороне можно заюзать вот это, судя по комментариям (страничка ser2net): "connect it with com0com using com2tcp and You will get virtual comport under WinXp."
полный freeware rolleyes.gif
Ostrov
Цитата(Doka @ Jan 10 2011, 14:35) *
вот это уже ближе к теме. учитывая что ser2net входит в дистрибутив ред-хата,
а на виндовз стороне можно заюзать вот это, судя по комментариям (страничка ser2net): "connect it with com0com using com2tcp and You will get virtual comport under WinXp."
полный freeware rolleyes.gif



Я заострил внимание на VSP Manager (используется для создания и управления Виртуального COM-порта (VSPs).) в принципе только этот компонент и требуется установить для подобной задачи
ввиду двух на тот момент важных для меня обстоятельствах (кроме прочих других "полизняшках")
управлялось большое количество разнесенных по всему городу хостов/устройств

-До 256 портов на одном компьютере.
-MAC-->IP Mapping позволяет привязать устройство по MAC-адресу (при включенном DHCP протоколе ip-адрес может поменяться).
И увы по бедности я не смутился использовать его не по назначению т.е. не с продукцией от производителя
Reanimator++
Чет не соображу, каким образом происходит ограничение скорости передачи со стороны компа?
Т.е. допустим мы льем очень толстый файл в IP:Port преобразователя - каким образом он будет скорость льющего ограничивать?
Средствами TCP? квитки задерживать? Это значит что в преобразователе взаимодействие со стеком должно быть продуманное...
VslavX
Цитата(Reanimator++ @ Jan 17 2011, 12:14) *
Средствами TCP? квитки задерживать? Это значит что в преобразователе взаимодействие со стеком должно быть продуманное...

Хендшейк предусмотрен в самом TCP - приемник в каждом пакете сообщает размер окна - свободного места в приемном буфере. Поэтому тут ничего особо придумывать не нужно - по TCP ничего лишнего прийти не может.
TobyBar
Цитата(Doka @ Jan 5 2011, 09:10) *
что нужно:
иметь возможность пробрасывать UART в LAN с собственной ембеддед-коробочки и чтобы этот UART на хосте отображался как виртуальный последовательный порт (/dev/ttyX; COMx).
в первую очередь для Linux, во вторую - для M$ XP/Vista

начал ковырять инфопространство по поиску такого стандарта:
http://en.wikipedia.org/wiki/Serial_over_LAN - implemented as a payload type under the RMCP+ protocol in IPMI (аппаратная поддержка материнками???.. из серии KVM-over-LAN?)
http://sourceforge.net/projects/serialoverip/ - 2002г, линукс-то-линукс (не создаётся виртуального девайса)

огромное число коммерческих решений, использующих проприетарные(?) протоколы??
http://www.netburner.com/products/serial_to_ethernet.html
http://www.dcbnet.com/datasheet/ss1ds.html
http://www.industrialethernet.com/net232-dte.html
http://www.moxa.ru/group/listAll/14890/
- но это железки, а интересует лишь "стандартный" драйвер для хоста (виртуальный ком-порт) и описание инкапсуляции протокола для реализации на стороне ембеддед-девайса.

вот интересный продукт (Win & Lin) - http://www.virtualserialport.com/ :



но как это реализовывать на стороне ембеддед-девайса???




UPD: http://en.wikipedia.org/wiki/COM_port_redi...ource_solutions - вот тут список решений еще, кто-нибудь использовал что-нибудь из этого?..


Если не ошибаюсь, то тут скрин Serial to Ethernet Connector от Eltima, а адрес домена странный и открывается VSPD. Вот тут есть описание этого продукта и на русском http://www.eltima.com/ru/products/serial-over-ethernet/
svss
Путаете LAN-connected COM-port и
SOL (serial over LAN).
Впрочем, автор темы тоже, но меньше и - 6 лет тому назад.
Tarbal
Я бы сделал так.

1. Посылать сериальные пакеты через UDP на хост. Ну и обратно также.
2. На хосте ставится драйвер, создающий повторитель порта. Это такая фигня, что у нее возникают два сериальных устройства в системе. Они соединены между собой. Что посылается в одно из них мгновенно появляется на выходе второго. Надо поискать в интернете и скачать. Вот навскидку. Я не проверял, но похоже оно. Сделайте поиск сами.
https://freevirtualserialports.com/
https://sourceforge.net/projects/com0com/
http://kc.flexradio.com/knowledgebasearticle50062.aspx
3. Пишете простую апликацию, соединяющую сериальный порт с UDP портом.

Здесь написано как сделать на TCP, но UDP сериальному соединению больше подходит. Я советую сделать на UDP.
com0com.sourceforge.net/doc/UsingCom0com.pdf

Идея понятна?
Рыжий Тигра
Нужна помощь!

Есть Raspberry Pi 3, на нём pppd через GPRS-модем (скорость приёма-передачи - хорошо если 30-40 килобод), преобразователь USB-COM (подключен к некоему устройству на скорости 115200) и ser2net. На другом конце TCP-соединения - комп под Windows, на нём HW VSP (бесплатный однопортовый) и программа, которая умеет обмениваться пакетами с упомянутым устройством через COM-порт.
Проблема: как только размер отправляемого c компа пакета превышает три-четыре десятка байт, как в связке HWVSP-TCP-ser2net начинаются неприятности - пакет принимается на другом конце в два приёма: приходит начало пакета, а после паузы в три-четыре сотни миллисекунд - остальное. Устройство, натурально, расценивает этот таймаут как недопустимо большой и отбрасывает обе половинки пакета.
Опытным путём удалось установить, что допустимый интервал между байтами пакета - в пределах 20-30 миллисекунд, максимальный размер пакета - 255 байт, а программа не отправляет следующий пакет, пока не получит ответ на предыдущий либо пока не истечёт таймаут (а у программы он довольно длительный - десятки секунд).
Соответственно, вопрос: либо что можно сделать, чтобы пакеты не рвались при их передаче через TCP, либо какую софтинку применить на Windows-стороне, чтобы изображала из себя COM-порт и передавала данные UDP-пакетами?
Студент заборстроительного
Что ваяяете если не секрет?
Хотите сделать свой велосипед - аналог эзеркат?

Мы уже работаем над этим.
Поэтому, ребят, можете "расслабиться".
Как сделаем Вам написать за сколько у нас Вы его сможете купить?
Рыжий Тигра
Студент заборстроительного, ситуация ещё хуже - уже всё купили: и станок с микроскопическим таймаутом, и прогу к нему, и raspberry, и даже модем GPRS'ный. Больше начальство ни копейки не даст. А запустить всё это надо до конца позапрошлой недели. :-( Поэтому максимум, что могу позволить себе (или кому-то) до конца года наваять, это .ini-файл или конфигу к готовой софтинке; в особо крайнем случае - взять софтинку опен-сорсную и дописать кусочек к ней. Пока упёрся в катастрофическое незнание - какую именно софтинку курочить. :-(
Студент заборстроительного
Цитата(Рыжий Тигра @ Dec 27 2017, 20:35) *
Студент заборстроительного, ситуация ещё хуже - уже всё купили: и станок с микроскопическим таймаутом, и прогу к нему, и raspberry, и даже модем GPRS'ный. Больше начальство ни копейки не даст. А запустить всё это надо до конца позапрошлой недели. :-( Поэтому максимум, что могу позволить себе (или кому-то) до конца года наваять, это .ini-файл или конфигу к готовой софтинке; в особо крайнем случае - взять софтинку опен-сорсную и дописать кусочек к ней. Пока упёрся в катастрофическое незнание - какую именно софтинку курочить. :-(

"Плохо когда пироги начинает печь сапожник, а сапоги точать - пирожник"©
Рекомендую Вам выбросить на помойку всё Вами перечисленное и поменять специальность beer.gif
Рыжий Тигра
Студент заборстроительного, взаимно. Торгуй лучше гербалайфом. Или вискасом. Программы продавать - явно не твоё. :-(
Tarbal
Цитата(Рыжий Тигра @ Dec 26 2017, 21:25) *
Нужна помощь!

Есть Raspberry Pi 3, на нём pppd через GPRS-модем (скорость приёма-передачи - хорошо если 30-40 килобод), преобразователь USB-COM (подключен к некоему устройству на скорости 115200) и ser2net. На другом конце TCP-соединения - комп под Windows, на нём HW VSP (бесплатный однопортовый) и программа, которая умеет обмениваться пакетами с упомянутым устройством через COM-порт.
Проблема: как только размер отправляемого c компа пакета превышает три-четыре десятка байт, как в связке HWVSP-TCP-ser2net начинаются неприятности - пакет принимается на другом конце в два приёма: приходит начало пакета, а после паузы в три-четыре сотни миллисекунд - остальное. Устройство, натурально, расценивает этот таймаут как недопустимо большой и отбрасывает обе половинки пакета.
Опытным путём удалось установить, что допустимый интервал между байтами пакета - в пределах 20-30 миллисекунд, максимальный размер пакета - 255 байт, а программа не отправляет следующий пакет, пока не получит ответ на предыдущий либо пока не истечёт таймаут (а у программы он довольно длительный - десятки секунд).
Соответственно, вопрос: либо что можно сделать, чтобы пакеты не рвались при их передаче через TCP, либо какую софтинку применить на Windows-стороне, чтобы изображала из себя COM-порт и передавала данные UDP-пакетами?


Вы собрали из готовых кусков или что-то сами писали?
Условие, стимулирующее начало передачи пакета настолько неоднозначное и есть много взаимоисключающих критериев, что надо в каждом случае индивидуально отлаживать. Если сами писали код, то не помешает после записи сделать вызов int fsync(int fd);
smart_pic
В программе HWVSP-TCP-ser2net есть настройки, можно ими поиграться немного. Есть режим эмуляции времени передачи по СОМ порту.
потом можно снизить скорость на СОМ порту до 9600 и сделать больше буфер приема. Некоторые проги рассчитывают таймауты относительно скорости передачи (в некоторых случаях помогало)
_Thomas_
Цитата(Рыжий Тигра @ Dec 26 2017, 19:25) *
Соответственно, вопрос: либо что можно сделать, чтобы пакеты не рвались при их передаче через TCP, либо какую софтинку применить на Windows-стороне, чтобы изображала из себя COM-порт и передавала данные UDP-пакетами?

Если не можете разобраться / настроить / нет желания ковыряться с багами "вашей" виндовой программы - то стоит взять какой-либо одноплатный компьютер с линуксом, прокидывать сериал туда по сети, а с одноплатника уже в к комп с виндой - либо через USB Device / OTG + g_serial, либо через USB-Serial мост.

В общем случае у вас контроля над фрагментацияй пакетов по сети нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.