petalinux_zynq7 驱动DAC以及ADC模块之六:qt显示adc波形

前文:

petalinux_zynq7 C语言驱动DAC以及ADC模块之一:建立IPicon-default.png?t=N7T8https://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二:petalinuxicon-default.png?t=N7T8https://blog.csdn.net/qq_27158179/article/details/136236138petalinux_zynq7 C语言驱动DAC以及ADC模块之三:实现C语言API并编译出库被python调用icon-default.png?t=N7T8https://blog.csdn.net/qq_27158179/article/details/136238093petalinux_zynq7 C语言驱动DAC以及ADC模块之四:python实现http_apiicon-default.png?t=N7T8https://blog.csdn.net/qq_27158179/article/details/136239572petalinux_zynq7 C语言驱动DAC以及ADC模块之五:nodejs+vue3实现web网页波形显示icon-default.png?t=N7T8https://blog.csdn.net/qq_27158179/article/details/136240421本文:ubuntu18搭建zynq qt开发环境。

0. 环境

mizar z7010
vivado 2018.3
petalinux 2018.3
ubuntu18

1. 获取linux-qt

1.1 下载

petalinux2018.3配套的qt版本是5.9.6。

下载地址:

https://download.qt.io/new_archive/qt/5.9/5.9.6/

下载
qt-opensource-linux-x64-5.9.6.run
qt-everywhere-opensource-src-5.9.6.tar.xz

1.2 安装

sudo chmod 777 qt-opensource-linux-x64-5.9.6.run
./qt-opensource-linux-x64-5.9.6.run

-> Next
-> 这里需要注册一个账号,并登录
-> Next
-> Installation Folder:    /home/xxjianvm/Qt5.9.6 -> Next
-> Select Components -> 勾选 Desktop gcc 64-bit,勾选 Qt Charts,勾选 Developer and Designer Tools -> Next
-> License Agreement -> Next
-> Install

1.3 界面 helloworld

通过开始界面打开 Qt Creator

1.3.1 创建工程

Qt Creator -> File -> New File or Project -> Application -> Qt Widgets Application -> choose

Location
-> Name:         hello_qt
-> Create in:     /home/xxjianvm/work/workspace_qt/
-> Next

Details
-> Class Information:    hello_qt -> Next

Summary -> Finish

1.3.2 编译

问题:Could not determine which "make" command to run
解决办法:sudo apt install make

问题:/bin/sh: 1: g++: not found
解决办法:sudo apt install g++

问题:/usr/bin/ld: cannot find -lGL
解决办法:find /usr/lib/ -name "libGL*" 
sudo ln -s /usr/lib/x86_64-linux-gnu/libGL.so.1 /usr/lib/libGL.so

1.3.2 修改界面

双击 hello_qt/Forms/hello_qt.ui

添加 Push Button -> 
-> objectName: Btn_Hello
-> 右键 -> Go to slot... -> clicked() -> OK

修改 hello_qt.cpp:
#include <QtWidgets/QMessageBox>

void hello_qt::on_Btn_Hello_clicked()
{
    QMessageBox msgBox;
    msgBox.setText("Hello");
    msgBox.exec();
}

编译运行

2. 安装sdk

前文petalinux篇生成了sdk。

/home/dell/work/mizar/linux_sd_adda/images/linux/sdk.sh


拷贝到

/home/xxjianvm/work/mizar/sdk.sh

安装

chmod +x sdk.sh
./sdk.sh


安装到

/opt/petalinux/2018.3

测试

source /opt/petalinux/2018.3/environment-setup-cortexa9hf-neon-xilinx-linux-gnueabi
arm-xilinx-linux-gnueabi-gcc -v

打开 qtcreator

source /opt/petalinux/2018.3/environment-setup-cortexa9hf-neon-xilinx-linux-gnueabi
/home/xxjianvm/Qt5.9.6/Tools/QtCreator/bin/qtcreator

注意打开qtcreator前需要source SDK的交叉编译环境。 

3. 添加Kit

Qt Creator -> Tools -> Options -> Build & Run

3.1 Compilers

-> Build & Run -> Compilers -> Manual -> C -> Add -> GCC -> C
    -> Name:            arm-xilinx-linux-gnueabi-gcc
    -> Compiler path:    /opt/petalinux/2018.3/sysroots/x86_64-petalinux-linux/usr/bin/arm-xilinx-linux-gnueabi/arm-xilinx-linux-gnueabi-gcc
-> Kits -> Compilers -> Manual -> C++ -> Add -> GCC -> C++
    -> Name:            arm-xilinx-linux-gnueabi-g++
    -> Compiler path:    /opt/petalinux/2018.3/sysroots/x86_64-petalinux-linux/usr/bin/arm-xilinx-linux-gnueabi/arm-xilinx-linux-gnueabi-g++

3.2 Debuggers

-> Build & Run -> Debuggers -> Manual -> Add -> 
    -> Name:    arm-xilinx-linux-gnueabi-gdb
    -> Path:    /opt/petalinux/2018.3/sysroots/x86_64-petalinux-linux/usr/bin/arm-xilinx-linux-gnueabi/arm-xilinx-linux-gnueabi-gdb

3.3 Qt Versions


-> Build & Run -> Qt Versions -> Manual -> Add -> 
    -> Version name:    Qt %{Qt:Version} (zynq7)
    -> qmake location:    /opt/petalinux/2018.3/sysroots/x86_64-petalinux-linux/usr/bin/qt5/qmake

3.4 Kits


-> Build & Run -> Kits -> Manual -> Add
    -> Name:    zynq7
    -> Sysroot:            /opt/petalinux/2018.3/sysroots/cortexa9hf-neon-xilinx-linux-gnueabi
    -> Compiler C:        arm-xilinx-linux-gnueabi-gcc
    -> Compiler C++:    arm-xilinx-linux-gnueabi-g++
    -> Debugger:        arm-xilinx-linux-gnueabi-gdb
    -> Qt version:        Qt 5.9.6 (zynq7)


4. 界面 helloworld

通过开始界面打开 Qt Creator

4.1 创建工程

Qt Creator -> File -> New File or Project -> Application -> Qt Widgets Application -> choose

Location
-> Name:         hello2_qt
-> Create in:     /home/xxjianvm/work/workspace_qt/
-> Next

Kits ->
-> 全选 -> Next

Build System:
-> Build System: qmake -> Next

Details
-> Class Information:    hello2_qt -> Next

-> Finish

4.2 修改界面

双击 helloworld_ui/Forms/hello_qt.ui

添加 Push Button -> 
-> objectName: Btn_Hello
-> 右键 -> Go to slot... -> clicked() -> OK

修改 hello2_qt.cpp:
#include <QtWidgets/QMessageBox>

void hello2_qt::on_Btn_Hello_clicked()
{
    QMessageBox msgBox;
    msgBox.setText("Hello.");
    msgBox.exec();
}

4.3 编译

左下角可以切换kit,切换后编译。可以分别编译出本机可以运行的程序,和zynq运行的。

4.4 运行[ZYNQ]

拷贝
/home/xxjianvm/work/workspace_qt/build-hello2_qt-zynq7-Debug/hello2_qt
到板子上的
/root/hello2_qt

配置QT程序的启动的方式 
(如果没有配置X11,环境变量使用export QT_QPA_PLATFORM=linuxfb)
export DISPLAY=:0.0
export QT_QPA_PLATFORM=linuxfb
chmod +x hello2_qt
./hello2_qt

5. adda_qt

5.1 打开 qtcreator

source /opt/petalinux/2018.3/environment-setup-cortexa9hf-neon-xilinx-linux-gnueabi
/home/xxjianvm/Qt5.9.6/Tools/QtCreator/bin/qtcreator


5.2 创建工程

Qt Creator -> File -> New File or Project -> Application -> Qt Widgets Application -> choose

Location
-> Name:         adda_qt
-> Create in:     /home/xxjianvm/work/workspace_qt/
-> Next

Kits ->
-> 全选 -> Next

Build System:
-> Build System: qmake -> Next

Details
-> Class Information:    adda_qt -> Next

-> Finish

5.3 添加模块

修改 adda_qt.pro
添加:
QT       += widgets
QT       += charts

5.4. 修改界面


双击 adda_qt/Forms/adda_qt.ui

采样频率:
添加 Label -> text: frequency: 
添加 Line Edit ->
    -> objectName: LEdit_AdcFrequency

采样长度:
添加 Line Edit ->
-> objectName: LEdit_AdcLength


采样配置:
添加 Push Button -> 
-> objectName: Btn_AdcSample
-> text:        AdcStart
-> 右键 -> Go to slot... -> clicked() -> OK

采样开始:
添加 Push Button -> 
-> objectName: Btn_AdcDataRequest
-> text:        AdcStart
-> 右键 -> Go to slot... -> clicked() -> OK

图表
添加 Containers 的 Widget 到窗口 -> 
-> objectName: Chart_data
-> 右键 widget -> promote to...
-> Promoted class name:    QChartView 
-> Add -> Promote


5.5 添加源码


/home/xxjianvm/work/mizar/code/adda.c
/home/xxjianvm/work/mizar/code/adda.h
拷贝到
/home/xxjianvm/work/workspace_qt/adda_qt/adda.cpp
/home/xxjianvm/work/workspace_qt/adda_qt/adda.h

5.6 修改源码

5.6.1 adda_qt.h

#ifndef ADDA_QT_H
#define ADDA_QT_H#include <QMainWindow>
#include <QtCharts>
QT_CHARTS_USE_NAMESPACEnamespace Ui {
class adda_qt;
}class adda_qt : public QMainWindow
{Q_OBJECTpublic:explicit adda_qt(QWidget *parent = 0);~adda_qt();private slots:void on_Btn_DataRequest_clicked();void on_Btn_AdcConfig_clicked();void timer1_period();private:Ui::adda_qt *ui;
};#endif // ADDA_QT_H

5.6.2 adda_qt.cpp

#include "adda_qt.h"
#include "ui_adda_qt.h"
#include "adda.h"QChart* m_chart;
QLineSeries* m_lineSeries_1;
QList<QPointF> listForChartLine_1;
QList<QPointF> listForChartLineHistory_1;
int AXIS_MAX_X = 300;adda_qt::adda_qt(QWidget *parent) :QMainWindow(parent),ui(new Ui::adda_qt)
{ui->setupUi(this);m_chart = new QChart();m_lineSeries_1 = new QLineSeries();m_lineSeries_1->setName("ch1");ui->Chart_data->setChart(m_chart);  // 将图表绑定到视图QTimer *timer = new QTimer(this);connect(timer, SIGNAL(timeout()), this, SLOT(timer1_period()));timer->start(1000);
}adda_qt::~adda_qt()
{delete ui;
}
bool flag_RequestDataStart = false;
void adda_qt::on_Btn_DataRequest_clicked()
{setbuf(stdout,NULL);if(flag_RequestDataStart){flag_RequestDataStart = false;ui->Btn_DataRequest->setText("AdcStart");printf("[on_Btn_DataRequest_clicked]start");}else{flag_RequestDataStart = true;ui->Btn_DataRequest->setText("AdcStop");printf("[on_Btn_DataRequest_clicked]stop");demo_dac_sin();}
}uint32_t AdcParam_SampleFrequency = 100000;
uint32_t AdcParam_SampleLength = 100;
void adda_qt::on_Btn_AdcConfig_clicked()
{setbuf(stdout,NULL);AdcParam_SampleFrequency = ui->LEdit_AdcFrequency->text().toInt();AdcParam_SampleLength = ui->LEdit_AdcLength->text().toInt();printf("[on_Btn_AdcConfig_clicked]AdcParam_SampleFrequency = %d\r\n", AdcParam_SampleFrequency);printf("[on_Btn_AdcConfig_clicked]AdcParam_SampleLength = %d\r\n", AdcParam_SampleLength);
}
void adda_qt::timer1_period(){if(flag_RequestDataStart){printf("ticks");// demo
//        printf("listForChartLINE1.size() = %d\r\n", listForChartLine_1.size());
//        if(listForChartLine_1.size() >= AXIS_MAX_X){
//            listForChartLine_1.removeAt(0);
//        }
//        double value = sin(static_cast<double>(0.5f * listForChartLineHistory_1.size()));
//        int current_size1 = listForChartLineHistory_1.size();
//        listForChartLineHistory_1.append(QPointF(current_size1, value));//require adc data// initadda_open();// 设置采样频率adda_AdcSetSampleFrequency(AdcParam_SampleFrequency);// 开始采样uint8_t adc_buff[10240];uint16_t adc_buff_length = AdcParam_SampleLength;adda_AdcSampleData(adc_buff, adc_buff_length);// closeadda_close();// 打印结果
//        printf("adc_buff[%d]: ", adc_buff_length);
//        for(int i =0;i<adc_buff_length;i++){
//            printf("%02X ", adc_buff[i]);
//        }
//        printf("\r\n");for (int i = 0; i < adc_buff_length; i++){double ch1_value = adc_buff[i];int current_size1 = listForChartLineHistory_1.size();listForChartLineHistory_1.append(QPointF(current_size1, ch1_value));}listForChartLine_1.clear();if(listForChartLineHistory_1.size() <= AXIS_MAX_X){listForChartLine_1.append(listForChartLineHistory_1);}else{long long listForChartLineHistory_1_size = listForChartLineHistory_1.size();for(int i = 0; i < AXIS_MAX_X; i++){listForChartLine_1.append(listForChartLineHistory_1[listForChartLineHistory_1_size - AXIS_MAX_X + i]);}}m_lineSeries_1 = new QLineSeries();m_lineSeries_1->append(listForChartLine_1);//在serial中添加数据m_lineSeries_1->setName("test1");m_chart = new QChart();//m_chart->removeAllSeries(); //清除即可,重要操作,QChart刷新的必要操作m_chart->addSeries(m_lineSeries_1);   // 将系列添加到图表m_chart->createDefaultAxes();       // 基于已添加到图表的 series 来创建默认的坐标轴ui->Chart_data->setChart(m_chart);  // 将图表绑定到视图}
}

5.7 编译

5.7.1 上位机运行测试界面

切换KIT

编译

运行查看界面

5.7.2 交叉编译出ZYNQ版本

 切换KIT

 编译

6. 板子运行测试

 用winscp拷贝adda_qt到板子上 

export DISPLAY=:0.0
export QT_QPA_PLATFORM=linuxfb
chmod +x adda_qt
./adda_qt

参考

[1]【正点原子FPGA连载】第十章Petalinux构建Qt和OpenCV交叉编译开发环境 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南,https://blog.csdn.net/weixin_55796564/article/details/128615252
 

好了,本系列暂告一段落。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/698078.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】——模板初阶 | STL简介

前言: 模板初阶 | STL简介 文章目录 一、模板初阶1.1 函数模板1.2 类模板 二、STL简介 &#xff08;了解&#xff09; 一、模板初阶 泛式编程&#xff08;Generic Programming&#xff09;指的是一种编程范式&#xff0c;其核心思想是编写可以在不同数据类型上通用的代码&#…

智能科技助力服装业:商品计划管理系统的革命性变革

随着智能科技的飞速发展&#xff0c;服装行业正在经历前所未有的变革。在这股浪潮中&#xff0c;商品计划管理系统的智能化转型成为了行业的核心驱动力。这种变革不仅极大地提高了服装企业的运营效率和市场竞争力&#xff0c;更为整个行业的可持续发展注入了新的活力。 智能商…

你听说过柔性数组吗?

目录 1. 柔性数组的概念 2. 柔性数组的特点 3. 柔性数组的使用 4. 柔性数组的优势 5.完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#…

怎么理解ping?这是我听过最好的回答

晚上好&#xff0c;我是老杨。 Ping这几个字母&#xff0c;已经深入网工人的骨髓了吧&#xff1f; 把Ping用到工作里&#xff0c;肯定不少人在用&#xff0c;但对Ping的了解和理解是不是足够深&#xff0c;取决了你能在工作里用到什么程度&#xff0c;能让它帮你到什么地步。…

美格智能联合罗德与施瓦茨完成5G RedCap模组SRM813Q验证,推动5G轻量化全面商用

全球5G发展进入下半场&#xff0c;5G RedCap以其低成本、低功耗的特性成为行业焦点。近日&#xff0c;中国移动携手合作伙伴率先完成全球最大规模、最全场景、最全产业的RedCap现网规模试验&#xff0c;推动首批芯片、终端具备商用条件&#xff0c;RedCap端到端产业已全面达到商…

10.CSS3的calc函数

CSS3 的 calc 函数 经典真题 CSS 的计算属性知道吗&#xff1f; CSS3 中的 calc 函数 calc 是英文单词 calculate&#xff08;计算&#xff09;的缩写&#xff0c;是 CSS3 的一个新增的功能。 MDN 的解释为可以用在任何长度、数值、时间、角度、频率等处&#xff0c;语法如…

Spring6学习技术|Junit

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; Junit 背景 背景就是每次Test都要重复创建容器&#xff0c;获取对象。就是ApplicationContext和getBean两个语句。通过Spring整合Junit&#xff0c;可以…

sentinel的资源数据指标是如何采集

资源数据采集 之前的NodeSelectorSlot和ClusterBuilderSlot已经完成了对资源调用树的构建, 现在则是要对资源进行收集, 核心点就是这些资源数据是如何统计 LogSlot 作用: 记录异常请求日志, 用于故障排查 public class LogSlot extends AbstractLinkedProcessorSlot<Def…

统计图雷达图绘制方法

统计图雷达图绘制方法 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图环形图绘制较难。 还有一种雷达图的绘制也较难&#xff0c;今提供雷达图的绘制方法供参考。 本方法采用C语言的最基本功能&#xff1a; &am…

跟着野火学FreeRTOS:第二段(事件组)

在小节里面介绍了二进制信号量&#xff0c;计数信号量&#xff0c;互斥量和递归互斥量等功能&#xff0c;其中二进制信号量和计数信号量&#xff08;也包括队列&#xff09;常用于任务和任务之间以及任务和中断之间的同步&#xff0c;她们具有以下属性&#xff1a; 当等待的事…

Day15-Linux系统特殊权限知识精讲

Day15-Linux系统特殊权限知识精讲 为什么创建文件默认权限为644&#xff0c;目录为755&#xff1f;&#xff1f;&#xff1f; umask 权限掩码。控制系统的文件和目录的默认权限。 [rootoldboy oldboy]# umask 0022针对文件来说&#xff1a;默认权限计算方法 6 6 6 0 2 2 - …

为什么0.1+0.2不等于0.3

一、JS内部的计算是以二进制形式进行的 js里整数和小数转为二进制形式的方法是不一样的&#xff1a; 二、Number类型使用IEEE754标准64位存储 双精度浮点数&#xff08;double类型&#xff09;为每个数分配64位空间&#xff0c;并以科学计数法的方式存储&#xff1a; 那么对于…

C++入门学习(三十三)函数的定义,两数之和函数作为例子

为什么使用函数&#xff1a;将一些重复的代码封装&#xff0c;方便以后的使用&#xff0c;直接调用即可。 先给一个例子&#xff1a; // 函数返回整数类型 int addNumbers(int a, int b) { // 函数体 int sum a b; return sum; // 返回计算得到的和 } 返回值类型&…

基于卷积神经网络的图像去噪

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 基于卷积神经网络的图像去噪 完整代码:基于卷积神经网络的图像去噪.rar资源-CSDN文库 https://download.csdn.net/download/abc9918351…

(全注解开发)学习Spring-MVC的第三天

全注解开发 第一部分 : 1.1 消除spring-mvc.xml 这些是原来spring-mvc.xml配置文件的内容 <!--1、组件扫描, 使Controller可以被扫描到--><context:component-scan base-package"com.itheima.controller"/><!--2、非自定义的Bean, 文件上传解析器--&…

mysql-多表查询-外连接

一、外连接查询语法 &#xff08;1&#xff09;左外连接 select 所要查询的内容 from 左表 left outer join 右表 on 条件; &#xff08;2&#xff09;右外连接 select 所要查询的内容 from 左表 right outer join 右表 on 条件; 二、示例 用以下两张表示例 左外连接 右外…

Pyglet综合应用|推箱子游戏之关卡图片载入内存

目录 读取图片 分割图片 综合应用 本篇为之前写的博客《怎样使用Pyglet库给推箱子游戏画关卡地图》的续篇&#xff0c;内容上有相关性&#xff0c;需要阅读的请见链接&#xff1a; https://hannyang.blog.csdn.net/article/details/136209138 「推箱子」是一款风靡全球的益…

system V 共享内存

1.共享内存的原理 要理解共享内存的原理&#xff0c;首先我们得记起进程间通信的前提&#xff1a;必须让不同的进程看到同一份资源&#xff08;必须由OS提供&#xff09; 我们都知道进程都会有自己的进程地址空间&#xff0c;然后都会通过页表与物理内存进行映射&#xff0c;…

图纸透明加密:保护机械图纸安全的新方法

随着信息技术的不断发展&#xff0c;机械制造行业对于图纸安全的需求越来越高。机械图纸是企业的核心竞争力之一&#xff0c;泄露可能导致严重的商业损失和技术风险。为了解决这一问题&#xff0c;图纸透明加密成为了一种新的保护机械图纸安全的方法。本文将介绍图纸透明加密的…

面试字节跳动,我被怼的好狠,怎一个惨字了得

人们都说&#xff0c;这个世界上有两种人注定单身&#xff0c;一种是太优秀的&#xff0c;另一种是太平凡的。 我一听呀&#xff1f;那我这岂不是就不优秀了吗&#xff0c;于是毅然决然和女朋友分了手。 人们都说&#xff0c;互联网寒冬来了&#xff0c;这个时候还在大面积招人…