![]() |
|
![]() ![]() ![]() |
|
7BON |
|
||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.11.2015 Репутация: нет Всего: нет |
Доброго дня! Произвожу передачу данных по COM порту(передача и прием осуществляется нормально) это через консоль. Ввожу таймер передача идет 8 байт, делаю остановку счетчика и снова запускаю, уже передача идет 16 байт и так каждый раз увеличивается на 8. В чем может быть проблема?
и второй вопрос, когда принимаю данные нужно отображать их на графике(использую библиотеку QCustomPlot). Вот код:
Добавлено через 1 минуту и 33 секунды Данные не отображаются. В чем может быть проблема? раньше с этой билиотекой не работал |
||||
|
|||||
baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
По первому пункту ничего не понял. А вот по второму -- после обновления данных для отрисовки, нужно вызывать метод replot(). Допишите его в конец метода MainWindow::setupQuadraticDemo и будет Вам счастье.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
baldman88 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 18.1.2009 Репутация: нет Всего: 7 |
И еще, по первому пункту. Зачем каждый раз создавать новый таймер? Создайте его в конструкторе. Плюс на один сигнал от таймера повешенно два слота. То, в какой очередности они выполнятся, будет зависеть от положения звезд на небе. Скорее всего из-за этого и происходит то, что вы описали.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
7BON |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.11.2015 Репутация: нет Всего: нет |
в первом пункте пробывал прописать, не сработало, а по второму у меня replot() прописан в конструкторе, прописал так как вы сказали не сработало
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Всегда нужно проверять число принятых байт.
Например, у меня сделано так:
Данные могут приходить по одному байту, а могут приходить сразу много. processData() ждет когда накопится нужное количество байт (у тебя 8) и обрабатывает их. Возвращает число обработанных байт, которые потом удаляются из буфера. |
|||
|
||||
math64 |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
т.е. x должен быть -1...1, y - 0...1, а у тебя x = 0...100, y зависит от data. В лучшем случае отобразятся только первые две точки. Что хотите конвертировать? Если не по этой теме, спрашивайте в новой. Добавлено через 2 минуты и 36 секунд так что да, первая точка вне диапазона, вторая в углу - можно не заметить. |
||||
|
|||||
7BON |
|
||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.11.2015 Репутация: нет Всего: нет |
math64 возможно я не правильно задаю свою посылку
Посылка по UART от компьютера(8 байт, скорость 115200 бод, один стоповый, без паритета) имеет следующую структуру: 1 - шапка - 0xA5; 2 - 0x01; 3 - старший байт адреса, по которому хранятся данные по току*; 4 - младший байт адреса, по которому хранятся данные по току*; 5 -7 - 0x00(резерв); 8 - кс; Ответная посылка имеет следующую структуру: 1 - шапка - 0xA5; 2 - 0x03; 3 - остаточная ёмкость в процентах; 4 - старший байт адреса, по которому хранятся данные по току; 5 - младший байт адреса, по которому хранятся данные по току; 6 - старший байт тока по запрашиваемому адресу; 7 - младший байт тока по запрашиваемому адресу; 8- кс; * - Первое измеренное значение начинается с адреса 0x0004, все последующие адреса рассчитываются добавлением 0x0002. это запись
это чтение
и вот значение I мне надо вывести подскажи как это сделать?? преобразование из шестнадцатиричной системы через функцию fromHex вроде бы Это сообщение отредактировал(а) 7BON - 18.12.2015, 08:55 |
||||
|
|||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Наиболее удобный способ преобразования числа в строку-
Для отображения в виде графика - пройдись по массивам x и y чтобы найти минимум и максимум для setRange(); |
|||
|
||||
kuzulis |
|
||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
1) В принципе, неправильно. Никто не гарантирует что readAll() вернет полный фрейм. 2) Парсить фреймы (также как и генерить) лучше используя QDataStream, а не
Например:
Это сообщение отредактировал(а) kuzulis - 18.12.2015, 11:59 |
||||||||
|
|||||||||
7BON |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.11.2015 Репутация: нет Всего: нет |
kuzulis можете мне сказать:
1. в этой строке
value1 переменнная? и еще контрольную сумму создать как отдельную переменную к примеру вот так
в read тоже самое получается? 2.
выдает ошибку 1 и 3 строки D:\program ZUAA\terminal QCustomPlot\mainwindow.cpp:249: ошибка: 'expectedFrameLength' was not declared in this scope if (serial->bytesAvailable() < expectedFrameLength) где лучше всего объявить эту функцию? ^ |
||||||
|
|||||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
expectedFrameLength - в Вашем случае конствнта, = 8.
Но если уж пользуемся QDataStream, то и задавать надо не числом, а примерно так:
Но: для правильного вычисления expectedFrameLength нужно, чтобы структура была упакована, а #pragma pack не гарантирует этого (хотя в большинстве компиляторов работает) Это сообщение отредактировал(а) math64 - 23.12.2015, 13:50 |
|||
|
||||
kuzulis |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
Если структура упакована, то и QDataStream не нужен.
![]() Но, ИМХО, все-таки лучше и гибче QDataStream - меньше ошибок будет. ТС, посмотри примеры из /network/fortuneclient&&fortuneserver, погугли, и все будет нормуль. ![]() PS: И не надо бездумно копипастить куски кода, нужно думать что там и для чего! Это сообщение отредактировал(а) kuzulis - 23.12.2015, 11:59 |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
||||
|
||||
7BON |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 20.11.2015 Репутация: нет Всего: нет |
math64 у меня несколько вопросов:
1. Правильно ли я прописал это в файле.h
2. чтение осуществляю таким образом
ошибка в последней строке. если использоваться будет QDataStream чтение по другому будет осуществляться или таким образом? и если можно показать напримере 3.
Адрес таким образом можно менять или другим способом лучше? Этот ответ добавлен с нового Винграда - http://vingrad.com |
||||||
|
|||||||
math64 |
|
||||||||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
1. Нет operator << для записи массива. Поэтому вместо
которое запишет строку нужно
Поскольку
порядок байт по умолчанию при записи address - тот, который нужен. Но при подсчете контрольной суммы нужно
Этого делать не нужно:
Вы уже все прочитали:
но результат нужно было записать в QByteArray или массив:
|
||||||||||||||
|
|||||||||||||||
![]() ![]() ![]() |
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |