- файлы C++, которые обрабатывают все вызовы UHD/USRP и высокоскоростные интерфейсы между радиомодулем и конечными точками потока.
- Сценарий Python, использующий NiceGUI для отправки команд приложению C++ для управления поведением USRP.
- Скрипт Python, использующий NiceGUI для отправки команд приложению C++ для управления поведением USRP.
- Сценарий Python, использующий NiceGUI PyQt для отображения базового представления анализатора спектра части выборок, полученных от радиостанции. Эти образцы передаются через ZMQ с достаточно низкой скоростью, чтобы избежать переполнения.
У меня возникла проблема между частями 1 и 3, когда я пытаюсь использовать файлы C++ с графическим интерфейсом анализатора спектра.
Если я запустите скрипт Python анализатора спектра перед вызовом функции uhd::usrp::multi_usrp::make() в моем приложении на C++, анализатор спектра работает как положено. Появится окно X-forwarded, и я могу нормально с ним взаимодействовать. Кроме того, анализатор спектра продолжает работать после запуска uhd::usrp::multi_usrp::make().
Однако, если я запускаю скрипт Python анализатора спектра после вызова uhd::usrp::multi_usrp::make(), графический интерфейс проходит этапы настройки, но никогда не отображается. Более того, я не могу остановить сценарий с помощью CTRL-C в консоли. Единственный способ заставить сценарий ответить — закрыть приложение C++. После закрытия приложения C++ графический интерфейс анализатора спектра открывается правильно.
Из-за высокой скорости передачи данных X440 UHD использует DPDK под капотом. Не уверен, что это актуально, но я хотел об этом упомянуть.
Что может быть причиной этого? Я пробовал отладку на стороне Python, но подозреваю, что она зависает на уровне системы, поэтому отладка Python не эффективна.
Минимальный код графического интерфейса, воспроизводящий проблему:
from pyqtgraph.Qt import QtWidgets, QtCore
class myGui(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# Layout
layout = QtWidgets.QVBoxLayout(self)
ctrl_layout = QtWidgets.QHBoxLayout()
layout.addLayout(ctrl_layout)
print("Done here") # This line prints but then the app never shows if
# started after the C++ applications
def main():
print("main")
app = QtWidgets.QApplication([])
gui = myGui()
gui.resize(1200, 900)
gui.show()
app.exec()
if __name__ == "__main__":
main()
Минимальный код C++, который приведет к зависанию, если код графического интерфейса запускается после создания USRP:
#include
#include
#include
#include
#include
#include
#include
#include
int UHD_SAFE_MAIN(int argc, char* argv[]) {
// minimal config for demonstration
uhd::usrp::multi_usrp::sptr usrp_;
std::cout
Подробнее здесь: https://stackoverflow.com/questions/798 ... pplication
Мобильная версия