Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
42 / 52 / 33
Регистрация: 15.12.2015
Сообщений: 199
1

Чтение и запись файла используя класс QFile

30.11.2017, 14:34. Просмотров 1818. Ответов 15
Метки нет (Все метки)

Всем доброго здравия!
Пытаюсь работать с устройством /dev/usbtmc1 (linux xubuntu), которое
принимает текстовые команды и отвечает на них, пытаюсь писать
и читать команды используя один и тот же объект QFile. Почему
то работает только чтение или только запись. Помогите разобраться, мой код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
file_.setFileName("/dev/usbtmc1");
if (!file_.open(QIODevice::ReadWrite | QIODevice::Text)) {
    return false;
}
qDebug() << file_.write("*IDN?"); // запись происходит
// т.к. наблюдаю ответ командой: cat /dev/usbtmc1
QThread::msleep(100); // на всякий случай жду пока устройство среагирует
qDebug() << file_.readAll(); // пытаюсь прочитать ответ, но получаю пустую строку
// если закоментировать строку с write и отправить команду через консоль: 
// echo "*IDN?" > /dev/usbtmc1, то получаю ответ
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.11.2017, 14:34
Ответы с готовыми решениями:

QFile открытие и чтение из файла
Здравствуйте, нужно распарсить xml файл, почитал документацию, остановился на QXmlStreamReader. ...

QFile запись файлов
Всем привет! В кратце о проблеме, в проэкте надо вести простой учет о работе - банально записывать...

Запись QSet в QFile
нужно записать множества QSet в QFile пробовал так set1 &lt;&lt; &quot;Lorem&quot; &lt;&lt; &quot;Ipsum&quot; &lt;&lt;...

MS VS 2010 подставляет include <qfile.h>, а хотелось бы <QFile>
Так работает автоматическая подстановка. Не хотелось бы ее отключать.

15
Заблокирован
30.11.2017, 15:54 2
Цитата Сообщение от dopleref Посмотреть сообщение
пытаюсь прочитать ответ, но получаю пустую строку
Полагаю, что после QFile::write нужно закрывать файл, что бы изменения сохранились на харддиске и только после этого пытаться его прочитать, заново открыв.
Для чего нужно писать и читать одновременно? Это нужно как бы временно делать? Вообще лучше использовать QTextStream для работы с файлов в текстовом режиме
0
42 / 52 / 33
Регистрация: 15.12.2015
Сообщений: 199
01.12.2017, 05:47  [ТС] 3
Цитата Сообщение от Digital_Cry Посмотреть сообщение
Для чего нужно писать и читать одновременно?
Моя программа управляет работой генератора (прибор подключенный к компьютеру по usb),
который отображается в линуксе как файл /dev/usbtmc1, я должен отправлять ему команды
записью в этот файл и читать ответы от устройства, чтением из этого файла соответственно.
Я полагаю, если каждый раз закрывать и открывать файл работать будет, но зачем
тогда нужен режим QIODevice::ReadWrite?
0
486 / 364 / 94
Регистрация: 10.03.2011
Сообщений: 1,512
Записей в блоге: 5
01.12.2017, 08:06 4
Лучший ответ Сообщение было отмечено dopleref как решение

Решение

попробуй, для начала, file_.flush() и, вообще, unbuffered режим. (Не помню, где это задаётся.)
Если не сработает, значит, устройство продолжает ждать текст.
1
42 / 52 / 33
Регистрация: 15.12.2015
Сообщений: 199
01.12.2017, 08:26  [ТС] 5
Спасибо за ответ! Работают оба варианта file_.flush() и добавление флага QIODevice::Unbuffered,
при открытии файла, буду думать теперь какой подходит лучше.
Может быть кто-нибудь знает еще метод для QFile, что-то типа "waitForRead" чтобы можно было
одним методом ждать ответа определенное время без вызова QThread::sleep() ?
0
nd2
3399 / 2781 / 1250
Регистрация: 29.01.2016
Сообщений: 9,423
01.12.2017, 08:27 6
Цитата Сообщение от dopleref Посмотреть сообщение
и читать ответы от устройства, чтением из этого файла соответственно.
И как (куда) записываются эти ответы? Всегда в начало файла? Или после твоей записи?
0
42 / 52 / 33
Регистрация: 15.12.2015
Сообщений: 199
01.12.2017, 08:30  [ТС] 7
Цитата Сообщение от nd2 Посмотреть сообщение
И как (куда) записываются эти ответы? Всегда в начало файла? Или после твоей записи?
Честно говоря я не очень понимаю этот момент.
могу только сказать что можно отправлять и получать данные от устройства
связкой команд в терминале:
Bash
1
2
echo "*IDN?" > /dev/usbtmc1 # запись
cat /dev/usbtmc1 # чтение
0
486 / 364 / 94
Регистрация: 10.03.2011
Сообщений: 1,512
Записей в блоге: 5
01.12.2017, 09:33 8
Цитата Сообщение от dopleref Посмотреть сообщение
чтобы можно было одним методом ждать ответа определенное время
QIODevice асинхронный, такого метода нет. Можно ловить
C++ (Qt)
1
connect(&file_, &QIODevice::readyRead, this, [this,&file_]{ QByteArray data = file_.readAll(); /*...*/});
только тогда нужно не на стеке файл делать, а в куче.
0
39 / 37 / 7
Регистрация: 21.05.2012
Сообщений: 198
01.12.2017, 10:06 9
у файла readyRead не реализован, емнип, кроме того, он non-sequencial (рассчитан на работу с блочными у-вами). Использование Unbuffered, flush и прочего - это порнография для не-блочного девайса в связке с QFile, коим является /dev/usbtmc1, ИМХО

ps: Можно написать свою обертку, отнаследовавшись от QIODevuce
0
42 / 52 / 33
Регистрация: 15.12.2015
Сообщений: 199
01.12.2017, 11:24  [ТС] 10
icpu, я не хочу ловить коннектом, я хотел отправить команду,
а потом сразу же в алгоритме считать.
Цитата Сообщение от kuzulis Посмотреть сообщение
Использование Unbuffered, flush и прочего - это порнография
почему Вы так думаете?
Цитата Сообщение от kuzulis Посмотреть сообщение
Можно написать свою обертку, отнаследовавшись от QIODevuce
можно, но в чем будет профит?

Короче я в унынии, почему то не хочет нормально отрабатывать метод file_.bytesAvailable(),
хотел запилить такой вариант:
C++ (Qt)
1
2
3
4
5
6
file_.write("*IDN?");
QElapsedTimer timer;
timer.start();
while (file_.bytesAvaible < 1 && timer.elapsed() < 1000 {} // если заменить
// на QThread::msleep(1000), то все работает, данные считываются
qDebug() << file_.readLine();
Но он не пашет.
Начал подумывать забить на Qt-шный вариант
и написать работу с устройством на старом добром С.
0
486 / 364 / 94
Регистрация: 10.03.2011
Сообщений: 1,512
Записей в блоге: 5
01.12.2017, 11:35 11
Если не нужно ГУИ, сокеты и прочий жаваскрипт, зачем тогда вообще qt?
0
42 / 52 / 33
Регистрация: 15.12.2015
Сообщений: 199
01.12.2017, 11:44  [ТС] 12
icpu, это часть большого проекта написанного на Qt, Gui там тоже прикручен.
Коннектом не хочу ловить, потому что я отправляю команду и сразу же хочу получить
ответ в той же функции, поэтому коннект тут на мой взгляд не очень подходит.
0
486 / 364 / 94
Регистрация: 10.03.2011
Сообщений: 1,512
Записей в блоге: 5
01.12.2017, 12:01 13
GUI же зависнет! Это никсы? Бери http://doc.qt.io/qt-5/qlocalsocket.html
0
42 / 52 / 33
Регистрация: 15.12.2015
Сообщений: 199
01.12.2017, 13:09  [ТС] 14
Спасибо, посмотрю как это можно будет использовать.
Да это linux, чтобы не весить gui, думал запустить
работу с железом в отдельном потоке
0
Заблокирован
01.12.2017, 15:29 15
Честно говоря я так и не понял, что это за USB генератор, но драйвер для него писал явно олень какой-то, это ж надо было придумать такое средство коммуникации, где команды отправляются через сохранённый файл на харде и ответы записываются в него же
Если это USB устройство, почему бы по USB напрямую не слать на него команды и не ждать ответов... нде...
0
486 / 364 / 94
Регистрация: 10.03.2011
Сообщений: 1,512
Записей в блоге: 5
01.12.2017, 16:52 16
Digital_Cry, в никсах \dev\hdd0, \dev\usb1 и даже \dev\null являются обыкновенными файлами. Ты можешь открыть свой дисплей как файл*, и забрасывать туда сырые данные и команды.

Не по теме:

*любая попытка сделать это в реальной жизни призывает похотливого Зевса в облике гигантского перевозбуждённого быка.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2017, 16:52

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Qfile: запись в файл на русском языке
Как записать в файл на русском языке? вот мой код. Не могу понять почему не записывает русский...

QFile. Как открыть файл, не используя полный путь?
Нужно работать с файлом. Впринципе можна прописать полный путь, но это не подходит к моему заданию....

Запись и чтение из бинарного файла
Есть программа написанная на языке C++, нужно ее изменить так, чтобы сериализация и десериализация...

QFile обработка файла
у меня есть текстовый файл класса QFile, в котором записаны элементы структуры: название,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.