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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Читать файл(устройство) не блокируя его  (Прочитано 3601 раз)
Kei
Гость
« : Апрель 13, 2010, 07:10 »

Бесконечным циклом читаю строки из /dev/ttyUSB2 и вывожу на экран.
Но после запуска моей программы, получить доступ для чтения к этому устройству уже никто не может.

(Пытаюсь запустить pppd, сделать cat /dev/ttyUSB2, безрезультатно. И только после закрытия моей проги все начинает работать.)

Открываю файл так.
 if (this->fDeviceRead.open(QIODevice::ReadOnly | QIODevice::Text)) {
....
}


Кстати, для записи в устройство, открываю тот же /dev/ttyUSB2 снова, но уже только на запись WriteOnly (Правильно ли так делать?)
В итоге, другие программы могут писать, но не могут ничего читать.

Как правильно организовать взаимодействие с устройством?
« Последнее редактирование: Апрель 13, 2010, 07:12 от Kei » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Апрель 13, 2010, 07:31 »

как реализован
Цитировать
fDeviceRead
?

Цитировать
Но после запуска моей программы, получить доступ для чтения к этому устройству уже никто не может.
всё зависит от того как открывается у-во,  т.е. от опций системного вызова open() и ioctrl(),
т.е. в "ексклюзив" или "шаред" моде Улыбающийся

Цитировать
Кстати, для записи в устройство, открываю тот же /dev/ttyUSB2 снова, но уже только на запись WriteOnly (Правильно ли так делать?)
эмм.. непонятно зачем

Цитировать
В итоге, другие программы могут писать, но не могут ничего читать.
эммм... так вам нужно, чтобы ваш ttyUSB2 могли использовать несколько приложений? или что вы вообще хотите сделать?

Цитировать
Как правильно организовать взаимодействие с устройством?
зависит от ситуации... какая у вас цель?







Записан

ArchLinux x86_64 / Win10 64 bit
Kei
Гость
« Ответ #2 : Апрель 13, 2010, 08:14 »

Цитировать
как реализован
fDeviceRead
?
QFile fDeviceRead;

Цитировать
эммм... так вам нужно, чтобы ваш ttyUSB2 могли использовать несколько приложений? или что вы вообще хотите сделать?
Цитировать
зависит от ситуации... какая у вас цель?
Да.
Мое приложение построчно выводит все ответы устройства(Модема) на экран, а также может отправлять ему команды.
Но когда я пытаюсь использовать pppd или wvdial они не могут получить ответ от /dev/ttyUSB2 т.к. он занят моей программой.

Цитировать
всё зависит от того как открывается у-во,  т.е. от опций системного вызова open() и ioctrl(),
т.е. в "ексклюзив" или "шаред" моде
Открытие в шаред мод это решение моей задачи? Как это можно реализовать в QT? (Так, чтобы я мог писать в него и читать, и при этом он был доступен другим приложениям)
« Последнее редактирование: Апрель 13, 2010, 08:24 от Kei » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Апрель 13, 2010, 08:40 »

Цитировать
QFile fDeviceRead;
уффф... 
посмотрите в сторону :
QextSerialPort -> http://code.google.com/p/qextserialport/
или
QSerialDevice -> http://fireforge.net/projects/qserialdevice/

Цитировать
Мое приложение построчно выводит все ответы устройства(Модема) на экран, а также может отправлять ему команды.
откройте ваш модем как ReadWrite и сможете из вашего приложения как читать из него так и писать в него всё что захотите.

Цитировать
Но когда я пытаюсь использовать pppd или wvdial они не могут получить ответ от /dev/ttyUSB2 т.к. он занят моей программой.
уффф...
1. а вы уверены, что сможете обеспечить "правильное" использование ресурса (/dev/ttyUSB2) несколькими приложениями?
2. зачем вам одновременно использовать вашу программу и pppd/wvdial ?
тем более, что pppd/wvdial монопольно использует ваш модем, т.е. если вы открыли ваш модем с помощью pppd/wvdial - то после этого, если попытаетесь открыть модем вашим приложением, то оно  "не сможет/не должно" получить доступ к модему, т.к. он уже занят pppd/wvdial. (хотя нужно проверить - могу ошибаться)
3. если вы хотите (все-таки) чтобы ваш модем использовался в "шаред моде" - то посмотрите в сторону QextSerialPort, т.к. эта библиотека не блокирует и не проверяет занятость последовательного устройства в *.nix
4. если вы хотите кроссплатформенное решение (т.е. не только в *.nix) - то у вас может не выйти, т.к. в винде у вас может не "пройти" фокус с "шаред моде".

Цитировать
Открытие в шаред мод это решение моей задачи? Как это можно реализовать в QT? (Так, чтобы я мог писать в него и читать, и при этом он был доступен другим приложениям)
1. Посмотрите в сторону QextSerialPort
2. если не получится - то что-то типо этого:
http://www.easysw.com/~mike/serial/serial.html
вам в помощь Улыбающийся


Записан

ArchLinux x86_64 / Win10 64 bit
Kei
Гость
« Ответ #4 : Апрель 16, 2010, 21:05 »

Цитировать
2. зачем вам одновременно использовать вашу программу и pppd/wvdial ?
Я хочу работать с прочими функциями модема, и при этом быть в сети. Например, хочу периодически выводить уровень сигнала модема.
В винде, программа которая идет с модемом подключается к сети, но при этом может показывать уровень сигнала, сеть и т.п.
Может это не реально в линуксе?

p.s. так и не понял как скачать http://code.google.com/p/qextserialport/ Грустный
TortoiseHg скачивает в какой-то непонятной кодирвоке.
UPD: Скачал через CMD
« Последнее редактирование: Апрель 19, 2010, 14:13 от Kei » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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