LinuxForum.Fans
Тема

Создать кольцо двух СOM-портов

Автор: DimonK 36 сообщений 11107 просмотров
#102126

Привет всем
Помогите, пожалуйста :rolleyes:, примером или инфой, как организовать кольцо 2-х сом-портов на компе(простой обмен битами).Т.к. я только начинаю бурное знакомство :D,
если можно, что-нибудь по-проше, для чайников

#102256

Программно совершенно без проблем. Чем пользоваться, зависит от решаемой задачи.
man termios, man select, man cu.

Пётр.

#102291
DimonK написал:
Привет всем
организовать кольцо 2-х сом-портов на компе(простой обмен битами).

И Вам привет!

Про СОМх забываем, этот термин Вендовый термин здесь не применяется. В Линуксе любая сущность -- это файл. Если Вам удастся уловить смысл этой парадигмы, дальше пойдет легче. Итак, поехали.

Все что шевелится -- это процессы. Все, что не шевелится -- это файлы. Под файлом понимается все, откуда можно брать или, наоборот, записывать информацию. Таким образом, последовательный порт, который у железячников раньше именовался RS232C, в контексте Линукса -- это тоже файл.

Идем дальше. Что можно делать с файлом? Упрощенно: читать из него, писать в него. Применительно к последовательному порту, Вы копируете информацию из файла последовательного порта в обычный дисковый файл или же наоборот -- копируете инфу из обычного дискового файла в файл последовательного порта. Что называется: проще некуда!

Файлы последовательных портов располагаются в директории /dev наряду с файлами других устройств и портов. Файлы последовательных портов называются незатейливо: ttyS0, ttyS1, ttyS2. Обратите внимание, нумерация начинается с нуля. Поскольку в Линуксе большие и маленькие буквы в названиях файлов имеют значение, то имена нужно набирать так (в том регистре), как указано.

Следует также заметить, что поскольку файлы располагаются не в текущей директории (т.е. той, где Вы даете свою команду), то вы не можете обращаться к ним по одному лишь имени, Вам обязательно нужно указать полный путь. Например, так /dev/ttyS0

Таким образом копирование информации из порта в дисковый файл можно выполнить с помощью команды:

$ cat /dev/ttyS0 myfile.txt

(знак доллара набирать не надо! Это подсказка шела.)

Если нужно отправить содержимое файла в порт, то делаем так:

$ cat myfile.txt /dev/ttyS0

Процесс копирования будет идти "молча", т.е. на экране Вы ничего не увидите. Это тоже одна из парадигм Линукса -- зачем орать, создавать лишний шум, привлекать к себе внимание, если все идет хорошо? Но если Вы хотите видеть, как идет процесс, то можете "расщепить" поток информации на два. Один пойдет так, как Вы задумывали, а второй (дубль первого) -- направить на консоль. Делается это добавление канала и команды tee:

$ cat /dev/ttS0 | tee myfile.txt

Возможно Вам понадобится сначала настроить скорости последовательных портов (точнее -- терминалов). Делается это командой stty. Например, мне надо установить максимальную скорость обмена. Я делаю так:

$ stty -F /dev/ttyS0 115200

Да, и не забывайте, что волшебная комбинация Ctrl-C прекращает процессы. А комбинация Ctrl-D -- вводит в поток символ "конец файла", по получении которого команда cat сама прекращает свою работу работу.

Надеюсь, мой ликбез поможет еще кому-нибудь продвинуться в направлении "приручения" Линукса.

#102298
zhevak написал:
Таким образом, последовательный порт, который у железячников раньше именовался RS232C

и сейчас так называется ;)

DimonK,
1) понадобятся права рута
2) понадобится спаять кабель (в инете посмотрите, давно я такой ерундой не занимался, но раньше было. И сейчас есть)
3) на приёмнике
$ cat /dev/ttyS0
4) на передатчике
$ cat >/dev/ttyS0


Вот только... Порты эти сейчас виртуальные, потому может и не сработать. Возможно придётся поднастроить удав, хал, и прочие прокладки :(

#102300
drBatty написал:
[quote=zhevak]Таким образом, последовательный порт, который у железячников раньше именовался RS232C

и сейчас так называется ;)
[/quote]
Не-не! Уже много лет лет, как его переименовали в AIE/TIE-232. Спросите у Гугла.

Мне это новое наименование тоже поперек горла стоит -- фиг выговоришь! Когда я на форуме электроники (electrinix.ru) произношу "RS-232", в меня летят гнилые помидоры.

#102416

Никогда не использовал cat для связи с COM-портом и не понимаю этой идеи.
Для этого применяются терминальные программы. Если с одной сторны только
приём, то на ней может быть cu, а для передачи всегда использовал самописную,
делающую то, что мне надо. Однако, если на друго стороне только передача,
м.б., будет работать и cat.

И что значит "виртуальные порты", что под этим понимается?
Они же есть физически на плате.

Пётр.

#102436
Peter написал:
Никогда не использовал cat для связи с COM-портом и не понимаю этой идеи.

идея в проверке самой идеи. cat вообще никак не работает, а просто копирует потоки. На практике конечно нужно использовать специальную программу.

Peter написал:
И что значит "виртуальные порты", что под этим понимается?
Они же есьт физически на плате.

порты-то есть, вот только файл /dev/ttyS0 вовсе не напрямую приаттачен к порту. Там всё намного сложнее и запутаннее.

ЗЫЖ вообще не понимаю этих портов. ИМХО куда как удобнее I2C для тормозных устройств, и LPT для более быстрых. Ну а ещё лучше - USB.

zhevak написал:
Не-не! Уже много лет лет, как его переименовали в AIE/TIE-232. Спросите у Гугла.

спасибо. будем знать.

#102451
drBatty написал:

2) понадобится спаять кабель (в инете посмотрите, давно я такой ерундой не занимался, но раньше было. И сейчас есть)

Явно должно быть решение и без кабеля. Под виндой по крайней мере я пользовался прогами "соединяющими" сом-порты.

zhevak
это все хорошо. Но, если я правильно понимаю человеку нужно подсоединить одну совтину к одному порту, другую к другому на одном и том же компе. И при это получить связь между совтинами.
Можно и тут обойтись обычной работой как с файлом?Ведь "как файл" порты будут открыты совтинами. А вот что будет прокидывать поток из одного порта в другой...

#102457
voral написал:
Явно должно быть решение и без кабеля. Под виндой по крайней мере я пользовался прогами "соединяющими" сом-порты.

какой в этом смысл??

делать нечего?

#102469
voral написал:

zhevak
это все хорошо. Но, если я правильно понимаю человеку нужно подсоединить одну совтину к одному порту, другую к другому на одном и том же компе. И при это получить связь между совтинами.
Можно и тут обойтись обычной работой как с файлом?Ведь "как файл" порты будут открыты совтинами. А вот что будет прокидывать поток из одного порта в другой...

А, да! Хорший вопрос! Может быть нам Петр немножко прояснит свою ситуацию. Если можно чуть по-подробнее -- что значит "кольцо 2-х сом-портов на компе"?

Если это петля (loop), то чем продиктована необходимость использовать последовательные порты, а не другие способы межпроцессного взаимодействия? (Например, разделяемая общая память, каналы, сокеты, ...)

На сколько я понял, Вы владеете искусством программинга. Следует-ли из этого, что перед Вами стоит задача написать именно свою прогу, а не использовать штатные средства Линукса? (Подсказка, когда я пересел с Венды у меня был комплекс непонимания. Я стал писать свои доморощенные проги, а потом понял, что то, что мне реально нужно для решения своих задач, в Лине уже все это есть. И моя задача не написать +1 одну прогу, а разобраться с у же существующими. Одно из положений философии Линукса заключается в том, что не нужно на каждую мега задачу создавать монструозный мега-инструмент, а нужно иметь (и, соответственно, хорошо знать!) множество мелких хорошо стыкуемых друг с другом утилит. Во втором случае функциональность не будет дублироваться во многих программах, а решение уникальной задачи сведется только к подбору правильных инструментов (утилит).

Можно конечно, написать и свою прогу (исполняемый) файл, но это не есть unix-way. Ибо Вы создаете прогу, корячитесь с ее отладкой, потом убеждаете заказчика купить ее. А через полгода, заказчик читает на форуме, как его задача решается с помощью набора утилит и простенького скрипта. Решение обошлось бы ему на два порядка дешевле. А уж себе любимому, тем более не стоит потеть с изобретением очередного велосипеда. Хотя... если стоит задача разобраться с тем как оно (ядро или вообще Линух) работает, то -- да.

Не зная специфики Вашей задачи, сложно что-либо посоветовать. При недостатке информации, обсуждения в темах имеют нехорошее свойство сваливаться в перебранку участников. Слов много, я пользы мало. Пожалуйста, опишите свою задачу более подробно.

#102472
drBatty написал:

какой в этом смысл??
делать нечего?

угу. я на этом "не чего делать" иномарку новую купил. :)

Если серьезно. Писал приложение для работы с некой железякой. Общение с которой через ком порт. Имелся программный эмулятор этой железяки (даже не просто эмулятор, он и данные генерил необходимые). Вот сответсвтенно я и соединил совю программу с эмулятором через порт. Более того на компе где не было двух свободных портов. Я добавлял в той же проге виртуальный. Который система видела как "всамделешный"

#102473

drBatty написал:
[quote=voral]Явно должно быть решение и без кабеля. Под виндой по крайней мере я пользовался прогами "соединяющими" сом-порты.

какой в этом смысл?[/quote]

Смысл примерно такой же, какой в localhost (127.0.0.1) -- отладка софта сначала на локальном месте. Потом разнесение частей софта на удаленные компы, или на комп + удаленное_устройство. На практие такое иногда бывает.

Например, отладка программ под отладчиком (gdb)/
Еще пример, программирование и отладка микроконтроллеров -- тоже через сокеты идет на "ура!"
#102486

Задача не моя, а DimonK.
Я неточно выразился, я не делал свою терминальную программу, а в своих программах,
работающих с COM-портом, инициализировал его, как мне надо, а для чтения/записи
использовал свои небольшие подпрограммы, вызывющие системные write/read.
Это подпрограмы отличались в зависимости от интерфейса устройства, с которым
надо было связываться через COM-порт, т.е. от формата посылок.

Пётр.

#102492
voral написал:
угу. я на этом "не чего делать" иномарку новую купил. smile

Если серьезно. Писал приложение для работы с некой железякой. Общение с которой через ком порт. Имелся программный эмулятор этой железяки (даже не просто эмулятор, он и данные генерил необходимые). Вот сответсвтенно я и соединил совю программу с эмулятором через порт. Более того на компе где не было двух свободных портов. Я добавлял в той же проге виртуальный. Который система видела как "всамделешный"

а... в Linux это не нужно. создайте FIFO (man mkfifo), и пусть одна программа пишет в него, а другая - читает. Когда будете делать в железе, просто пишите/читайте не в/из fifo, а в/из девайса. Например в /dev/ttyS0. Кроме того, посмотрите в сторону man 2 pipe (Linux Programmer's Manual), может это подойдёт больше. Только в венде надо так извращаться, линуксовое ядро почти любое устройство показывает как файл. (единственное исключение - сетевой интерфейс, вот с ним петля lo и нужна по этому. Есть ещё петля - mount -o loop, но там файл из файловой системы монтируется обратно в файловую систему). Ну а с другими устройствами никаких петель не требуется.

zhevak написал:
ще пример, программирование и отладка микроконтроллеров -- тоже через сокеты идет на "ура!"

дык socket == file :)

#103012

Привет всем
Большое Вам спасибо за участие smile

zhevak написал:

...когда я пересел с Венды у меня был комплекс непонимания...
- тогда вы меня поймете - я перешел на линуху НЕДЕЛЮ назад...

zhevak написал:

Не зная специфики Вашей задачи, сложно что-либо посоветовать. При недостатке информации, обсуждения в темах имеют нехорошее свойство сваливаться в перебранку участников. Слов много, я пользы мало. Пожалуйста, опишите свою задачу более подробно.

А задача заключается вот в чем: существует терминал со своим диспетчером, с ним будут связываться устройства по RS-485 (ой, простите AIE/TIE-485, или как-там...). По протоколу dibus (или dbus oO - не уверен) Кто-нибудь работал с этим протоколом? Описание у меня есть, но вот примеры на сях работы сним нет. Если это возможно, не откажите с примерами :rolleyes:

Теперь о "кольцах" - ну надо же с чего-то начинать wink. Я взял кабелину, закольцевал два порта, тупо посмотрев на это чуду(я и на винде не работал с обменом данных) и начал что-то ваять...
И вот обратился к Вам за помощью...

#103022
DimonK написал:
тогда вы меня поймете - я перешел на линуху НЕДЕЛЮ назад...

:) Поздравляю! И в добрый путь!

Вот тут, на нашем городском форуме LUG-а

http://forum.e-lug.ru/viewtopic.php?id=397

я оставил много (раскиданного по многим темам) материала. Думаю, что Вы найдете кое-какие ответы на свои вопросы. Что-то конкретное я Вам не могу показать, но просто погуляйте по форуму. Там есть несколько моих статей для гиков, которые разрабатывают свои гаджеты и связывают из с компами.

#103092
DimonK написал:
По протоколу dibus (или dbus oO - не уверен)

Может modbus?
попробую вспомнить/найти примеры.
http://ru.wikipedia.org/wiki/Modbus

#103266

Привет всем

voral написал:
Может modbus?
- Нет, именно dibus (или dbus)
http://tetra.ua/soft/ - описание протокола

zhevak написал:
Вот тут, на нашем городском форуме LUG-а...
- можете ссылку дать, спасибо
#103277

DimonK написал:

[quote=zhevak]Вот тут, на нашем городском форуме LUG-а...
- можете ссылку дать, спасибо[/quote]
Да, пожалуйста:
http://forum.e-lug.ru/viewtopic.php?id=397
Я видимо забыл ее вписать. Извините.
#103306
DimonK написал:
http://tetra.ua/soft/ - описание протокола

Ясно. Достаточно не сложный протокол.

Войдите или зарегистрируйтесь, чтобы ответить.