реклама на сайте
подробности

 
 
> Открыть COM USB в Linux
inventor
сообщение Mar 26 2017, 10:20
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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 -мжет в том проблема
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Эдди
сообщение Mar 26 2017, 12:59
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Любые блокировки только под юзером работают. Для блокировки используйте ioctl(comfd, TIOCEXCL). Но еще раз повторю: если рутом открывать, этот лок не сработает.
Go to the top of the page
 
+Quote Post
inventor
сообщение Mar 26 2017, 14:25
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Эдди @ Mar 26 2017, 15:59) *
Для блокировки используйте ioctl(comfd, TIOCEXCL).


какой заголовочник включить, чтобы это работало?
перепробовал десяток!
все разобрался. <asm/ioctls.h>
правда мне всегда казалось что это можно делать
не на уровне пользователя.
Go to the top of the page
 
+Quote Post
Olej
сообщение Mar 27 2017, 20:47
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(inventor @ Mar 26 2017, 17:25) *
правда мне всегда казалось что это можно делать
не на уровне пользователя.

Если казалось 1111493779.gif , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра. santa2.gif
Go to the top of the page
 
+Quote Post
inventor
сообщение Mar 27 2017, 21:31
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(Olej @ Mar 27 2017, 23:47) *
Если казалось 1111493779.gif , то можете написать надстройку, модуль ядра над сериальным портом, который сделает доступ только из одного-единственного open() на уровне ядра. santa2.gif

я имел ввиду что мне показалось
что заголовки в папке linus\asm и подобные
можно пользоваться только на уровне драйверов
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th August 2025 - 01:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016