Технический форум по робототехнике.
Angel71 » 10 мар 2011, 23:13
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 » 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, и несколько раз проскакивает ближе к концу диапазона...
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;
Возможно так будет лучше?
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));
Grem » 04 авг 2011, 00:46
Т.е просто QByteArray->left(2).toInt(0, 16) не катит?
dccharacter » 04 авг 2011, 01:50
нет!
т.е. оно не может перевести, скажем 'a' в 97. Оно может только 'a'->61h->97
Добавлено спустя 1 минуту 16 секунд:
ну т.е. если бы там было '2' или "234", то оно бы перевело toInt-ом сразу в 2 и 234 соответственно, а вот на "018f" уже фейлится.
blindman » 05 авг 2011, 06:45
- Код: Выделить всё • Развернуть
#include <QtEndian>
ui->outputVoltageValue->setNum(qFromBigEndian<quint16>((const uchar*)fromSerialPort->constData()));
fromSerialPort должен содержать не менее 2 байт
dccharacter » 05 авг 2011, 11:25

А у меня совсем неправильно?
А я правильно понимаю, что твой пример - он с перестановкой байт и т.д.?
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(). Это шаблонная функция, которая учитывает тип возвращаемого значения и порядок байтов целевого процессора
dccharacter » 05 авг 2011, 12:20
ё-мае. спасибо
через пару лет я пойму, что ты мне написал

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 - но я уже всю бошку об стол разбил - не пойму как это сделано.
Grem » 27 окт 2011, 21:43
Вообще то геттеры и сеттеры спасут вас. Это и есть правильное решение
Добавлено спустя 1 минуту 10 секунд:я уже всю бошку об стол разбил - не пойму как это сделано.
Потому что начинать надо было с основ, а не с фреймворка.
dccharacter » 28 окт 2011, 00:06
Спасибо, будем сетать и гетать.
Я просто не поверил, что это на самом деле так.
Добавлено спустя 2 часа 12 минут 46 секунд:
ё-маё, кажись мне удалось вывихнуть мозг нужным образом... тут главное понять - кто папа, а кто мама.
Grem » 28 окт 2011, 00:53
К стати, в этих ваших плюсах нельзя что ли в конструктор к dialog передать ссылку на mainwindow, чтоб через нее обращаться к приватным полям? Так тоже удобно, но не совсем правильно.