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

前文:

petalinux_zynq7 C语言驱动DAC以及ADC模块之一:建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二:petalinuxhttps://blog.csdn.net/qq_27158179/article/details/136236138petalinux_zynq7 C语言驱动DAC以及ADC模块之三:实现C语言API并编译出库被python调用https://blog.csdn.net/qq_27158179/article/details/136238093petalinux_zynq7 C语言驱动DAC以及ADC模块之四:python实现http_apihttps://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:

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> |

  1. 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波形https://blog.csdn.net/qq_27158179/article/details/136241236

相关推荐
辻戋10 小时前
从零实现React Scheduler调度器
前端·react.js·前端框架
徐同保10 小时前
使用yarn@4.6.0装包,项目是react+vite搭建的,项目无法启动,报错:
前端·react.js·前端框架
Qrun11 小时前
Windows11安装nvm管理node多版本
前端·vscode·react.js·ajax·npm·html5
中国lanwp11 小时前
全局 npm config 与多环境配置
前端·npm·node.js
JELEE.12 小时前
Django登录注册完整代码(图片、邮箱验证、加密)
前端·javascript·后端·python·django·bootstrap·jquery
TeleostNaCl14 小时前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享
前端大卫16 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友16 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
Js_cold17 小时前
Verilog宏define
fpga开发·verilog
小李小李不讲道理18 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design