LINUX.ORG.RU

Разработка программы для отображения данных с устройства в реальном времени


0

2

Есть некоторый самодельный девайс. Он связан с компьютером через переходник USB->UART и шлёт с некоторой частотой (в настоящий момент - 100 Гц) пакеты данных (все разделены переносами строк, бинарные закодированы в base64, текстовые идут как есть). На компьютере нужно эти данные принять и показать в удобном виде: для части данных показывать их сиюминутное значение, для части строить графики во времени. А ещё нужно по кнопкам отсылать на девайс команды.

На чём такое лучше всего запилить? Пока думаю на Python. Сделал на нём и библиотеке pyserial консольное приложение, которое очищает экран escape-последовательностью, выводит все данные, ждёт следующей порции. Но так графики рисовать не получится, да и с управлением будут проблемы. Нужно переходить на GUI.

С помощью каких библиотек это лучше всего сделать? От набора требуется поддежка работы с последовательным портом, декодирования base64 и построения графиков.

★★★★★

От набора требуется поддежка работы с последовательным портом, декодирования base64 и построения графиков.

?

ты хочешь одну либу которая бы это делала?

100 Гц это немного, pyserial + base64 + threading + что-угодно-для-графиков, например Matplotlib, PyQtGraph, PyQwt... тысячи их https://wiki.python.org/moin/NumericAndScientific/Plotting

val-amart ★★★★★
()
Последнее исправление: val-amart (всего исправлений: 1)
Ответ на: комментарий от val-amart

Пробую вывести график изменения одной величины. Создаю график и добавляю его в окно Tkinter:

f = Figure(figsize=(5, 4), dpi=100)
a = f.add_subplot(111)
canvas = FigureCanvasTkAgg(f, master=main_window)
canvas.show()
canvas.get_tk_widget().pack()

Затем внутри обработчика прихода новых данных в нити чтения данных:

values.append(value)
if len(values) > 100:
	del values[0]
a.plot(values)

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

Вероятно, я что-то делаю не так, а нормального примера как с помощью matplotlib строить реалтаймовые графики я не нашёл.

KivApple ★★★★★
() автор топика
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

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

val-amart ★★★★★
()
Ответ на: комментарий от val-amart

Я таки нашёл ошибку. Нужно вызывать canvas.show(). После добавления всех графиков с помощью a.plot(), а также очищать область в начале итерации с помощью a.clear() (Иначе будут добавляться всё новые и новые графики вместо обновления существующего). Однако, Python не удовлетворяет моим потребностям в скорости. При частоте 10 Гц и показе 9 разных величин (6 на одном графике и 3 на другом) всё глючит.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от trex6

Пытаюсь подключить в Qt Creator библиотеку для работы с последовательным портом.

Пишу в .pro файле:

QT       += core gui serial

А оно мне пишет:

Project MESSAGE: Warning: unknown QT: serial

При том, что пакет libqextserialport-dev установлен.

KivApple ★★★★★
() автор топика
Ответ на: комментарий от quickquest

Интересная штука. Надо взять на заметку. Вдруг понадобится — а тут как раз готовый каркас. Выдираешь ненужное, добавляешь свое — вуаля!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Тьфу ты! Раскатал губу...

Purchase the GPL source code for the baudline signal analyzer. The source code is expensive and it is intended for qualified corporate or institutional buyers. Contact us for details.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от KivApple

Я QSerialPort отдельно собирал, т.к. до сих пор сижу на 4.x

trex6 ★★★★★
()
Ответ на: комментарий от exception13

ScadaBR наиболее развита (если чесно... считай, я её изучил). oscada это тот ещё пипец. Всё нужно мышкой тыкать. openscada (которая на эклипсе) ещё сыровата. А больше и сравнивать нечего.

ziemin ★★
()
Последнее исправление: ziemin (всего исправлений: 1)
Ответ на: комментарий от Harald

Тогда скажи в какую сторону копать, чтобы работать с ним асинхронно. То есть типа select в libc и g_io_watch в glib, но для Qt.

KivApple ★★★★★
() автор топика

Есть некоторый самодельный девайс. Он связан с компьютером через переходник USB->UART и шлёт с некоторой частотой <skip />

На компьютере нужно эти данные принять <skip />

На чём такое лучше всего запилить? Пока думаю на Python.

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

MKuznetsov ★★★★★
()
Ответ на: комментарий от Harald

Он же заблокирует основной цикл приложения, не? Плюшка g_io_watch была в том, что опрос файлового дескриптора реализовывался внутри главного цикла приложения (а когда данные появлялись вызывался callback).

KivApple ★★★★★
() автор топика
Ответ на: комментарий от KivApple

Всё было бы так легко, если бы разработчиком железки не являлся я же.

оупс :)

требуется поддежка работы с последовательным портом, декодирования base64 и построения графиков.

я-бы сделал на tcl/tk - у того на борту от рождения всё есть и он для таких вот целей и сделан. Рабочий прототип пишется всего за день-другой.

НО! если железкой будешь пользоваться не только ты, то по хорошему делается консольное приложение (чистый CLI или даже демон, без esc-последовательстей и ncurses), а GUI позже как его морда.

MKuznetsov ★★★★★
()
Ответ на: комментарий от KivApple

можно в отдельный тред и оттуда посылать сигналы в слоты Qt.

насчет питона — проблема вероятно не в языке, а в коде (возможно даже не твоем а одной из библиотек). но профилиривать долго и муторно.

val-amart ★★★★★
()
Ответ на: комментарий от KivApple

можно выставить маленький таймаут, можно пускать select в отдельном потоке

Harald ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.