Matlab 实时读取串口并绘图

Matlab 实时读取串口并绘图

Vofa+

Vofa+ 是一个很好的跨平台上位机软件,但是它无法保存数据,而且作者也并没有要继续更新的意思,保存数据功能应该是遥遥无期了。因此本文使用 Matlab 实时读取串口数据,并使用 plot 函数绘制。

vofa+ 里发送 float 型数据的协议是 justfloat,其具体规则如下:
在这里插入图片描述

下位机发送数据

下位机发送程序各有不同,下面是一个例子,使用的是 DSP28027 单片机,定义了全局变量 gTime 做时间向量:

void myPutVariableData_vofa(void)
{int   num = 6; // number of float variables to be sentfloat data[6]      = {0}; // float variables to be sent uint16_t txBuf[14] = {0}; float testData = 114514.0;float testW    = 10.0;txBuf[2 * num]     = 0x0000;txBuf[2 * num + 1] = 0x7f80;data[0] = testData;data[1] = testData;data[2] = testData;data[3] = testData;data[4] = testData;data[5] = sin(2 * 3.1415 * testW * gTime);memcpy(txBuf, (uint16_t *)data, num * sizeof(float));mySCI_sendDataBlocking(txBuf, 2 * num + 2);
}

Matlab 代码

使用 matlab 读取串口主要分为接收数据和协议解析,用的方法比较粗暴,直接读取串口然后判断帧尾。

Step 1. 设置串口

Matlab 中使用 serialportlist 命令查找电脑连接的串口,找到对应设备名称后在设置相关参数

devicelist = serialportlist' % This command shows the port connected.baudrate        = 115200;
device          = "/dev/cu.usbserial-A700eG4x";
myPort          = serialport(device,baudrate); 
myPort.DataBits = 8;
myPort.StopBits = 1;
myPort.Parity   = "none";

Step 2. 设置数据缓冲区

设置绘图数据的个数和时间窗口大小,本文设置 6 个数据, 2000 个采样点的窗口,每一帧传输时间使用 d t = ( n ∗ 4 + 4 ) ∗ 8 BIT Baudrate dt = \frac{(n*4+4)*8 \text{BIT}}{\text{Baudrate}} dt=Baudrate(n4+4)8BIT 计算, n n n 为传输数据个数。然后将数据缓冲区都初始化为0:

varNum = 6;
buf    = 2000;
dt     = (varNum * 4 + 4) * 8 / baudrate;
time   = -dt*(buf/2):dt:dt*(buf/2-1);dataBuf.var0 = zeros(buf,1);
dataBuf.var1 = zeros(buf,1);
dataBuf.var2 = zeros(buf,1);
dataBuf.var3 = zeros(buf,1);
dataBuf.var4 = zeros(buf,1);
dataBuf.var5 = zeros(buf,1);

这里也可以使用动态命名变量来初始化:

varNum = 6;
buf    = 2000;
dt     = (varNum * 4 + 4) * 8 / baudrate;
time   = -dt*(buf/2):dt:dt*(buf/2-1);for i = 1:varNumnamelist{i} = ['var',num2str(i-1)];dataBuf.(namelist{i}) = zeros(buf,1);
end

Step 3. 协议解析

协议解析主要是找到帧尾标志,使用 read() 读取4字节串口数据并判断是否是帧尾,找到帧尾就可以按照对应位置解析数据。转换 00 00 80 7F 为十进制数组 0 0 128 127 再进行判断,如果找到帧尾,就依次读取数据位(这里读取的是下一帧的数据,差一帧)。然后使用 circshift() 循环存储数据,让缓冲区的最后一位始终存储最新的数据。

因为数据是小端浮点数组(先发低位再发高位),所以使用 flip() 函数重新排序,然后将读取到的数据转换为 uint32,再使用 typecast() 函数转换为单精度浮点型数据。

dec2uint32 = @(dec)uint32(dec * [2^24, 2^16, 2^8, 2^0]');
temp = read(myPort,4,'uint8');
if prod(temp == [0 0 128 127])temp = read(myPort, varNum * 4, 'uint8');dataBuf.var0 = circshift(dataBuf.var0);dataBuf.var0(end) = typecast(dec2uint32(flip(temp(1:4))),'single');dataBuf.var1 = circshift(dataBuf.var1);dataBuf.var1(end) = typecast(dec2uint32(flip(temp(5:8))),'single');dataBuf.var2 = circshift(dataBuf.var2);dataBuf.var2(end) = typecast(dec2uint32(flip(temp(9:12))),'single');dataBuf.var3 = circshift(dataBuf.var3);dataBuf.var3(end) = typecast(dec2uint32(flip(temp(13:16))),'single');dataBuf.var4 = circshift(dataBuf.var4);dataBuf.var4(end) = typecast(dec2uint32(flip(temp(17:20))),'single');dataBuf.var5 = circshift(dataBuf.var5);dataBuf.var5(end) = typecast(dec2uint32(flip(temp(21:24))),'single');
end

同样这里可以使用动态变量命名简化代码:

temp = read(myPort,4,'uint8');
if prod(temp == [0 0 128 127])temp = read(myPort, varNum * 4, 'uint8');for i = 1:varNumdataBuf.(namelist{i})      = circshift(dataBuf.(namelist{i}),-1);dataBuf.(namelist{i})(end) = typecast(dec2uint32(flip(temp((i-1) * 4 + 1: i * 4))),'single');end
end

Step 4. 绘制数据

先建立 figure 对象,使用 while 判断窗体存在条件,持续绘制数据

h   = figure;
plotenabled = 0;%%
while(ishandle(h))temp = read(myPort,4,'uint8');if prod(temp == [0 0 128 127])temp = read(myPort, varNum * 4, 'uint8');for i = 1:varNumdataBuf.(namelist{i})      = circshift(dataBuf.(namelist{i}),-1);dataBuf.(namelist{i})(end) = typecast(dec2uint32(flip(temp((i-1) * 4 + 1: i * 4))),'single');endplot(time, dataBuf.var5,'b-','LineWidth',1.5);if plotenabled == 0plotenabled = 1;grid ontitle('Matlab Serial Port Read','FontSize',14,'FontName','Times New Roman');xlabel('Time','FontSize',14,'FontName','Times New Roman');ylabel('Value','FontSize',14,'FontName','Times New Roman');endendplotenabled = 0;
end
  • 变量 plotenabled 用于首次绘图设置绘图参数,只有第一次绘图的时候会执行设置 title, xlabel, ylabel 等参数。

完整的 Matlab 代码如下:

%---------------------------------------
% This is the series port read script
%
% hu 2023-07-07 Created
% hu 2024-04-10 Test vofa+ protocol
%---------------------------------------clc,clear,close all
devicelist = serialportlist' % This command shows the port connected.baudrate        = 115200;
device          = "/dev/cu.usbserial-A700eG4x";
myPort          = serialport(device,baudrate); 
myPort.DataBits = 8;
myPort.StopBits = 1;
myPort.Parity   = "none";varNum   = 6;
buf      = 2000;
dt       = (varNum * 4 + 4) * 8 / baudrate;
time     = -dt*(buf/2):dt:dt*(buf/2 - 1);for i = 1:varNumnamelist{i} = ['var',num2str(i-1)];dataBuf.(namelist{i}) = zeros(buf,1);
end
dec2uint32 = @(dec)uint32(dec * [2^24, 2^16, 2^8, 2^0]');h   = figure;
plotenabled = 0;%%
while(ishandle(h))temp = read(myPort,4,'uint8');if prod(temp == [0 0 128 127])temp = read(myPort, varNum * 4, 'uint8');for i = 1:varNumdataBuf.(namelist{i})      = circshift(dataBuf.(namelist{i}),-1);dataBuf.(namelist{i})(end) = typecast(dec2uint32(flip(temp((i-1) * 4 + 1: i * 4))),'single');endplot(time, dataBuf.var5,'b-','LineWidth',1.5);if plotenabled == 0plotenabled = 1;grid ontitle('Matlab Serial Port Read','FontSize',14,'FontName','Times New Roman');xlabel('Time','FontSize',14,'FontName','Times New Roman');ylabel('Value','FontSize',14,'FontName','Times New Roman');endendplotenabled = 0;
end
clc,clear,close all

绘制数据可以通过 fig 窗口保存到本地,或者在数据转换后保存到工作区,这里不再赘述。

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

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

相关文章

洛谷P1305 新二叉树

Java 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();char arr[][] new char[n][3];for (int i 0; i < n; i) {String strsc.next();char arr1[]str.toCharArray()…

Linux学习-网络UDP

网络 数据传输,数据共享 网络协议模型 OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式&#xff08;数据报、流式&#…

hexo接入github Discussions评论系统

评论存储仓 可以是你的博客项目的(github)仓库&#xff0c;也可以单独新建一个评论存储仓库。 我的博客项目在gitee上&#xff0c;就以新建存储仓为例&#xff1a; 使用Discussions评论系统必须开通Discussions模块&#xff01; 安装giscus插件 https://github.com/apps/…

如何在香橙派AIpro开发板升级CANN软件包

香橙派AIpro开发板是香橙派联合昇腾精心打造的高性能AI开发板&#xff0c;开发者可以基于昇腾CANN软件栈能力&#xff0c;快速构建AI应用和业务&#xff0c;实现图像、视频等多种数据分析与推理计算。在之前的文章中&#xff0c;我们已经了解了如何搭建开发环境&#xff0c;并基…

通过调用Vcenter-Api获取Vcenter中服务器信息

通过调用Vcenter-Api获取Vcenter中服务器信息 文章目录 通过调用Vcenter-Api获取Vcenter中服务器信息1. 获取Vmware API帮助文档2. 获取访问凭证3. 获取服务器清单4. 获取服务器更多信息5. 获取虚机更多信息6. 获取磁盘信息7. 获取操作系统相关 1. 获取Vmware API帮助文档 htt…

SHAP安装问题

一、安装 pip install shap -i https://pypi.tuna.tsinghua.edu.cn/simple 二、遇到问题 1、提示报错如下&#xff1a; ModuleNotFoundError: No module named numba.core 安装numba&#xff1a; pip install numba -i https://pypi.tuna.tsinghua.edu.cn/simple 提示已经…

FPGA核心板在声呐系统中的应用

前言 声纳系统使用声脉冲来探测、识别和跟踪水下物体。一个完整的声纳系统是由一个控制和显示部件、一个发射器电路、一个接收器电路和同时能作为发射装置&#xff08;扬声器&#xff09;和探测装置&#xff08;高灵敏度麦克风&#xff09;的传感器组成。 声纳系统图 技术挑战…

python爬虫----BeautifulSoup(第二十天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

Linux/October

October Enumeration Nmap 扫描发现对外开放了22和80端口&#xff0c;使用nmap详细扫描这两个端口 ┌──(kali㉿kali)-[~/vegetable/HTB/October] └─$ nmap -sC -sV -p 22,80 -oA nmap 10.10.10.16 Starting Nmap 7.…

基于Springboot的笔记记录分享网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的笔记记录分享网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

华为OD技术面试-有序数组第K最小值

背景 2024-03-15华为od 二面&#xff0c;记录结题过程 有序矩阵中第 K 小的元素 - 力扣&#xff08;LeetCode&#xff09; https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/submissions/512483717/ 题目 给你一个 n x n 矩阵 matrix &#xff0c;其…

基于spring boot的班级综合测评管理系统

基于spring boot的班级综合测评管理系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开…

总分410+专业130+国防科技大学831信号与系统考研经验国防科大电子信息与通信工程,真题,大纲,参考书。

好几个学弟催着&#xff0c;总结一下我自己的复习经历&#xff0c;希望大家复习少走弯路&#xff0c;投入的复习正比换回分数。我专业课831信号与系统130&#xff08;感觉比估分要低&#xff0c;后面找Jenny老师讨论了自己拿不准的地方也没有错误&#xff0c;心里最近也这经常回…

蓝桥备赛——组合数、其他技巧

对字符串进行permutations排列组合 from itertools import permutations a abc #对字符串进行permutations排列组合 for i in permutations(a,3):x .join(i)print (x,end ) print (\n------------------------------------) permutations后面的参数&#xff0c;第一个表示…

有趣的css - 动态雷达扫描

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是使用 css 实现一个动态的雷达扫描&#xff0c;快学起来吧&#xff01; 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码…

[2024最新]MySQL-mysql 8.0.11安装教程

网上的教程有很多&#xff0c;基本上大同小异。但是安装软件有时就可能因为一个细节安装失败。我也是综合了很多个教程才安装好的&#xff0c;所以本教程可能也不是普遍适合的。 安装环境&#xff1a;win 10 1、下载zip安装包&#xff1a; MySQL8.0 For Windows zip包下载地…

可视化大屏的应用(12):在智慧制造中的十大价值

一、什么是智慧制造 智慧制造是指通过信息技术、物联网、人工智能等先进技术的应用&#xff0c;实现生产过程的数字化、网络化、智能化&#xff0c;从而提高生产效率、降低成本、提高产品质量和灵活性的一种制造模式。 智慧制造的核心是将传统的制造过程与先进的信息技术相结合…

前端自动化测试-Jest

前端自动化测试 Jest官网&#xff1a;https://jestjs.io 安装方式 npm install --save-dev jest yarn add --dev jest cnpm add --save-dev jest 使用方法 所有以 .test.js 结尾的都是测试文件 基础用法示例 num.js&#xff1a; export function getSum (a, b) {return a b…

java下载网络上的文件、图片保存到本地 FileUtils

java下载网络上的文件、图片保存到本地 FileUtils 1. 引入FileUtils依赖2. 实现代码3. 输出结果 1. 引入FileUtils依赖 <!--FileUtils依赖--> <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency><groupId>commons-io&l…

手把手教你从零搭建ChatGPT网站AI绘画系统,(SparkAi系统V6)GPTs应用、DALL-E3文生图、AI换脸、垫图混图、SunoAI音乐生成

一、系统前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持…