petalinux_zynq7 驱动DAC以及ADC模块之五:nodejs+vue3实现web网页波形显示

前文:

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/136239572注意暂时mizar z7010暂时无法部署本web,提示堆栈内存不足,编译出错。但是可以在局域网内的linux或者windows机子上部署。nodejs是跨平台的。

0. 环境

- win10
- vscode

-ubuntu18

1. 搭建环境-win10

1.1 安装 node

安装 node-v20.10.0-x64.msi

安装到:
D:\Programs\nodejs\

cmd
node -v
npm -v

在node.js安装路径D:\Programs\nodejs下新建 node_cache 和 node_global 文件夹,

然后在cmd中运行
npm config set prefix "D:\Programs\nodejs\node_global"
npm config set cache “D:\Programs\nodejs\node_cache”

配置镜像加速,输入命令
npm config set registry=http://registry.npm.taobao.org

配置环境变量
在系统变量中新增
NODE_PATH D:\Programs\nodejs\node_global

在用户变量中的Path中新增
D:\Programs\nodejs\node_global

重新打开 cmd

1.2 全局安装 vue

npm install vue -g
npm install @vue/cli -g
vue -V

1.3 vue ui 创建项目

cmd
vue ui


浏览器切换到:http://localhost:8000/project/select
-> Create
-> 文件夹浏览到: E:\Workspaces\web
-> + Create a new project here
-> Details.Project folder: adda_vue
-> Details.Package manager: npm
-> 取消勾选  Git repository
-> Next
-> Presets.Select a preset: Manual -> Next
-> Features.Enable features: 勾选 Babel, Router, Vuex, Linter
-> Pick a linter / formatter config: ESLint with error prevention only
-> Create project
-> Continue without saving

-> Project dashboard -> Tasks -> 
-> build: Run task
-> serve: Run task
-> serve: Run task
    -> 点击 输出
    -> 
          App running at:
          - Local:   http://localhost:8081/ 
          - Network: http://192.168.123.238:8081/


1.4 helloworld

浏览器打开 http://localhost:8081/ 

2. 搭建环境-ubuntu18

2.1 安装 nodejs

下载 
https://nodejs.org/en/download/

得到 
node-v16.20.2-linux-x64.tar.xz

解压

tar -xvf node-v16.20.2-linux-x64.tar.xz
export PATH=$PATH:/home/xxjianvm/work/node-v16.20.2-linux-x64/bin
node -v
npm -v

配置镜像加速,输入命令

npm config set registry=http://registry.npm.taobao.org

2.2 全局安装 vue

npm install vue -g
npm install @vue/cli -g
npm install @vue/cli-init -g 
vue -V

问题:FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
解决办法:npm install -g increase-memory-limit

在zynq上空白项目可以解决,但是后面增加了功能后仍会出现,暂未解决。

2.3 创建项目

用vue create

cd ~
mkdir work && cd work
vue create adda_vue

    -> manual 
    -> Features.Enable features: 勾选 Babel, Router, Vuex, Linter
    -> 3.x
    -> ESLint with error prevention only
    -> Lint on save
    -> In dedicated config files
    

cd adda_vue
npm run serve


目前虚拟机内的ubuntu18自带火狐,显示白屏。和当前版本的nodejs + vue3不兼容。

浏览器打开 http://192.168.125.137:8080/

后续win10和ubuntu开发vue3的编程方法一样。

3. 新增页面Adc

切换目录

cd /home/xxjianvm/work/adda_vue/

3.1 AdcWave.vue

添加文件:

gedit src/components/AdcWave.vue

添加内容:

<template>
    <div class="hello">
      <h1>{{ msg }}</h1>
      <h2>Essential Links</h2>
      <ul>
        <li><a href="/">Home</a></li>
      </ul>
    </div>
  </template>

  <script>
  export default {
    name: 'AdcWave',
    props: {
      msg: String
    }
  }
  </script>

3.2 index.js

修改 router/index.js

gedit src/router/index.js

添加

import AdcWave from '@/components/AdcWave.vue'
const routes = [
  ...
  {
    path: '/adc',
    name: 'adc',
    component: AdcWave
  },
]

3.3 App.vue 

修改 App.vue

gedit src/App.vue


添加:
 

   <router-link to="/adc">Adc</router-link> |


4. echarts 折线图 demo

4.1 安装依赖(vscode内的TERMINAL执行也可以)

需要进入项目目录安装

cd /home/xxjianvm/work/adda_vue
npm install vue-echarts echarts

4.2 main.js中全局注册组件

修改 main.js

gedit src/main.js

添加:

import Echarts from "vue-echarts"
import * as echarts from "echarts"

createApp(App).use(store).use(router).mount('#app')


修改为:

const app = createApp(App)
app.component("v-chart", Echarts)
app.config.globalProperties.$echarts = echarts
app.use(store).use(router).use(Echarts).mount('#app')

4.3 修改页面

-> 修改 src/components/AdcWave.vue

gedit src/components/AdcWave.vue

4.3.1 <template>添加内容:

<template>
    ...
    <div class="echarts-box">
        <div id="myEcharts" :style="{ width: '900px', height: '300px' }"></div>
    </div>
</template>

4.3.2 <script> 

<script >
import * as echarts from "echarts"
import {onMounted} from "vue";

export default {
    name: 'AdcWave',
    props: {
      msg: String
    },
    setup() {
      onMounted(() => { // 需要获取到element,所以是onMounted的Hook
        let myChart = echarts.init(document.getElementById("myEcharts"));
        // 绘制图表
        myChart.setOption({
            xAxis: {
                type: 'category',
                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                data: [150, 230, 224, 218, 135, 147, 260],
                type: 'line'
                }
            ]
        });
        window.onresize = function () { // 自适应大小
          myChart.resize();
        };
      });
    }
}
</script>

5. 输入文本配置采样频率和数据长度

5.1 安装依赖(vscode内的TERMINAL执行也可以)

需要进入项目目录安装

cd /home/xxjianvm/work/adda_vue
npm install element-plus
npm install axios

5.2 修改main.js中全局注册组件

修改 main.js

gedit src/main.js

直接给出内容:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'


import Echarts from "vue-echarts"
import * as echarts from "echarts"

import ElementPlus from "element-plus";
import "element-plus/dist/index.css";

const app = createApp(App)
app.component("v-chart", Echarts)
app.config.globalProperties.$echarts = echarts
app.use(store).use(router).use(echarts).use(ElementPlus)
app.mount('#app')

5.3 vue.config.js

修改 工程根目录下的 vue.config.js
文件内容:

module.exports = {
  publicPath: './',
  transpileDependencies: true,
  devServer: {
    // 设置代理
    proxy: {
      "/api": {
        target: "http://192.168.123.138:5000", // 访问数据的计算机域名
        ws: true, // 是否启用websockets
        changOrigin: true, //开启代理,
        pathRewrite: { // 重写代理规则,/api开头,代理到/
          '^/api': '/'
          // 例:/api/user/login代理到
          // http://localhost:5000/user/login
        },
      },
    },
  },
};

注意:192.168.123.138是ZYNQ的IP。

5.4 AdcWave.vue内容

编辑文件

gedit src/components/AdcWave.vue


修改内容:

给出文件内容:

<template>
    <div class="hello">
      <h1>{{ msg }}</h1>
      <h2>Essential Links</h2>
      <ul>
        <li><a href="/">Home</a></li>
      </ul>
    </div>
    <div class="echarts-box">
        <div id="myEcharts" :style="{ width: '900px', height: '300px' }"></div>
    </div>
    <div class="home">
    <el-form ref="adcParamFormRef" :model="adcParamForm" class="demo-form-inline" label-width="150px">
        <el-form-item label="采样频率">
          <el-col :span="5">
            <el-input v-model="adcParamForm.sampleFrequency"></el-input>
          </el-col>
        </el-form-item>
        <el-form-item label="采样长度">
          <el-col :span="5">
            <el-input v-model="adcParamForm.sampleLength"></el-input>
          </el-col>
        </el-form-item>
      </el-form>
    <el-button type="primary" @click.enter.prevent="toAdcStart()">开始</el-button>
    <el-button type="primary" @click.enter.prevent="toAdcStop()">停止</el-button>

  </div>
</template>

<script >
import {onMounted} from "vue";
// @ is an alias to /src
import axios from "axios";
import { ElMessage } from 'element-plus'

import * as echarts from "echarts"

export default {

  name: 'AdcWave',
  props: {
    msg: String
  },

  data () {
    return {
      // 这是登录表单的数据绑定对象
      adcParamForm: {
        sampleFrequency: '100000',
        sampleLength: '100'
      },
    }
  },
  setup() {
    onMounted(() => { // 需要获取到element,所以是onMounted的Hook
      var chartDom = document.getElementById('myEcharts');
      var myChart = echarts.init(chartDom);
      var option;
      option = {
        title: {
          text: 'Dynamic Data & Time Axis'
        },
        tooltip: {
          trigger: 'axis',
          formatter: function (params) {
            params = params[0];
            return (
              String(params.value[1])
            );
          },
          axisPointer: {
            animation: false
          }
        },
        xAxis: {
          name: 'x',
        },
        yAxis: {
          name: 'y',
        },
        series: [
          {
            name: 'Fake Data',
            type: 'line',
            showSymbol: false,
            data: [],
          }
        ]
      };

      function hexToArr(str) {
        // hex字符串长度通常都是2的倍数,但为了放止意外,判断一下长度,不是2的倍数就在最前面补0
        if (str.length % 2) str = "0" + str
        let arr=[]
        for (let i = 0; i < str.length; i+=2) {
          let a=parseInt(str.slice(i,i+2),16)
          arr.push(a)
        }
        return arr
      }
      function trim(str) {
        var reg = /[\t\r\f\n\s]*/g;
        var trimStr;
        if (typeof str === 'string') {
          trimStr = str.replace(reg,'');
        }
        // console.log(trimStr)
        return trimStr
      }
      function generateDataFromArr(data_arr) {
        let data = [];
        for (let i = 0; i <= data_arr.length; i += 1) {
          data.push([i, data_arr[i]]);
        }
        return data;
      }
      setInterval(function () {
        var adc_enable = sessionStorage.getItem("adc_enable")
        if(adc_enable == undefined)   return;
        else if(adc_enable == "false") return;
        else{
          var adc_sampleFrequency = parseInt(sessionStorage.getItem("adc_sampleFrequency"))
          var adc_sampleLength = parseInt(sessionStorage.getItem("adc_sampleLength"))
          console.log(adc_sampleFrequency)
          console.log(adc_sampleLength)
          axios.post("/api/adda/adc",
            {
              sampleFrequency: adc_sampleFrequency,
              adc_length: adc_sampleLength
            },{}).then((res) => {
              if (res.data.code === 0) {
                var adc_data_arr = hexToArr(trim(res.data.hexString))
                myChart.setOption({
                  series: [
                    {
                      data: generateDataFromArr(adc_data_arr)
                    }
                  ]
                });
              }
            });
        }
      }, 1000);

      option && myChart.setOption(option);

    });
  },

  methods: {
    toAdcStart(){
      ElMessage("开始采样");
      sessionStorage.setItem("adc_enable",true)
      sessionStorage.setItem("adc_sampleFrequency",this.adcParamForm.sampleFrequency)
      sessionStorage.setItem("adc_sampleLength",this.adcParamForm.sampleLength)
    },
    toAdcStop(){
      ElMessage("结束采样");
      sessionStorage.setItem("adc_enable",false);
    }
  }
}
</script>

6. 运行效果[PC]

用postman修改为正弦波输出测试:

 

下篇:

 petalinux_zynq7 C语言驱动DAC以及ADC模块之六:qt显示adc波形icon-default.png?t=N7T8https://blog.csdn.net/qq_27158179/article/details/136241236

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库调优之 explain的学习

性能分析工具的使用 在数据库调优中&#xff0c;目标就是响应时间更快&#xff0c;吞吐量更大。利用宏观的监控工具和微观的日志分析可以帮助快速找到调优的思路与方式。 1.数据库服务器的优化步骤 整个流程分为观察(Show status)和行动(Action) 两个部分。字母S的部分代表观察…

RabbitMQ学习整理————基于RabbitMQ实现RPC

基于RabbitMQ实现RPC 前言什么是RPCRabbitMQ如何实现RPCRPC简单示例通过Spring AMQP实现RPC 前言 这边参考了RabbitMQ的官网&#xff0c;想整理一篇关于RabbitMQ实现RPC调用的博客&#xff0c;打算把两种实现RPC调用的都整理一下&#xff0c;一个是使用官方提供的一个Java cli…

C++【继承】

继承 继承的概念 继承是面向对象语言得三大特性之一&#xff08;继承、封装、多态&#xff09;&#xff0c;注&#xff1a;继承并不是C的特性&#xff0c;是面向对象语言的特性。 继承的概念&#xff1a; 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段…

U盘故障频发?了解原因,掌握正确使用方法!

U盘文件夹变打不开的文件是一种常见的故障&#xff0c;表现为用户无法访问存储在U盘中的文件或文件夹。这种故障通常是由于各种原因引起的&#xff0c;包括物理损坏、文件系统错误、病毒感染等。当遇到这种情况时&#xff0c;用户需要采取一些方法来恢复文件。 U盘故障频发&…

CentOS使用Docker搭建Halo网站并实现无公网ip远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

【前端素材】推荐优质后台管理系统Protable平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理和监控网站、应用程序或系统的在线工具。它通常是通过网页界面进行访问和操作&#xff0c;用于管理网站内容、用户权限、数据分析等。当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;…

微信小程序 --- wx.request网络请求封装

网络请求封装 网络请求模块难度较大&#xff0c;如果学习起来感觉吃力&#xff0c;可以直接学习 [请求封装-使用 npm 包发送请求] 以后的模块 01. 为什么要封装 wx.request 小程序大多数 API 都是异步 API&#xff0c;如 wx.request()&#xff0c;wx.login() 等。这类 API 接口…

crmeb多门店商城系统二次开发 增加车辆车牌搜索功能、车辆公里数

1、增加的数据库 ALTER TABLE eb_store_order ADD cart_number VARCHAR(255) NOT NULL DEFAULT COMMENT 车牌 AFTER erp_order_id, ADD curmileage VARCHAR(255) NOT NULL DEFAULT COMMENT 当前里程 AFTER cart_number; ALTER TABLE eb_store_cart ADD cart_number VARCHAR(…

go使用trpc案例

1.go下载trpc go install trpc.group/trpc-go/trpc-cmdline/trpclatest 有报错的话尝试配置一些代理&#xff08;选一个&#xff09; go env -w GOPROXYhttps://goproxy.cn,direct go env -w GOPROXYhttps://goproxy.io,direct go env -w GOPROXYhttps://goproxy.baidu.com/…

【机器学习的主要任务和应用领域】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 简述概要知识图谱 简述概要 了解机器学习的主要任务和应用领域 知识图谱 机器学习的主要任务可以分为监督学习、无监督学习和半监督学习。 监督学习&#xff1a;这是机器学习中最为常见的一类任务&#xff0c;基于已知类…

如何设置离线启动NVIDIA Chat with RTX

第一步 先上图C:\Users\test\AppData\Local\NVIDIA\ChatWithRTX\RAG\trt-llm-rag-windows-main\ui 默认安装的地址 用户名可能会有差异&#xff0c;需要注意下 增加如图中深色的地方 shareTrue, 第二步 科学上网 把下面的都下载下来 保存到自己的磁盘中 修改路径 如下图 如…

对Redis锁延期的一些讨论与思考

上一篇文章提到使用针对不同的业务场景如何合理使用Redis分布式锁&#xff0c;并引入了一个新的问题 若定义锁的过期时间是10s&#xff0c;此时A线程获取了锁然后执行业务代码&#xff0c;但是业务代码消耗时间花费了15s。这就会导致A线程还没有执行完业务代码&#xff0c;A线程…

2024年【起重机司机(限桥式起重机)】找解析及起重机司机(限桥式起重机)考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【起重机司机(限桥式起重机)】找解析及起重机司机(限桥式起重机)考试总结&#xff0c;包含起重机司机(限桥式起重机)找解析答案和解析及起重机司机(限桥式起重机)考试总结练习。安全生产模拟考试一点通结合国家…

游戏平台如何定制开发?

随着科技的飞速发展和互联网的普及&#xff0c;游戏平台已成为人们休闲娱乐的重要选择。为了满足用户多样化的需求&#xff0c;游戏平台的定制开发显得尤为重要。本文将探讨游戏平台定制开发的过程、关键要素以及注意事项&#xff0c;为有志于涉足此领域的开发者提供参考。 一、…

springboot自定义starter,实现自动装配

1、SpringBoot Starter介绍 随着Spring的日渐臃肿&#xff0c;为了简化配置、开箱即用、快速集成&#xff0c;Spring Boot 横空出世。 目前已经成为 Java 目前最火热的框架了。平常我们用Spring Boot开发web应用。Spring mvc 默认使用tomcat servlet容器&#xff0c; 因为Sprin…

ChatGPT 4 教你完成学生表,教师表,课程表,选课表之间的SQL学习

数据源准备&#xff1a; # 学生表 create table student( sno varchar(10) primary key, #学号sname varchar(20), #姓名sage int(2), #年龄ssex varchar(5) #性别 ); #教师表 create table teacher( tno varchar(10) primary …

git切换仓库地址

已有git仓库&#xff0c;要切换提交的仓库地址&#xff0c;用以下命令 git remote set-url origin 自己的仓库地址 用以下命令&#xff0c;查看当前仓库地址&#xff1a; git remote show origin 切换仓库后&#xff0c;用以下命令初始化提交仓库&#xff1a; git push -u o…

ES6 | (一)ES6 新特性(上) | 尚硅谷Web前端ES6教程

文章目录 &#x1f4da;ES6新特性&#x1f4da;let关键字&#x1f4da;const关键字&#x1f4da;变量的解构赋值&#x1f4da;模板字符串&#x1f4da;简化对象写法&#x1f4da;箭头函数&#x1f4da;函数参数默认值设定&#x1f4da;rest参数&#x1f4da;spread扩展运算符&a…

Java-Arrays工具类的常见方法总结

在Java中&#xff0c;提供了一个专门用于操作数组的工具类&#xff0c;即Arrays类&#xff0c;该类提供了一些方法对数组进行排序&#xff0c;打印&#xff0c;复制等操作。下面是一些该工具类方法总结。 1.Arrays.aslist() 作用&#xff1a;当我们想直接将数组中的全部内容(…