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

 
 
> Открыть 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
Эдди
сообщение Mar 28 2017, 05:06
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
inventor
сообщение Mar 28 2017, 12:04
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 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 - это как бы объединяющее
спасибо за подсказку
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 12:38
Рейтинг@Mail.ru


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