|
|
  |
Открыть COM USB в Linux |
|
|
|
Mar 26 2017, 10:20
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Дело такое: нужно открыть виртуальный COM порт в Linux так, чтобы любой другой процесс / поток/задача не мог получить возможность писать-читать из этого порта пока он занят. То есть при попытке открытия занятого порта - выдавалась ошибка BUSY что то подобное CODE /* Открываем порт */ com_fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY); if (com_fd < 0) { perror("open"); break; } printf("INFO: port open OK\n"); tcgetattr(com_fd, &oldtio); /* сохранение текущих установок порта */ bzero(&newtio, sizeof(newtio));
/* Неканонический режим. Нет эхо. 8N2 */ newtio.c_cflag |= (CLOCAL | CREAD);
то есть какие флаги нужно поставить, чтобы при попывтке открыть уже открытый порт выдавалась ошибка. PS проверяю на виртуалке VirtualBox -мжет в том проблема
|
|
|
|
|
Mar 26 2017, 14:07
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(Эдди @ Mar 26 2017, 15:59)  Любые блокировки только под юзером работают. Для блокировки используйте ioctl(comfd, TIOCEXCL). Но еще раз повторю: если рутом открывать, этот лок не сработает. не рутом. юзверем который в группе dialup
|
|
|
|
|
Mar 26 2017, 14:25
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(Эдди @ Mar 26 2017, 15:59)  Для блокировки используйте ioctl(comfd, TIOCEXCL). какой заголовочник включить, чтобы это работало? перепробовал десяток! все разобрался. <asm/ioctls.h> правда мне всегда казалось что это можно делать не на уровне пользователя.
|
|
|
|
|
Mar 27 2017, 20:47
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(inventor @ Mar 26 2017, 17:25)  правда мне всегда казалось что это можно делать не на уровне пользователя. Если казалось  , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра.
|
|
|
|
|
Mar 27 2017, 21:31
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(Olej @ Mar 27 2017, 23:47)  Если казалось  , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра.  я имел ввиду что мне показалось что заголовки в папке linus\asm и подобные можно пользоваться только на уровне драйверов
|
|
|
|
|
Mar 27 2017, 21:51
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(inventor @ Mar 28 2017, 00:31)  я имел ввиду что мне показалось что заголовки в папке linus\asm и подобные можно пользоваться только на уровне драйверов Когда кажется - перекреститься нужно! А заголовочные файлы ядра и (часто подобные им) заголовочные файлы пространства пользователя - лежат в совершенно разных местах. В модулях ядра (то что вы называете драйверами) могут использоваться только и исключительно заголовочные файлы ядра, вот отсюда: Код $ ls /lib/modules/`uname -r`/build/include ... Которые не имеют ничего общего с заголовочными файлами пользовательского пространства из /usr/include.
|
|
|
|
|
Mar 28 2017, 05:06
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Цитата(inventor @ Mar 26 2017, 17:25)  все разобрался. <asm/ioctls.h> Ничуть не разобрался! Вдумчиво читать: Код /usr/include/bits/ioctls.h:# error "Never use <bits/ioctls.h> directly; include <sys/ioctl.h> instead." Кстати, у меня сам TIOCEXCL лежит в /usr/include/asm-generic/ioctls.h, но в коде я явного #include <sys/ioctl.h> не вижу — видимо, что-то другое его инклюдит. Но в любом случае: #include <sys/что-то> - правильно, а вот #include <asm/что-то> - совсем неправильно!
Сообщение отредактировал Эдди - Mar 28 2017, 05:07
|
|
|
|
|
Mar 28 2017, 10:04
|
Знающий
   
Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250

|
Цитата(krux @ Mar 28 2017, 11:27)  заголовочными файлами ядра Где здесь заголовочные файлы ядра? Они нужны лишь при сборке самого ведра и его модулей. К данному случаю это никакого отношения не имеет!
|
|
|
|
|
Mar 28 2017, 12:04
|
Знающий
   
Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748

|
Цитата(Эдди @ Mar 28 2017, 08:06)  Ничуть не разобрался! Вдумчиво читать: Код /usr/include/bits/ioctls.h:# error "Never use <bits/ioctls.h> directly; include <sys/ioctl.h> instead." Кстати, у меня сам TIOCEXCL лежит в /usr/include/asm-generic/ioctls.h, но в коде я явного #include <sys/ioctl.h> не вижу — видимо, что-то другое его инклюдит. Но в любом случае: #include <sys/что-то> - правильно, а вот #include <asm/что-то> - совсем неправильно! у меня работает и с asm/ioctls.h и с sys/ioctl.h включил последнее, мне не нравятся названия с asm потому что на разных машинах и рахзных процах внутренности могут быть разные a sys - это как бы объединяющее спасибо за подсказку
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|