crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику kuzulis ::: Спасибо сказали: 36 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
18.11.2013, 17:06 QtSerialPort
Цитата(bsn @ 18.11.2013, 17:49) *
Подскажите куда рыть?


http://qt-project.org/forums/viewthread/33142/

Пока никак исправить это нельзя. В общем - используй объект QSerialPort в другом треде.
bsn,
1.11.2013, 17:09 Сигнал QIODevice::bytesWritten()
1. Пихать можно сколько угодно путем write()
2. Данные передаются автоматически кусками по 512 байт.
3. После реальной отправки каждого куска (ну, или остатка меньшего чем 512), излучается bytesWritten()

Пример:

// пишем в порт 1024 байта
write(1024);

// в этом случае сигнал bytesWritten() должен излучиться дважды по 512 байт


// пишем в порт 1025 байт
write(1025);

// в этом случае сигнал bytesWritten() должен излучиться трижды 512 + 512 + 1 байт
Анна,
24.10.2013, 11:04 DCTerminal - Моя первая Qt-программа
Цитата
Это Терминал.


А терминал из примеров QtSerialPort чем-то не угодил? :)

Цитата
это бага (или фича) QSerialPort.


Это фича. Пример из жизни: если хочется покушать - то мы сначала открываем холодильник, а уже потом берем оттуда колбасу.. ;)

Хотя может быть в Qt6 это поменяем, т.к. сейчас нет смысла. Да и запарно это...
DruidCat,
21.10.2013, 17:53 QtSerialPort
Если не знаешь какой порт нужен - то просто перечисляешь и выбираешь из списка нужный и проверяешь его:

foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
{
    if (serialPortInfo.isBusy())
        qDebug() << "Port " << serialPortInfo.portName() << " is busy";
    else
        qDebug() << "Port " << serialPortInfo.portName() << " is free";
}


или

Если знаешь какой нужен то прямо его и проверяешь:

QString portName("COM1");

QSerialPortInfo serialPortInfo(portName);

if (serialPortInfo.isBusy())
    qDebug() << "Port " << serialPortInfo.portName() << " is busy";
else
    qDebug() << "Port " << serialPortInfo.portName() << " is free";


UPD: А еще смотри примеры, которые идут вместе с QtSerialPort в директории /examples:

* cenumerator - консольный пример
* enumerator - GUI пример
DruidCat,
5.9.2013, 10:24 QtSerialPort
Непонятен вопрос какое HANDLE необходимо.

1) Если необходим HANDLE последовательного порта, который получается при CreateFile("COMxx",...), то эта фича выйдет в Qt5.2 (если не ошибаюсь).

Ты можешь подождать или скачать исходники QtSerialPort, где эта фича присутствует, и пересобрать самостоятельно.

Вот принятый патч: https://codereview.qt-project.org/#change,51862

Исходники качаешь через Git и потом переключаешься в dev бранч, т.к. эта фича находится именно в dev бранче и еще не вышла. И наслаждаешься. :)

2) Если необходим HANDLE, который предоставляется вендор-специфичной либой от FTDI, то тут увы, QtSerialPort не имеет к этому никакого отношения. Делай все сам.


UPD: Но тебе нужен п.2., я так понимаю, поэтому я тут ничего не сделаю, т.к. это совершенно другое API от FTDI.

UPD2: Кроме того, ты можешь установить этот таймаут раз и навсегда, просто перепрошив EEPROM у чипа, и не нужно мучаться (вроде оно возможно, погугли).
marsel,
19.2.2013, 14:46 проблема с QExtSerialPort
Цитата(chu @ 19.2.2013, 14:56) *
И сразу проблема.
При сборке ошибка
Цитата
cannot find -lQtSerialPort



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

Поэтому он и не находит QtSerialPort, потому что его нету (есть только QtSerialPortd).

Собирай свой проект в дебаге или скомпиль и доустанови релизную версию QtSerialPort
до кучи.
chu,
19.2.2013, 12:54 проблема с QExtSerialPort
Блин, ну ты ж примеры посмотри, Вики не успевает обновляться.

Попробуй:
#include <QtSerialPort/QSerialPortInfo>
#include <QtSerialPort/QSerialPort>
chu,
25.12.2012, 14:12 Обращение к виджету из другого потока
Цитата
А вот мой конкретный случай. С кнопкой (и другими виджетами на форме) нужно что-либо делать по факту прихода данных с COM-порта (приём данных организован в отдельном потоке. Ну там WaitForMultipleObjects и все дела...).


http://qt-project.org/wiki/QtSerialPort_Russian
Valter,
24.9.2012, 10:07 Не работает отладчик
ТС, установи Debugging Tools и не парь мосги.

Это элементарно и в гугле находится на раз, и нечего форум мусорить.
qt_user,
11.9.2012, 20:56 Подключение библиотеки ftdi к qt
Цитата
LIBS += -L$$PWD/drv/i386 -lftd2xx

Спасет отца русской демократии
qt_user,
24.7.2012, 20:49 QSerialDevice - Библиотека для работы с COM-портами
Цитата(asket @ 24.7.2012, 14:36) *
kuzulis, каким образом можно остлеживать изменение списка портов? В предыдущей Вашей версии QserialDevice я делал с помощью сигнала hasChanged(QStringList) класса SerialDeviceEnumerator, а в этой - как? Впечатление складывается, сильно урезали QSerialDevice, к которому я так привык..


Урезали т.к. нет возможности реализовать эту функцию для всех ОС.
Если нужно отслеживать изменение - то можно периодически по таймеру получать список. Если же это не устраивает, то бери код из предыдущей версии библиотеки и реализуй у себя дополнительный класс для отслеживания.

UPD: Или можешь взять код отслеживания из QextSerialPort - там он попроще.
asket,
17.2.2012, 10:50 проблемы с интеграцией Qt в Microsoft Visual Studio .NET 2003
У тебя в голове каша.

SDK - это когда ничего не нужно пересобирать и делать configure - это когда нужно просто работать.

Ты скачал SDK, уже откомпиленое при помощи компилятора MinGW, зачем ты запускаешь configure.exe? :blink:

Чтобы использовать студийный компилятор - то нужно поставить галочку в SDK менеджере и выкачать
SDK, откомпиленное при помощи MSVS 2008. Но при этом, у тебя в системе должна быть установлена
сама MSVS 2008!

Чтобы использовать твой конпелятор от Visual Studio .NET 2003 - тебе нужно
выкачать исходники Qt а не SDK (т.е. можешь также в SDK менеджере установить галочку для
скачивания исходников Qt, а можешь скачать их сам с сайта QtNokia).
Далее, тебе необходимо перекомпилировать исходники Qt своим компилятором
и уже потом пользоваться.

Как собирать Qt из исходников - ищи в гугле или на самом сайте Qt.
raus,
21.1.2012, 17:58 QT&ZigBee
Цитата(zloiia @ 21.1.2012, 18:29) *
Все равно все от него пляшут :rolleyes:


:blink: LOL Кто эти все?

Сейчас идет процесс интеграции QSerialDevice 2.0 в Qt (как аддон).
Nokia дала добро и в скором времени начнется интеграция репозитория и т.п.

Так что про QextSerialPort можно забыть, тем более, он по многим параметрам уступает
как в кривом архитектурном плане, возможностях, также оно уже "мертво" и не развивается вообще.

Так что вывод делайте сами.

Цитата(Stoptyssin)
Он принимает данные с устройств и какает в порт сообщениями типа "Такой-то девайс послал то-то" - именно так

Я не распарсил, что имеется ввиду?
Stoptyssin,
7.12.2011, 20:05 QSerialDevice - Библиотека для работы с COM-портами
Цитата
После вставки (или доставания, если сабжевый класс был инициализирован при воткнутом устройстве) начинаются бесконечные ивенты от этого QSocketNotifier (который udev_socket).


Да, есть такое дело. Если открыть порт и выдернуть шнурок то будут евенты сыпаться и будет загрузка.
Тут эта тема поднималась уже.
Решения нет и не будет в принципе, т.к. эта ветка библиотеки заморожена и больше не поддерживается.

Вместо этой ветки используй 2.0. : https://gitorious.org/qserialdevice/qserial...ive-tarball/2.0
которую (тьфу-тьфу чтобы не сглазить), нокиевцы обещали добавить в Qt как аддон.

Здесь вместо SerialDeviceEnumerator использовать можно SerialPortInfo с проверкой портов по таймеру.



blinvip,
16.10.2011, 12:22 Release, Debug и QSerialDevice
Цитата(RazrFalcon)
У меня arch. ;)

У меня сейчас на арче юзер в группах: tty и uucp и все работает.
Только нужно машинку перегрузить после изменений вроде.
Цитата(RazrFalcon)
Бага!
Ребутнулся обратно на винду, нажал собрать - и все заработало. До этого 3-и часа промучался... Мистика.

бывает
RazrFalcon,
7.4.2011, 19:35 QSerialDevice - Библиотека для работы с COM-портами
Цитата(d2r @ 7.4.2011, 11:23) *
А как узнать, подключено ли к порту какое-либо устройство?

Никак.

Цитата(d2r @ 7.4.2011, 11:23) *
Это необходимо будет по таймеру пытаться считывать данные с порта? Или есть другой способ?

Открыть порт и приконектиться к сигналу readyRead().
И когда от устройства (если оно есть) придут данные - то прочитать их.
Никаких таймеров не нужно (за исключением, если необходимо просигнализировать о таймауте ожидания от устройства данных).

Как то так.

d2r,
8.2.2011, 19:17 QSerialDevice - Библиотека для работы с COM-портами
Цитата(silver47 @ 8.2.2011, 14:06) *
Порт виртуальный - ELTIMA Virtual Serial Port.

Самый хороший из всех эмуляторов! Имхо.

Цитата(silver47 @ 8.2.2011, 14:06) *
Порты, созданные другими программами (например, Virtual Serial Ports Emulator) не определяются этой библиотекой. Как понял, определяются только те порты, которые есть в диспетчере устройств в ветке "Порты LPT и COM". А где те, которые создаются Virtual Serial Ports Emulator не знаю.

Так и должно быть.

Цитата(silver47 @ 8.2.2011, 14:06) *
Программа, написанная другим человеком, на делфне читает всё полностью. Может можно как-то последовательно прочитать?

В ELTIMA Virtual Serial Port Driver включите эмуляцию baudrate и будет счастье.
silver47,
9.1.2011, 13:21 QSerialDevice - Библиотека для работы с COM-портами
Цитата
Строки коммутатор воспринимает, а вот управляющие символы в String отправить не получается, коммутатор воспринимает их как строку и все.

Ну так смекнуть нужно и формировать данные в виде QByteArray и слать их устройству.
...
QString s("моя команда или хз что там")
QByteArray data;
data.append(s);
data.append('\r');
port.write(data);
...


Это же элементарно, Ватсон (с)
Sasha07,
26.12.2010, 15:38 QSerialDevice - Библиотека для работы с COM-портами
Цитата
C:\Qt\2010.05\BuildExamples-build-desktop\examples\anymaster/../../../qserialdevice-qserialdevice/examples/anymaster/anymaster.cpp:30: undefined reference to `operator<<(QDebug, AbstractSerial::BaudRate)'

Возьмите сегодняшний master. Я там это исправил.

Цитата
так сказать, большую зеленую кнопку.

не надо нажимать кнопок. запускать надо через Qt Command Promt или заранее прописав в PATH пути к либам Qt и MinGW.

Цитата
.a помещает в Qt\2010.05\BuildExamples-build-desktop\src\build\debug - это так и должно быть, или должно в Qt\2010.05\qserialdevice-qserialdevice\src ?

Должно быть, всегда библиотеку помещает в \BuildExamples-build-desktop\src\build\debug(release).

Цитата
С полученной .dll моя прога работать не хочет, опять 139 ошибка (там только создание экземпляра класса, больше совсем ничего, и #include <abstractserial.h>, как в примере, и dll лежит рядом с ехе), а примеры проверить не могу.

Разбираться что у Вас не работает в Вашем приложении я не буду. Для Вас специально созданы примеры /examples , они работают так как задумано. Сделайте у себя по аналогии. В чем проблема?

Цитата
.dll помещает опять в Qt\2010.05\BuildExamples-build-desktop\src\build\debug.

А куда ей помещать?
Если хотите использовать shared (*.dll) библиотеку - то напишите сами себе *.pro файл так как Вам нужно чтобы оно помещало туда куда Вам надо.


В общем, почитайте assistent и что нить про разделяемые библиотеки.




Alexk,
14.12.2010, 16:15 Как правильно создать 3-х уровневую модель дерева?
Цитата(Rocky @ 14.12.2010, 16:06) *
kuzulis, все, идею понял, супер!... Только не мог бы ты подсказать насчет кода функций index/parent/rowCount плиз?)


Вот, думаю разберешься:
QModelIndex CoreTreeModel::index(int row, int column, const QModelIndex &parent) const
{
    if (this->rootNode && this->hasIndex(row, column, parent)) {
        BaseNode *parentNode = (parent.isValid()) ?
                               (static_cast<BaseNode *>(parent.internalPointer())) : (this->rootNode);
        if (parentNode) {
            BaseNode *childNode = parentNode->child(row);
            if (childNode)
                return createIndex(row, column, childNode);
        }
    }
    return QModelIndex();
}

QModelIndex CoreTreeModel::parent(const QModelIndex &index) const
{
    if (this->rootNode && index.isValid()) {
        BaseNode *childNode = static_cast<BaseNode *>(index.internalPointer());
        if (childNode) {
            BaseNode *parentNode = childNode->parent();
            if (parentNode != this->rootNode)
                return this->createIndex(parentNode->row(), 0, parentNode);
        }
    }
    return QModelIndex();
}

int CoreTreeModel::rowCount(const QModelIndex &parent) const
{
    if (this->rootNode && (parent.column() <= 0)) {
        BaseNode *parentNode = (parent.isValid()) ?
                           (static_cast<BaseNode *>(parent.internalPointer())) : (this->rootNode);
        return parentNode->childCount();
    }
    return 0;
}


Как то так
Rocky,
14.12.2010, 15:36 Как правильно создать 3-х уровневую модель дерева?
Я тож долго соображал (до сих пор соображаю еще).
Вот, может пригодится это обсуждение: http://www.prog.org.ru/topic_15908_0.html

Самым простым решением (что я надумал), является создание базового класса Итем, от которого будут наследоваться уже реальные итемы источника данных, которые идентифицируются по типу.

т.е. мысленно делим итемы нашей структуры данных на типы, например:
корневой итем rootItem,
итем 1-го уровня вложенности oneLevelItem,
итем 2-го уровня вложенности twoLevelItem,
....
итем n-го уровня вложенности nLevelItem,

т.е. базовый класс имеет вид:
class BaseNode
{
public:
    enum NodeType {
        RootNodeType,
        OneLevelType,
        TwoLevelType,
    };

    BaseNode(BaseNode *parent = 0);
    virtual ~BaseNode();

    // Control Interface
    void appendChild(BaseNode *child);
    void removeChild(BaseNode *child);
    void removeAllChild();

    //
    BaseNode *child(int row);
    int childCount() const;
    virtual int columnCount() const = 0;
    virtual QVariant data(int column) const = 0;
    int row() const;
    BaseNode *parent();
    NodeType type() const;

protected:

    QList<BaseNode *> childNodes;
    NodeType nodeType;
private:
    BaseNode *parentNode;
};


т.е. всё аналогично тому, что в примерах с TreeItem, но! с одним условием, что добавили enum NodeType (тип итема/узла),
плюс сделали методы:
    virtual int columnCount() const = 0;
    virtual QVariant data(int column) const = 0;

чисто абстрактными (т.е. реализовывать их будем в других классах-наследниках от базового),
плюс убрали список QList<QVariant> с данными итема, т.к. каждый тип итема будет содержать разные типы/кол-во данных (столбцов).

Теперь реализуем те классы-итемы, типы которых у нас будут в нашей структуре данных, пример:

корневой узел.
class RootNode : public BaseNode
{
public:
    class RootData
    {
    public:
        QString title;
        QString summary;
    };
    RootNode(BaseNode *parent = 0);
    void setRootData(const RootData &data);

    // From BaseNode
    int columnCount() const;
    QVariant data(int column) const;

private:
    RootData data;
};

------------------------------------------------
RootNode::RootNode(BaseNode *parent)
        : BaseNode(parent)
{
    this->nodeType = BaseNode::RootNodeType;

    RootNode::RootData rd;
    rd.title = "Title";
    rd.summary = "Summary";
    this->setRootData(rd);
}

void RootNode::setRootData(const RootData &data)
{
    this->data= data;
}

// From BaseNode
int RootNode::columnCount() const
{
    return 2;
}

QVariant RootNode::data(int column) const
{
    switch (column) {
    case 0: return QVariant(this->data.title);
    case 1: return QVariant(this->data.summary);
    default:;
    }
    return QVariant();
}

Видим, что корневой узел имеет данные типа RootData, которые содержат всего два столбца title и summary, т.е. это то что будет отображено в TreeView как заголовки (header). При этом, знаем, что сам корневой узел не отображается в TreeView !!!

Далее, реализуем другой итем 1-го уровня:
class OneLevelNode : public BaseNode
{
public:
    class OneLevelData
    {
    public:
        int id;
        QString name;
        QString description;
    };
    OneLevelNode (const QString &name, BaseNode *parent = 0);
    void setOneLevelData(const OneLevelData &data);

    // From BaseNode
    int columnCount() const;
    QVariant data(int column) const;

private:
    OneLevelData data;
};

------------------------------
OneLevelNode::OneLevelNode(const QString &name, BaseNode *parent)
        : BaseNode(parent)
{
    this->nodeType = BaseNode::OneLevelNodeType;
    this->data.name = name;
}

void OneLevelNode::setOneLevelDataData(const OneLevelData &data)
{
    this->options = data;
}

// From BaseNode
int OneLevelNode::columnCount() const
{
    return 3;
}

QVariant OneLevelNode::data(int column) const
{
    switch (column) {
    case 0: return QVariant(this->data.id);
    case 1: return QVariant(this->data.name);
    case 2: return QVariant(this->data.description);
    default:;
    }
    return QVariant();
}


Как видим, этот класс содержит данные OneLevelData из трёх полей.
Далее, реализуем все остальные классы-итемы, которые у нас будут в дереве.

Теперь, в модели делаем так:
class CoreTreeModel : public QAbstractItemModel
{
    Q_OBJECT

public:
    CoreTreeModel(RootNode *rootNode, QObject *parent = 0);
    ~CoreTreeModel();

    QVariant data(const QModelIndex &index, int role) const;
    Qt::ItemFlags flags(const QModelIndex &index) const;
    QVariant headerData(int section, Qt::Orientation orientation,
                        int role = Qt::DisplayRole) const;
    QModelIndex index(int row, int column,
                      const QModelIndex &parent = QModelIndex()) const;
    QModelIndex parent(const QModelIndex &index) const;
    int rowCount(const QModelIndex &parent = QModelIndex()) const;
    int columnCount(const QModelIndex &parent = QModelIndex()) const;

private:
    RootNode *rootNode;
};


При этом, считаем, что дерево данных rootNode полученное в модель уже существует (создано и заполнено данными/итемами заранее).
(Считаем так для простоты).

Теперь, нужно переопределить виртуальные методы модели так, чтобы она "рисовала" нам итемы данных так как мы хотим:
....
QVariant CoreTreeModel::data(const QModelIndex &index, int role) const
{
    if (this->rootNode && index.isValid() && (Qt::DisplayRole == role)) {
        const BaseNode *node = static_cast<BaseNode *>(index.internalPointer());
        if (node) {
            int column = 0;
            switch (node->type()) {
            case BaseNode::ProjectNodeType:
                column = index.column();
                if (0 == column)
                    return node->data(++column);
            default:;
            }
        }
    }
    return QVariant();
}
....


т.е. вся фишка в
const BaseNode *node = static_cast<BaseNode *>(index.internalPointer());
...
switch (node->type()) {
...
}
...


т.е. мы для рисования данных сначала определяем : "а что, собственно, щас у нас за текущий тип итема?" и в зависимости от типа итема мы можем выбирать, какие данные (столбцы) этого итема нам отображать, а какие нафик не нужны для отображения (но они есть)!!!

И по аналогии переопределяем другие методы модели!

Надеюсь, суть ясна? ;)

ЗЫ: старался донести как мог идею (один из вариантов решения проблем похожего рода).



Rocky,
14.12.2010, 13:58 Как правильно создать 3-х уровневую модель дерева?
Цитата
Т.е. что, получается что не нужно наследоваться от QAbstractItemModel а тупо заполнять дерево вручную?

Нужно наследоваться.
Просто суть такова, что источником данных для модели выступает класс TreeItem.
Т.е. каждый TreeItem содержит список столбцов(собственно - данных), а также список строк(список указателей на дочерние итемы).
т.е. источник данных типа TreeItem специально имеет древовидную структуру для того чтобы легко его можно было адаптировать к QAbstractItemModel-ли.
Так вот, переопределяя в модели виртуальные методы, мы тем самым, можем для любого итема источника данных показать любые его данные какие хотим.
К примеру, итем TreeItem имеет список данных из 3-х столбцов, но мы хотим показать только два из них, поэтому, переопределяя виртуальный метод в модели, мы можем подсовывать в него нужные нам столбцы TreeItem .

Вместо списка данных TreeItem типа QList<QVariant>, можно испоотзовать любые структуры данных. QList<QVariant> в примере (ИМХО) приведен чисто чтобы показать как оно работает, т.е. общий случай. Тем более, что в QList<QVariant> можно впихнуть любые данные, поэтому такое решение универсально.

Цитата
Так а если нужно обрабатывать нажатие мыши то как тогда с таким подходом?

Нажатие мыши обрабатываются в TreeView, при этом, ты получаешь готовый текущий QModelIndex, и можеш, зная его, изменить в нем данные с помощью методов модели типа setData() и т.п.
т.е. в данном случае, подразумеваем, что данные в источнике ты меняешь сверху вниз, т.е:
TreeView->Model->DataSource.

А вот если у тебя данные в TreeItem кто-то меняет извне (например какой-то алгоритм), то тут нужно придумать какой-то механизм чтобы уведомить модель о том, что данные в данном итеме TreeItem изменились. т.е. этим механизмом будет являться твоё собственное API.

Как-то так...
В общем, весь этот подход MVC какой-то не особо универсальный. ИМХО.

ЗЫ: Я сам долго анализировал и втыкал что есть что. Вот, довтыкался :).
Rocky,
21.10.2010, 12:28 QSerialDevice - Библиотека для работы с COM-портами
Только что пересмотрел тот код где вы переоткрываете и не увидел где вы конфигурируете порт! Может все-таки БУДЕМ ЧИТАТЬ ДОКУМЕНТАЦИЮ? ИЛИ КАК?

--
Упс, прощу прощения.. Действительно, данный косяк наблюдаю... Пробую исправить..

---

Вроде исправил, проверьте.
lpn74,
8.10.2010, 9:34 CMake. Локализация программ используя *.po файлы.
Все, в принципе разобрался и даже написал тут шаблон ВиКи по этой теме
http://www.wiki.crossplatform.ru/index.php...B8%D1%86%D0%B02

Но не получается:
1. Отформатировать и облагородить в некоторых местах.
2. Сделать эту страницу независимой. Почему-то она находится в Kuzulis/песочница, хотя, я ее переименовал в Kuzulis/песочница2

Или я чего-то недопонимаю :) .

Не мог бы кто-нибудь мне помочь в этом?

А также дать советы и покритиковать и, может быть, добавить чего нибудь нового и самому подправить. 8)
---
ViGOur,
30.7.2010, 16:53 использование QSerialDevice
Цитата
ах, вот как! гы...гы..., самого то его и нет!... а где его в собранном виде для винды можно скачать?


http://www.stack.nl/~dimitri/doxygen/download.html#latestsrc

doxygen-1.7.1-setup.exe
dimay192,

2 страниц V   1 2 >
RSS Текстовая версия Сейчас: 24.11.2024, 22:10