LINUX.ORG.RU

Ubuntu Serial Ports (бред какой-то)


0

1

Хотел протестировать свою программу под Ubuntu. Но обнаружил, что Ubuntu почему-то показывает , что у меня куча устройств ttyS*. Причем в отличии от «cat» функция open() прекрасно открывает их все! Ну и конечно прога умирает при попытке обращения к несуществующим портам. Собственно вопрос как идентифицировать в таком случае порты, причем «cat» показала, что реальные идут совершенно в разброс, а не по порядку!

Ответ на: комментарий от marvin_yorke

Ну если только прога типа терминала, которой без разницы что там висит. А если под конкретное устройство, так лучше файл с конфигурацией на каком порту устройство, чего по всем то тыкаться.

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

Лутше открыть все и по сигналу идентифицировать что там висит

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

А если под конкретное устройство, так лучше файл с конфигурацией на каком порту устройство

предлагаешь заставить пользователя подключать допустим флешку только к первому ЮСБ прорту, внешний винчестер только к второму, принтер только к 3-му итд.? Это сильно, нужно быть сильным чтобы заставить пользователя пойти на такое :)

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

Не знаю, если Убунта посоздавала эти файлы, может они содержат какуюто инфу (типо виртуальные порты), может лучше пробовать write > 0?

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

Ничего не предлагаю, просто интересно что за прога, если не лень ищи по форуму, пару раз уже поднималась тема почему портов дофига и как комы искать.

зы. неудачный пример с флешками, винтами и принтерами, первые два как диски идут, последний по имени и порт явно не пользователькая прога прописывает.

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

предлагаешь заставить пользователя подключать допустим флешку только к первому ЮСБ прорту, внешний винчестер только к второму, принтер только к 3-му итд.

С USB вообще другая история. Ты же про rs-232 спрашиваешь.

Эдди тебе все правильно написал.

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

С USB вообще другая история

Не скажи, привязывать устройство к № порта это странно, разве нет?

Эдди тебе все правильно написал.

Не спорю с ioctl. А вот с: /dev/ttyS0 — COM1 /dev/ttyS1 — COM2

Не согласен, сейчас у меня: /dev/ttyS0 — COM1 /dev/ttyS5 — COM2 /dev/ttyS6 — COM2 А программа должна работать нормально на разных дистрах.

LinuxDebian ★★★★
() автор топика

почему же бред?

файл устройства - это точка взаимодействия драйвера и user space програм. может быть даже такая ситуация, что драйвер загружен, а файла нет, или файл есть, а драйвер не загружен. и понятно бывают ситуации, когда и драйвер загружен, и файл есть, а устройства нет. что тебя совственно удивляет?

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

Я в своих приложениях, работающих с rs-232 поступаю так: даю пользователю выбрать порт, с которым он будет работать, а если он потом подключил устройство не туда - сам дурак. Как-то так...

Наверное, это не очень правильно, но зато не приходится перебирать все устройства.

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

Эта выбиралка нужна только разработчику, когда лень выяснять куда устройство воткнул, проще потыкать в разные и работающий вариант сохранить. А так вреда больше, или чьи-то шаловливые ручонки поменяют , или мудрый разработчик ПО неправильно эти порты найдет и пользователь как дурак будет искать какой-нибудь /dev/ttyACM6 среди COM1-COM16

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

чьи-то шаловливые ручонки поменяют

Ну в идеале эта настройка должна быть доступна только пользователю с правами админа (если в приложении вообще предусмотрена авторизация).

мудрый разработчик ПО неправильно эти порты найдет

Ну это уже на совести разработчика. Будет лучше, если «мудрый разработчик» захардкодит COM1?

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

Лучше если он текстовый файлик сделает с именем порта или поле для ручного ввода , плюсом к выбиралке.

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

Реально тебе нужно от силы два первых (остальные — пустышки)

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от LinuxDebian

Не согласен, сейчас у меня: /dev/ttyS0 — COM1 /dev/ttyS5 — COM2 /dev/ttyS6 — COM2 А программа должна работать нормально на разных дистрах.

Правильно я говорил: бубунта != линукс

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Чё-та вы катите на убунту, во-первый имена COMn это из винды,
во-вторый /dev/ttyS5 — COM2 /dev/ttyS6 — COM2 одно имя на один порт это перебор :).

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

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

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

Дык о чем и речь, что плохая. Если терминал для опытов, можно например
lshal | grep «linux.device_file = '/dev/tty» получить список последовательных портов, а если конкретное устройство а) сделать так чтобы жестко ОС имя присваивала и б) забить в конфиге. А забота о пользователе и чтоб «на всех дистрибутивах» это есть зло :).

ilovewindows ★★★★★
()

у меня куча устройств ttyS*

У тебя на матери куча com портов. Поздравляю. Что тебя расстраивает?

// use udev/sysfs, Luke!

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

Дада. Проще всего парсить вывод от udev, типа:

$udevadm info -a --name=/dev/ttySx, где x - искомый порт.

Те порты, где встречается subsystem=pnp это «нормальные» порты, те же, где встречается subsys=platform - «ненормальные».

После того, как сократишь круг поиска до всех «нормальных» - открывай их по очереди и пытайся опросить свою девайсину. Если ответ от девайсины пришел - значит она сидит там где надо.

Если используешь Qt - то смотри в сторону QtSerialPort, да и вообще смотри туда даже если не используешь Qt, т.к. оттуда можно взять готовую реализацию.

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

А что у вас показывает «cat /proc/tty/drivers» и «cat /proc/tty/driver/serial»? Просто интересно. И какая версия Убунту и ядра?

mky ★★★★★
()
Ответ на: комментарий от mky
sudo cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:0 rx:0
1: uart:unknown port:000002F8 irq:3
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3
4: uart:16550A port:0000C0D0 irq:17 tx:25 rx:0
5: uart:16550A port:0000C0C0 irq:17 tx:32 rx:0
6: uart:unknown port:00000000 irq:0
7: uart:unknown port:00000000 irq:0
8: uart:unknown port:00000000 irq:0
9: uart:unknown port:00000000 irq:0
10: uart:unknown port:00000000 irq:0
11: uart:unknown port:00000000 irq:0
12: uart:unknown port:00000000 irq:0
13: uart:unknown port:00000000 irq:0
14: uart:unknown port:00000000 irq:0
15: uart:unknown port:00000000 irq:0
16: uart:unknown port:00000000 irq:0
17: uart:unknown port:00000000 irq:0
18: uart:unknown port:00000000 irq:0
19: uart:unknown port:00000000 irq:0
20: uart:unknown port:00000000 irq:0
21: uart:unknown port:00000000 irq:0
22: uart:unknown port:00000000 irq:0
23: uart:unknown port:00000000 irq:0
24: uart:unknown port:00000000 irq:0
25: uart:unknown port:00000000 irq:0
26: uart:unknown port:00000000 irq:0
27: uart:unknown port:00000000 irq:0
28: uart:unknown port:00000000 irq:0
29: uart:unknown port:00000000 irq:0
30: uart:unknown port:00000000 irq:0
31: uart:unknown port:00000000 irq:0

sudo cat /proc/tty/drivers
/dev/tty             /dev/tty        5       0 system:/dev/tty
/dev/console         /dev/console    5       1 system:console
/dev/ptmx            /dev/ptmx       5       2 system
/dev/vc/0            /dev/vc/0       4       0 system:vtmaster
rfcomm               /dev/rfcomm   216 0-255 serial
ttyprintk            /dev/ttyprintk   5       3 console
serial               /dev/ttyS       4 64-111 serial
pty_slave            /dev/pts      136 0-1048575 pty:slave
pty_master           /dev/ptm      128 0-1048575 pty:master
unknown              /dev/tty        4 1-63 console

***@***:~$ uname -a
Linux *** 3.2.0-34-generic #53-Ubuntu SMP Thu Nov 15 10:48:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

О наверное можно отсеять за irq=0 ?

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

Отсеять можно по «unknown port». Можно смотреть все «serial» из /proc/tty/drivers, хотя не знаю, нужен ли вам /proc/tty/driver/rfcomm

SerialPort.GetPortNames () - почему возвращает столь значительное количество портов? (комментарий)

А так странно, почему драйвер отхватил столько устройств, обыно драйвер берёт по 4, например ttyS0-ttyS3.

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

У него, похоже, 0..3 — встроенные в мать (и, скорее всего, не существующие в виде реального разъема), а 4 и 5 — подключенный PCI->RS232

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