roboforum.ru

Технический форум по робототехнике.


Вопросы по Qt (ну и по С++ заодно)

В этом разделе обсуждаются вопросы по использованию ПК и КПК в робототехнике.
Программирование, настройка, аппаратная часть.

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение Angel71 » 10 мар 2011, 23:13

blindman, http://www.visualdata.ru/blog/109-segv-signal.html
:) а с кэтчами согласен, погорячился.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение dccharacter » 02 апр 2011, 15:23

Ребят, я, похоже тут развлекался со старыми версиями qextserialport. Сейчас собрал самую последнюю, но при сборке orfa-term нме пишут следующее:

:: error: No rule to make target `e:/Qt/2010.05/qt/include/qextserialport-build-desktop/build/qextserialportd.prl', needed by `makefile'. Stop.

при этом проект qextserial вообще закрыт. Все файлы из директории BUILD qextserial скопированы в директорию orfa-term, он их видит. (кстати, нифига не работают у меня переменные окружения - я добавляю пути и как user path, и как system path, но в итоге все равно приходится все библиотеки, типа qt4_gui весом по 50-150МБ каждая копировать в папку сборки проекта - что за нафик?).

Добавлено спустя 1 час 10 минут:
Вчсе, решил - выпилил из make-файла все упоминания qextserial. собралось.

Но все равно в каждую билд-директорию надо копировать QT-шные и другие библиотеки, иначе не работает. Как это побороть?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение dccharacter » 07 апр 2011, 13:16

Что-то не спешит коллективный мозг на помощь. Но может хоть с этим поможете:

1. У меня контроллер и ПК обмениваются командами длиной 4 байта. Команда начинается либо с 's', либо с 'g' (set/get), дальше идет адрес регистра в управляющем блоке, значение регистра (для команты get - это don't care character), заканчивается 'p'.

2. Я на QT как-то имхо убого формирую команду - работает, но мне не очень нравится.
Код: Выделить всёРазвернуть
QString cmd;
cmd.append('s').append(0x05).append(0x4A).append('p');

Можно ли как-то сделать лучше/правильней/и т.д.??

3. А вот с приемкой и, главное, отображением - вообще кисляк:
3а. Если просто показываю полученную команду, то что адрес, что значение - могут быть любыми символами, в т.ч. таб, черточки, палочки и т.д. - наверное надо как-то парсить команду и отображать в человековаримом виде...
3б. Если надо отобразить значение value:
Код: Выделить всёРазвернуть
QByteArray cmd;
cmd = serialPort->readAll(); //сразу в стринг не могу читать, потому что значения могут быть в т.ч. и нулевые, что автоматом нуль-терминирует строку
QString cmd_str;
cmd_str.setNum(cmd.at(2)); //вот тут большая часть значений показывается ОК, но на некоторых значениях value строка принимает какое-то непонятное значение (думаю - 127 что ли...), но понять причину этого не могу. Это чаще всего происходит в начале диапазона, т.е. от 0x00 и до, скажем навскидку 0x30, и несколько раз проскакивает ближе к концу диапазона...
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение algol » 31 май 2011, 12:58

dccharacter писал(а):2. Я на QT как-то имхо убого формирую команду - работает, но мне не очень нравится.
Код: Выделить всёРазвернуть
QString cmd;
cmd.append('s').append(0x05).append(0x4A).append('p');

Можно ли как-то сделать лучше/правильней/и т.д.??


Код: Выделить всёРазвернуть
QString str;
quint8 x=0x05,y=0x4A;
str.append(QString("s%1%2p").arg(x).arg(y));
qDebug()<<str;


Возможно так будет лучше?
algol
 
Сообщения: 24
Зарегистрирован: 31 май 2011, 12:43

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение dccharacter » 04 авг 2011, 00:08

Народ, что-то опять те же грабли. Не могу показать два байта в виде числа на лейбл.

Есть QByteArray, первые два байта равны 00h 1eh (т.е. если выводить QByteArray.toHex(), то кажет 001ехххххх). Теперь надо показать это в виде числа на лейбл. Сделал label->setNum(QByteArray->left(2).toInt()) - чего-то постоянно 0 показывает. Ну и так и сяк пробую - либо ничего не показывает (ну, точнее в АСКИИ), либо 0. Если же взять label->setNum(QByteArray->at(1)), то показывает нормально циферку 30.

Добавлено спустя 1 час 4 минуты 56 секунд:
Твою ж мать! 2 часа!
ui->outputVoltageValue->setNum(fromSerialPort->left(2).toHex().toInt(0,16));
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение Grem » 04 авг 2011, 00:46

Т.е просто QByteArray->left(2).toInt(0, 16) не катит?
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Аватара пользователя
Grem
 
Сообщения: 1530
Зарегистрирован: 16 май 2009, 12:50
Откуда: Россия
прог. языки: Java, C

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение dccharacter » 04 авг 2011, 01:50

нет!
т.е. оно не может перевести, скажем 'a' в 97. Оно может только 'a'->61h->97

Добавлено спустя 1 минуту 16 секунд:
ну т.е. если бы там было '2' или "234", то оно бы перевело toInt-ом сразу в 2 и 234 соответственно, а вот на "018f" уже фейлится.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение blindman » 05 авг 2011, 06:45

Код: Выделить всёРазвернуть
#include <QtEndian>
ui->outputVoltageValue->setNum(qFromBigEndian<quint16>((const uchar*)fromSerialPort->constData()));


fromSerialPort должен содержать не менее 2 байт
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение dccharacter » 05 авг 2011, 11:25

:-( А у меня совсем неправильно?
А я правильно понимаю, что твой пример - он с перестановкой байт и т.д.?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение blindman » 05 авг 2011, 12:15

Правильно, но неэффективно. У меня все преобразование выглядит вот так:

Код: Выделить всёРазвернуть
    qDebug("%d", qFromBigEndian<quint16>((const uchar*)ba->constData()));
8054394:   8b 45 dc                mov    -0x24(%ebp),%eax
8054397:   89 04 24                mov    %eax,(%esp)
805439a:   e8 ff 67 00 00          call   805ab9e <_ZNK10QByteArray9constDataEv>
805439f:   89 04 24                mov    %eax,(%esp)
80543a2:   e8 38 c8 00 00          call   8060bdf <_Z14qFromBigEndianItET_PKh>
80543a7:   0f b7 c0                movzwl %ax,%eax
80543aa:   89 44 24 04             mov    %eax,0x4(%esp)
80543ae:   c7 04 24 6d 2c 08 08    movl   $0x8082c6d,(%esp)
80543b5:   e8 46 f2 ff ff          call   8053600 <_Z6qDebugPKcz@plt>

0805ab9e <_ZNK10QByteArray9constDataEv>:
inline const char *QByteArray::data() const
{ return d->data; }
inline const char *QByteArray::constData() const
{ return d->data; }
805ab9e:   55                      push   %ebp
805ab9f:   89 e5                   mov    %esp,%ebp
805aba1:   8b 45 08                mov    0x8(%ebp),%eax
805aba4:   8b 00                   mov    (%eax),%eax
805aba6:   8b 40 0c                mov    0xc(%eax),%eax
805aba9:   5d                      pop    %ebp
805abaa:   c3                      ret   
805abab:   90                      nop

08060bdf <_Z14qFromBigEndianItET_PKh>:
        | src[0] * quint32(0x01000000);
}

template<>
inline quint16 qFromBigEndian<quint16>(const uchar *src)
{
8060bdf:   55                      push   %ebp
8060be0:   89 e5                   mov    %esp,%ebp
    return quint16( 0
                    | src[1]
8060be2:   8b 45 08                mov    0x8(%ebp),%eax
8060be5:   83 c0 01                add    $0x1,%eax
8060be8:   0f b6 00                movzbl (%eax),%eax
                    | src[0] * quint16(0x0100));
8060beb:   0f b6 d0                movzbl %al,%edx
8060bee:   8b 45 08                mov    0x8(%ebp),%eax
8060bf1:   0f b6 00                movzbl (%eax),%eax
8060bf4:   0f b6 c0                movzbl %al,%eax
8060bf7:   c1 e0 08                shl    $0x8,%eax
8060bfa:   09 d0                   or     %edx,%eax
}
8060bfc:   5d                      pop    %ebp
8060bfd:   c3                      ret   

то есть всего 3 десятка команд.

А вызовы left() и toHex() каждый создают экземпляры класса QByteArray (причем не 2, как может показаться, а больше), с выделением памяти и последующем удалением.

Насчет того, будут ли переставляться байты - зависит от того, под какой процессор компилируется. У тебя, как я понял, данные передаются как big endian (сначала старший байт), поэтому и использована qFromBigEndian(). Это шаблонная функция, которая учитывает тип возвращаемого значения и порядок байтов целевого процессора
Проект [[Open Robotics]] - универсальные модули для построения роботов
Модули Open Robotics можно приобрести в магазине shop.roboforum.ru

Day OFF? You must be pulling my leg! Stop making humor before someone sees you, fool!

Аватара пользователя
blindman
 
Сообщения: 4130
Зарегистрирован: 29 апр 2008, 21:15
Откуда: Хабаровск
прог. языки: C,C++,Assembler,PHP,Javascript,Ruby, SPIN,Java(?)
ФИО: Андрей Юрьевич

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение dccharacter » 05 авг 2011, 12:20

ё-мае. спасибо
через пару лет я пойму, что ты мне написал :-)
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение dccharacter » 27 окт 2011, 21:35

Помогайте ПЛЗ. Пытаюсь создать диалоговое окно, смотрю вот на этот пример http://doc.qt.nokia.com/vs-add-in-1.1.7 ... ess-dialog:
Код: Выделить всёРазвернуть
 AddDialog dialog(this);

if (dialog.exec()) {
             QString name = dialog.nameEdit->text();
             QString email = dialog.emailEdit->text();

             if (!name.isEmpty() && !email.isEmpty()) {
                     QListWidgetItem *item = new QListWidgetItem(name, ui.addressList);
                     item->setData(Qt::UserRole, email);
                     ui.addressList->setCurrentItem(item);
             }
     }


У меня есть две формы - mainwindow.ui, dialog.ui. Объект класса Dialog является членом класса MainWindow:
Код: Выделить всёРазвернуть
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    Dialog *settingsDialog;
};


Создаем объект в конструкторе:
Код: Выделить всёРазвернуть
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    settingsDialog = new Dialog(this);
}


Проблема - объект MainWindow не видит объекты-члены settingsDialog (что, вроде как логично). На форумах говорят, что мол делай для каждого поля окна настроек метод, возвращающий значение. По логике я могу сделать метод класса Dialog, который при нажатии кнопки ОК будет ссыпать все настройки в файл настроек. А MainWindow будет оттуда настройки читать. Но я точно знаю, что Dead каким-то образом в orfa-terminal делал по-человечески, т.е. из методов MainWindow есть доступ к методам Dialog - но я уже всю бошку об стол разбил - не пойму как это сделано.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение Grem » 27 окт 2011, 21:43

Вообще то геттеры и сеттеры спасут вас. Это и есть правильное решение :)

Добавлено спустя 1 минуту 10 секунд:
я уже всю бошку об стол разбил - не пойму как это сделано.

Потому что начинать надо было с основ, а не с фреймворка.
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Аватара пользователя
Grem
 
Сообщения: 1530
Зарегистрирован: 16 май 2009, 12:50
Откуда: Россия
прог. языки: Java, C

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение dccharacter » 28 окт 2011, 00:06

Спасибо, будем сетать и гетать.
Я просто не поверил, что это на самом деле так.

Добавлено спустя 2 часа 12 минут 46 секунд:
ё-маё, кажись мне удалось вывихнуть мозг нужным образом... тут главное понять - кто папа, а кто мама.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Вопросы по Qt (ну и по С++ заодно)

Сообщение Grem » 28 окт 2011, 00:53

К стати, в этих ваших плюсах нельзя что ли в конструктор к dialog передать ссылку на mainwindow, чтоб через нее обращаться к приватным полям? Так тоже удобно, но не совсем правильно.
"There is nothing better than sliding down snow and flying through the air" (с) Shane McConkey.
Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Аватара пользователя
Grem
 
Сообщения: 1530
Зарегистрирован: 16 май 2009, 12:50
Откуда: Россия
прог. языки: Java, C

Пред.След.

Вернуться в Компьютеры в роботостроении

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6