1 / 1 / 0
Регистрация: 22.04.2012
Сообщений: 30
|
|
1 | |
кроссплатформенный способ определения имен [активных] серийных портов (serial ports, COM1, /dev/ttyS0) и обращение к ним12.10.2012, 03:11. Показов 4528. Ответов 15
Метки нет (Все метки)
Нашел библиотеку Boost.Asio
http://www.boost.org/doc/libs/... ports.html Она позволяет обращаться к серийным портам. Мне нужно для того чтобы написать программу, посылающую AT-команды модему. Вот только не знаю как по-нормальному получить список имен этих самых серийных портов, причем желательно активных, к которым подключены устройства. Пока у меня только один вариант: делать полный перебор всех возможных имен, и пытаться опрашивать их. Но дело в том, что например в линуксе спец файл девайса серийного порта вообще говоря может находиться в любом каталоге и даже не обязательно начинаться с ttyS (при желании пользователя, особенно если он вручную драйвера ставил и заводил модем). В крайнем случае могу сделать отдельную реализацию этого процесса для Windows и для Linux. Но в таком случае скажите какие реализации лучше использовать из легко доступных в C++. На форумах обычно не пишу, но в этом случае гугл упорно не помогает мне.
0
|
12.10.2012, 03:11 | |
Ответы с готовыми решениями:
15
Кроссплатформенный способ переноса файлов Очистка экрана (кроссплатформенный способ) Нужен кроссплатформенный способ работы с папками Сканирование активных портов |
12.10.2012, 10:36 | 2 |
для этого нужна переконфигурация/пересборка ядра. вряд ли кто в здравом уме станет такое делать.
так же, маловероятно, что такой случай возможен в реальной жизни. в с++ нет никаких реализаций для работы с COM портами. в чем вопрос?
0
|
1 / 1 / 0
Регистрация: 22.04.2012
Сообщений: 30
|
|
12.10.2012, 17:35 [ТС] | 6 |
Еще как вероятно.
1) Серийный порт также может иметь например виды: /dev/ttyUSB0 /dev/ttyACM1 помимо /dev/ttyS0 https://www.redhat.com/mirrors... TO-11.html 2) Просто с /dev/tty может начинаться имя отнюдь не серийного порта, а псевдо терминала /dev/ttyp3, controlling terminal текущего процесса /dev/tty, терминала /dev/ttyI0 (кстати тоже может принимать команды модема), консоли /dev/tty0 http://www.tldp.org/HOWTO/Text... WTO-7.html Добавлено через 4 минуты Хорошо. Значит для Linux лучше всего udev, dbus для того что мне нужно. А в Windows? Добавлено через 2 минуты В C++ Бьерна Страуструпа нет и Boost. Вопрос например в том, какие удобные готовые библиотеки существуют для этого? Добавлено через 4 минуты Я не пересобирал ядро, у меня обычный Ubuntu Linux: Код
proxym@ubuntu:~$ sudo mknod -m 666 /ttyS0 c 4 64 [sudo] password for proxym: proxym@ubuntu:~$ ls / bin dev initrd.img.old mnt sbin tmp vmlinuz boot etc lib opt selinux ttyS0 vmlinuz.old data_transfer home lost+found proc srv usr ddd.txt initrd.img media root sys var proxym@ubuntu:~$ ls -lsa /ttyS0 0 crw-rw-rw- 1 root root 4, 64 2012-10-12 17:32 /ttyS0
0
|
1 / 1 / 0
Регистрация: 22.04.2012
Сообщений: 30
|
|
12.10.2012, 17:56 [ТС] | 8 |
ты писал более конкретно:
Ладно так и быть. В моей программе будет дополнительная возможность вручную указать название порта. Это логично для тех кто вручную собирает драйвера =) Но авто обнаружение портов в обычном случае мне все равно нужно, поэтому вопрос открыт пока что.
0
|
1 / 1 / 0
Регистрация: 22.04.2012
Сообщений: 30
|
|
12.10.2012, 20:44 [ТС] | 10 |
Это конечно здорово, но: "SerialPort::GetPortNames - метод .NET Framework 3.5"
Что-то мне совсем не хочется использовать .NET даже в виде такой реализации как Mono. К тому же там с этим делом сплошные проблемы: весьма неадекватное поведение в разных ОС: http://stackoverflow.com/quest... -platforms
0
|
1 / 1 / 0
Регистрация: 22.04.2012
Сообщений: 30
|
|
12.10.2012, 21:36 [ТС] | 11 |
Так, я нагуглил реализацию через WinApi http://social.msdn.microsoft.c... bc2a263ea/
0
|
1 / 1 / 0
Регистрация: 22.04.2012
Сообщений: 30
|
|
12.10.2012, 21:55 [ТС] | 12 |
Нашел еще 2 источника по теме:
1) EnumSerialPorts http://www.naughter.com/enumser.html 2) Simple Device Manager http://www.codeproject.com/Art... ce-Manager Наверно пора начать пробовать =)
0
|
1 / 1 / 0
Регистрация: 22.04.2012
Сообщений: 30
|
|||||||||||||||||||||||||||||||
13.10.2012, 18:03 [ТС] | 13 | ||||||||||||||||||||||||||||||
Касательно udev, dbus, hal...
Вот этот bash-скрипт показывает серийные устройства в линуксе:
Еще есть python скрипт.
А вот кусочек кода на C:
нужно вызвать "ioctl (fd, TIOCGSERIAL, &serinfo)", и если не будет ошибки, то серийное устройство (порт). Это решение подходит для полного перебора по "/dev/tty*". Другой вариант с использованием информации из каталога /sys и bash:
Готовый исполнимый файл выводит у меня:
0
|
1 / 1 / 0
Регистрация: 22.04.2012
Сообщений: 30
|
|
13.10.2012, 18:44 [ТС] | 14 |
В случае попытки проверки USB-девайсов на то что они серийные получаем:
1) Нужны права рута для вызова: open((*it).c_str(), O_RDWR | O_NONBLOCK | O_NOCTTY) 2) Вызов ioctl(fd, TIOCGSERIAL, &serinfo) не возвращает ноль об успешном выполнении вообще никак. errno возвращает номер 22: EINVAL (Invalid Argument). Забавно... 3) Поэтому автор той программки на C++, которую я привел во вложении к прошлому сообщению проверяет через ioctl только обычные серийные девайсы (с драйвером serial8250, но мне не нравится привязка к названию драйвера), а USB девайсы заносит в список без какой-либо проверки. Это не очень хорошо.
0
|
1 / 1 / 0
Регистрация: 22.04.2012
Сообщений: 30
|
|
14.10.2012, 20:06 [ТС] | 16 |
Да. Я же писал:
- там про реестр. Но далее я писал про Linux, в котором реестра естественно нет.
0
|
14.10.2012, 20:06 | |
14.10.2012, 20:06 | |
Помогаю со студенческими работами здесь
16
Кроссплатформенный вариант определения текущего времени Получение имён активных (залогиненных) пользователей на удалённом компьютере и их SID Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |