Russian Qt Forum
Май 14, 2024, 22:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка при работе с USB>serial  (Прочитано 4382 раз)
joke
Гость
« : Октябрь 03, 2011, 08:27 »

Итак, дано:
- Система Ubuntu 10.10
- USB Device U-350 ST-Lab (подключено и распознается как /dev/ttyUSB0),
- программа C++(Qt) с кодом, вида:
...
qDebug() << __LINE__;    /// (*)
int m_fd = ::open("/dev/ttyUSB0", O_RDWR | O_NOCTTY );
qDebug() << __LINE__;    /// (**)
...
Так вот, точку (*) программа проходит, а точку (**) нет
Т.е. на 'open' программа висит.
НО!
Запускаемая с LiveCD Ubuntu 10.04, программа успешно выполняется ( точки (*) и (**) ).
Вопрос: куда копать?
Параметры из /dev/serial полностью совпадают для двух систем.
Машина одна.
Использование иного USB>serial вместо и вместе с исходным результата не дало.
Запуск под 'root' результата не дал.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Октябрь 03, 2011, 09:06 »

Добавь O_NDELAY
Записан

ArchLinux x86_64 / Win10 64 bit
joke
Гость
« Ответ #2 : Октябрь 03, 2011, 09:24 »

Охохоюшки, грехи мои тяжкие...
From(http://www.tver.mesi.ru/e-lib/res/347/OPEN.htm):
O_NDELAY
    Этот флаг может воздействовать на последующие операции чтения и записи [см. read(2) и write(2)].

    При открытии именованного канала с установленными флагами O_RDONLY или O_WRONLY:

       1. Если установлен флаг O_NDELAY, то вызов open только на чтение завершается без задержки, а вызов open только для записи отрабатывает с сообщением об ошибке, если в данный момент нет процесса, открывшего файл для чтения;
       2. Если не установлен флаг O_NDELAY, то вызов open только на чтение блокируется, пока какой-либо процесс не откроет файл для записи, а вызов open только на запись блокируется, пока какой либо процесс не откроет файл на чтение.

    При открытии файла, ассоциированного с линией связи:

       1. Если установлен флаг O_NDELAY, то вызов open завершается без ожидания несущей.
       2. Если не установлен флаг O_NDELAY, то вызов open блокируется до появления несущей.

>>> Т.е. у меня в в системе нет несущей на 'serial' ('ttyUSB0')
>>> Из шапки видно, что это не аппаратная фича(баг), а программная.
>>> С чем это может быть связано, как проверить, как исправить?
Записан
joke
Гость
« Ответ #3 : Октябрь 03, 2011, 09:34 »

(С):
O_NDELAY
    Этот флаг может воздействовать на последующие операции чтения и записи

>>> Код работы с 'RS232' зарыт в Proxy классе в ОБЩЕЙ библиотеке, изменять логику работы нельзя.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 22.