1

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

2

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

Пётр.

Пётр.

3

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 сама прекращает свою работу работу.

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

Live Free or Die

4

zhevak пишет:

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

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

5

drBatty пишет:
zhevak пишет:

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

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

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

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

Live Free or Die

6 (27.11.2010 17:35:04 отредактировано Peter)

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

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

Пётр.

Пётр.

7

Peter пишет:

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

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

Peter пишет:

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

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

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

zhevak пишет:

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

8 (27.11.2010 16:29:59 отредактировано voral)

drBatty пишет:

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

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

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

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

9

voral пишет:

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

10

voral пишет:

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

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

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

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

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

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

Live Free or Die

11

drBatty пишет:

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

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

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

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

12

drBatty пишет:
voral пишет:

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

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

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

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

Live Free or Die

13

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

Пётр.

Пётр.

14

voral пишет:

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

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

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

zhevak пишет:

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

дык socket == file ab

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

15 (29.11.2010 11:11:28 отредактировано DimonK)

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

zhevak пишет:

...когда я пересел с Венды у меня был комплекс непонимания...

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

zhevak пишет:

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

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

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

16 (30.11.2010 11:11:19 отредактировано zhevak)

DimonK пишет:

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

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

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

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

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

Live Free or Die

17 (29.11.2010 16:27:36 отредактировано voral)

DimonK пишет:

По протоколу dibus (или dbus oO - не уверен)

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

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

18

Привет всем

voral пишет:

Может modbus?

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

zhevak пишет:

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

- можете ссылку дать, спасибо

19

DimonK пишет:
zhevak пишет:

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

- можете ссылку дать, спасибо

Да, пожалуйста:
http://forum.e-lug.ru/viewtopic.php?id=397
Я видимо забыл ее вписать. Извините.

Live Free or Die

20

DimonK пишет:

http://tetra.ua/soft/ - описание протокола

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

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

21

Привет всем

voral пишет:

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

voral, я тут накопал примеров работы с modbus(master-sleve) на сях, подскажите, пожалуйста, можно их будет применить(интерпретировать) к dibus. Возможно это не корректный вопрос, но мой уровень не позволяет большего ac ...

22

DimonK пишет:

voral, я тут накопал примеров работы с modbus(master-sleve) на сях, подскажите, пожалуйста, можно их будет применить(интерпретировать) к dibus. Возможно это не корректный вопрос, но мой уровень не позволяет большего ac ...

все зависит от примеров.... В любом случае в примерах стоит изучить и понять как все сделано. А там уж видно будет. Вообще в таких вещах брать чужой код опасно не разобравшись - баг вылезет замучаешься искать. Мало ли в алгоритме автор заложил копированием памяти что то кудато прописывать характерное для модбаса в неожиданном месте......

К тому же я в dibus не вчитывался особо - взглянул по диагонали ab

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me".
GNU/Linux Debian

23

Привет всем
Ладно, будем что-то думать...

24

Привет всем
Обращаюсь снова  к Вам за помощью :rolleyes:
Тут меня "до глубины душевной"  проблема тронула. Поняв, что порт на отрез отказывается со мнос сотрудничать, я максимально упростил пример от сюда http://libserial.sourceforge.net: открываю порт, устанавливаю значение структуры termios newtio и сохраняю настройки -

tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);

Затем в отладчике проганяю прогу и командой setserial просматриваю параметры порта - НИ КАКОЙ РАЗНИЦЫ   - параметры не поменялись ac  :O
Подскажите, пожалуйста, с чем это связано?

25

Я не пользуюсь отладчиком и у меня не бывало таких чудес, чтобы tcsetattr
не выполнилась. setserial для проверки програмы тоже никогда не использовал.
Надо понять, что надо от порта и эти параметры установить.
"man termios" достаточно подробный. Правда, когда я только начинал работать
с COM-портом, я пользовался книгой на русском, где termios очень подробно
описана. Это было лет 10 назад.

Пётр.

Пётр.

26

Peter пишет:

...Надо понять, что надо от порта...

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

27

Я как-то не имел с этим проблем ни в DOS, ни в Windows, ни в Linux.
Обмен всегда делается по определёному протоколу, вот и реализуйте его.
Если сомневаетесь, что tcsetattr выполняется, проверьте с помощью
tcgetattr. М.б., она выполняется, но не так, как вам хочется.
Если вы устанавливаете параметры порта с помощью termios, то вы его
полный хозяин, как напишете, так и будет работать.

Пётр.

Пётр.

28

Привет всем
С Новым Годом и Рождеством Христовым! smile

Объясните, пожалуйста, что я не так делаю :rolleyes:
Я просто сделал две проги одна пишет, другая читает (фиг уж с этими настройками!). Так вот чтение зависает...
strace показало: read(3 ... - зависание...
Тоже  и с утилой cat - виснет зараза: в консоле(при записи) отобразилась сторока(из используемого файла), курсор остановился после последнего символа и завис (вроде должно перейти к готовности принятия команд?). На чтение - сразу виснет ac
Вот чё это за ...

29

Поскольку мы не знаем, что вы делаете, поэтому не можем сказать, что вы делаете не так.
Я тоже однажды сделал две коротких программы, одна консольная в Linux, другая
с небольшим окном в Windows, обменивались данными через COM-порт. Одна посылала
строку, другая принимала, выводила на экран и посылала обратно, 1-я её принимала,
выводила и посылал новую.

То, что чтение зависает, видно и без strace. Либо неправильно настроена termios,
не в соответствии с протоколом, либо неправильно вызывается системная read.
У меня всегда была подпрограмма чтения, уже из которой вызывалась read,
т.к. были разные протоколы обмена.

Пётр.

Пётр.

30

Привет всем

Peter пишет:

Поскольку мы не знаем, что вы делаете, поэтому не можем сказать, что вы делаете не так. Пётр.

- хотел протестировать скачанные проги
http://sourceforge.net/projects/libserial/- Не получилось ac
Заием решил протестировать на уровне утилит - результат тот-же ac
(создаю файл с текстом; в одной раб. панеле записываю этот файл в порт: cat; в другой - считываю из порта....)