当前位置:   article > 正文

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

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

解压

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

配置镜像加速,输入命令

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

2.2 全局安装 vue

  1. npm install vue -g
  2. npm install @vue/cli -g
  3. npm install @vue/cli-init -g 
  4. 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

  1. cd ~
  2. mkdir work && cd work
  3. 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
    

  1. cd adda_vue
  2. 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

添加内容:

  1. <template>
  2.     <div class="hello">
  3.       <h1>{{ msg }}</h1>
  4.       <h2>Essential Links</h2>
  5.       <ul>
  6.         <li><a href="/">Home</a></li>
  7.       </ul>
  8.     </div>
  9.   </template>
  10.   <script>
  11.   export default {
  12.     name: 'AdcWave',
  13.     props: {
  14.       msg: String
  15.     }
  16.   }
  17.   </script>

3.2 index.js

修改 router/index.js

gedit src/router/index.js

添加

  1. import AdcWave from '@/components/AdcWave.vue'
  2. const routes = [
  3.   ...
  4.   {
  5.     path: '/adc',
  6.     name: 'adc',
  7.     component: AdcWave
  8.   },
  9. ]

3.3 App.vue 

修改 App.vue

gedit src/App.vue


添加:
 

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


4. echarts 折线图 demo

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

需要进入项目目录安装

  1. cd /home/xxjianvm/work/adda_vue
  2. npm install vue-echarts echarts

4.2 main.js中全局注册组件

修改 main.js

gedit src/main.js

添加:

  1. import Echarts from "vue-echarts"
  2. import * as echarts from "echarts"

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


修改为:

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

4.3 修改页面

-> 修改 src/components/AdcWave.vue

gedit src/components/AdcWave.vue

4.3.1 <template>添加内容:

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

4.3.2 <script> 

  1. <script >
  2. import * as echarts from "echarts"
  3. import {onMounted} from "vue";
  4. export default {
  5.     name: 'AdcWave',
  6.     props: {
  7.       msg: String
  8.     },
  9.     setup() {
  10.       onMounted(() => { // 需要获取到element,所以是onMounted的Hook
  11.         let myChart = echarts.init(document.getElementById("myEcharts"));
  12.         // 绘制图表
  13.         myChart.setOption({
  14.             xAxis: {
  15.                 type: 'category',
  16.                 data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  17.             },
  18.             yAxis: {
  19.                 type: 'value'
  20.             },
  21.             series: [
  22.                 {
  23.                 data: [150, 230, 224, 218, 135, 147, 260],
  24.                 type: 'line'
  25.                 }
  26.             ]
  27.         });
  28.         window.onresize = function () { // 自适应大小
  29.           myChart.resize();
  30.         };
  31.       });
  32.     }
  33. }
  34. </script>

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

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

需要进入项目目录安装

  1. cd /home/xxjianvm/work/adda_vue
  2. npm install element-plus
  3. npm install axios

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

修改 main.js

gedit src/main.js

直接给出内容:

  1. import { createApp } from 'vue'
  2. import App from './App.vue'
  3. import router from './router'
  4. import store from './store'
  5. import Echarts from "vue-echarts"
  6. import * as echarts from "echarts"
  7. import ElementPlus from "element-plus";
  8. import "element-plus/dist/index.css";
  9. const app = createApp(App)
  10. app.component("v-chart", Echarts)
  11. app.config.globalProperties.$echarts = echarts
  12. app.use(store).use(router).use(echarts).use(ElementPlus)
  13. app.mount('#app')

5.3 vue.config.js

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

  1. module.exports = {
  2. publicPath: './',
  3. transpileDependencies: true,
  4. devServer: {
  5. // 设置代理
  6. proxy: {
  7. "/api": {
  8. target: "http://192.168.123.138:5000", // 访问数据的计算机域名
  9. ws: true, // 是否启用websockets
  10. changOrigin: true, //开启代理,
  11. pathRewrite: { // 重写代理规则,/api开头,代理到/
  12. '^/api': '/'
  13. // 例:/api/user/login代理到
  14. // http://localhost:5000/user/login
  15. },
  16. },
  17. },
  18. },
  19. };

注意:192.168.123.138是ZYNQ的IP。

5.4 AdcWave.vue内容

编辑文件

gedit src/components/AdcWave.vue


修改内容:

给出文件内容:

  1. <template>
  2. <div class="hello">
  3. <h1>{{ msg }}</h1>
  4. <h2>Essential Links</h2>
  5. <ul>
  6. <li><a href="/">Home</a></li>
  7. </ul>
  8. </div>
  9. <div class="echarts-box">
  10. <div id="myEcharts" :style="{ width: '900px', height: '300px' }"></div>
  11. </div>
  12. <div class="home">
  13. <el-form ref="adcParamFormRef" :model="adcParamForm" class="demo-form-inline" label-width="150px">
  14. <el-form-item label="采样频率">
  15. <el-col :span="5">
  16. <el-input v-model="adcParamForm.sampleFrequency"></el-input>
  17. </el-col>
  18. </el-form-item>
  19. <el-form-item label="采样长度">
  20. <el-col :span="5">
  21. <el-input v-model="adcParamForm.sampleLength"></el-input>
  22. </el-col>
  23. </el-form-item>
  24. </el-form>
  25. <el-button type="primary" @click.enter.prevent="toAdcStart()">开始</el-button>
  26. <el-button type="primary" @click.enter.prevent="toAdcStop()">停止</el-button>
  27. </div>
  28. </template>
  29. <script >
  30. import {onMounted} from "vue";
  31. // @ is an alias to /src
  32. import axios from "axios";
  33. import { ElMessage } from 'element-plus'
  34. import * as echarts from "echarts"
  35. export default {
  36. name: 'AdcWave',
  37. props: {
  38. msg: String
  39. },
  40. data () {
  41. return {
  42. // 这是登录表单的数据绑定对象
  43. adcParamForm: {
  44. sampleFrequency: '100000',
  45. sampleLength: '100'
  46. },
  47. }
  48. },
  49. setup() {
  50. onMounted(() => { // 需要获取到element,所以是onMounted的Hook
  51. var chartDom = document.getElementById('myEcharts');
  52. var myChart = echarts.init(chartDom);
  53. var option;
  54. option = {
  55. title: {
  56. text: 'Dynamic Data & Time Axis'
  57. },
  58. tooltip: {
  59. trigger: 'axis',
  60. formatter: function (params) {
  61. params = params[0];
  62. return (
  63. String(params.value[1])
  64. );
  65. },
  66. axisPointer: {
  67. animation: false
  68. }
  69. },
  70. xAxis: {
  71. name: 'x',
  72. },
  73. yAxis: {
  74. name: 'y',
  75. },
  76. series: [
  77. {
  78. name: 'Fake Data',
  79. type: 'line',
  80. showSymbol: false,
  81. data: [],
  82. }
  83. ]
  84. };
  85. function hexToArr(str) {
  86. // hex字符串长度通常都是2的倍数,但为了放止意外,判断一下长度,不是2的倍数就在最前面补0
  87. if (str.length % 2) str = "0" + str
  88. let arr=[]
  89. for (let i = 0; i < str.length; i+=2) {
  90. let a=parseInt(str.slice(i,i+2),16)
  91. arr.push(a)
  92. }
  93. return arr
  94. }
  95. function trim(str) {
  96. var reg = /[\t\r\f\n\s]*/g;
  97. var trimStr;
  98. if (typeof str === 'string') {
  99. trimStr = str.replace(reg,'');
  100. }
  101. // console.log(trimStr)
  102. return trimStr
  103. }
  104. function generateDataFromArr(data_arr) {
  105. let data = [];
  106. for (let i = 0; i <= data_arr.length; i += 1) {
  107. data.push([i, data_arr[i]]);
  108. }
  109. return data;
  110. }
  111. setInterval(function () {
  112. var adc_enable = sessionStorage.getItem("adc_enable")
  113. if(adc_enable == undefined) return;
  114. else if(adc_enable == "false") return;
  115. else{
  116. var adc_sampleFrequency = parseInt(sessionStorage.getItem("adc_sampleFrequency"))
  117. var adc_sampleLength = parseInt(sessionStorage.getItem("adc_sampleLength"))
  118. console.log(adc_sampleFrequency)
  119. console.log(adc_sampleLength)
  120. axios.post("/api/adda/adc",
  121. {
  122. sampleFrequency: adc_sampleFrequency,
  123. adc_length: adc_sampleLength
  124. },{}).then((res) => {
  125. if (res.data.code === 0) {
  126. var adc_data_arr = hexToArr(trim(res.data.hexString))
  127. myChart.setOption({
  128. series: [
  129. {
  130. data: generateDataFromArr(adc_data_arr)
  131. }
  132. ]
  133. });
  134. }
  135. });
  136. }
  137. }, 1000);
  138. option && myChart.setOption(option);
  139. });
  140. },
  141. methods: {
  142. toAdcStart(){
  143. ElMessage("开始采样");
  144. sessionStorage.setItem("adc_enable",true)
  145. sessionStorage.setItem("adc_sampleFrequency",this.adcParamForm.sampleFrequency)
  146. sessionStorage.setItem("adc_sampleLength",this.adcParamForm.sampleLength)
  147. },
  148. toAdcStop(){
  149. ElMessage("结束采样");
  150. sessionStorage.setItem("adc_enable",false);
  151. }
  152. }
  153. }
  154. </script>

6. 运行效果[PC]

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

 

下篇:

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/148512
推荐阅读
相关标签
  

闽ICP备14008679号