百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

matlab读取表格数据以固定周期通过串口发送

moboyou 2025-04-28 22:35 12 浏览

如题,这里对数据的处理对于熟悉matlab各函数操作的同学来讲,是常规操作,但对于matlab新手或只是想借用matlab工具将存于PC端文件中的数据通过串口发送出去的工程人员来说,由于对matlab软件比较陌生,实现各种功能所应该调用的函数没有头绪,所以还是比较麻烦的。这里先简单介绍实现这项操作过程中的几个步骤,然后贴出完整代码,供大家需要时查询。

这里主要以功能分以下步骤:

  1. matlab读取指定文件数据
  2. 不同类型数据转换为字节数据
  3. 固定时间间隔的实现
  4. 操作串口发送数据

matlab读取指定文件数据

这里介绍两种读取方式:选择读取和指定读取

  • 选择读取

所谓选择读取即在m文件执行过程中由操作者自己选择要读取的文件,先上代码

clear all
%要操作的数据行数(从首行算起)
sym num ;
num=693;
%定义1列,num行数组变量
data_lat=zeros(1,num);

%选择读取文件数据
[FileName PathName]=uigetfile()
file=fullfile(PathName,FileName)
M=csvread(file);

%单独操作M矩阵的第一列1~num行数据
data_lat=M(1:num,1);

%画出读取的纬度数据,红色
plot(data_lat,'r');

上述代码的最终实现是选择文件读取其数据到M矩阵,并将数据的第一列的1~num行以红色画出图来。

代码执行后首先会弹出选择窗口,手动选定要操作的文件

注意这里可以自由选择不同路径下的文件,要操作的文件不一定在当前工作目录下。选择窗口的打开源于uigetfile()函数的执行,选择文件结束后函数返回被选择文件的路径和文件名

而后,fullfile()合成被选择文件的完整路径,并返回给file变量,最后通过csvread()函数将文件数据读取进来并形成M数据矩阵,如下原csv文件与M数据对比,原数据类型依次为
double/double/float/float/float/float

这里采用csvread()函数读取数据是因为笔者的原数据文件为.csv格式,需根据文件不同格式选择读取函数,如xlsread()函数

此外,matlab中数组和C语言的不同在于,没有0号元素,即没有0号下标的元素,都是从1号元素开始

  • 指定读取

指定读取即在m文件中直接指定要读取文件的完整路径,在程序执行过程中无需再选择文件

clear all
%要操作的数据行数(从首行算起)
sym num ;
num=693;
%定义1列,num行数组变量
data_lat=zeros(1,num);

%选择读取文件数据
% [FileName PathName]=uigetfile()
% file=fullfile(PathName,FileName)
% M=csvread(file);

%指定读取文件数据
M=csvread('D:\study\matlab\uart\3926_vehicle_global_position_0.csv');

%单独操作M矩阵的第一列1~num行数据
data_lat=M(1:num,1);
%画出读取的纬度数据,红色
plot(data_lat,'r');

不同类型数据转换为字节数据

串口常规发送8位字节数据,这里不同类型数据只有按计算机存储规则先转换为字节发送给接收端,接收端再按相同的存储规则将字节数据转换为原数据类型以完成数据的传输,这里首先存在一个数据转换的问题

%整型int
i2ubuff=zeros(1,4);
i2ubuff=typecast(int(12345),'uint8');
%单精度浮点型float
f2ubuff=zeros(1,4);
f2ubuff=typecast(single(data_lon(i)),'uint8');
%双精度浮点型double
d2ubuff=zeros(1,8);
d2ubuff=typecast(double(data_lat(i)),'uint8');

‘=’左侧即为不同数据类型返回的无符号字节数组数据,这里还有要注意的一项是发送端和接收端的数据存储模式,也即大端、小端问题

固定时间间隔的实现

数据准备好之后,有时需要一股脑的将数据全部发送出去,有时又需要以固定的周期,定时一部分一部分的发送出去。后者的定时作用,在单片机上一般由定时器timer或滴答定时器等实现精准的时间把控,在matlab中则需要调用函数来实现

  • 整秒定时

对于整秒时间间隔可以调用pause()函数,如定时3秒调用 pause(3) 即可实现

  • 压秒级定时

当要实现的时间间隔单位低于秒级时,pause()函数就无能为力了,tic toc函数可以实现

% 延时200ms
tic
while toc < 0.2
    
end

tic执行时,会获取实时系统时间t0,toc则一直获取当前系统时间t1与t0的时间差,如上,当时间间隔大于或等于0.2时,程序会跳出while循环向下执行,否则会在while中等待,注意这种延时存在一定的精度误差

操作串口发送数据

由于只执行简单的串口操作,和单片机控制串口的操作很相似

  • 指定端口,创建端口设备
s=serial('COM18');
  • 设置串口属性
set(s,'BaudRate',115200,'parity','none','databits',8,'stopbits',1);

属性名字,紧跟要设置成的属性

  • 打开串口
fopen(s);
  • 发送数据
fwrite(s,sendbuff);

关闭串口,删除内存中串口设备对象,清除工作空间中串口设备对象

fclose(s);
delete(s);
clear s;

有时打开串口后,程序由于某种原因未能执行完毕,中途退出后,再次运行程序会显示打开串口错误,要打开的串口被占用,这是因为上次运行出错的程序未能正确关闭串口。此时有两种选择,一是关闭matlab软件,解除占用,但是打开matlab并等待就绪会占用很长一段时间,挺让人不耐烦的。二是在命令窗口运行下列函数,解除占用

%强行关闭串口
scoms=instrfindall;
stopasync(scoms);
fclose(scoms);
delete(scoms);

完整代码

最后贴出笔者的完整代码,该代码的实现是读取.csv数据以5hz的频率将数据按固定格式发送出去

%串口发送程序
%测试数据在excel表中列顺序:经度、纬度、高度、y轴(东)速度、x轴(北)速度、z轴(下)速度
clear all

%操作的每列数据行数,从第一行算起
sym num
num=693;

%中间数据
global sendbuff
global f2ubuff
global d2ubuff
global data_lat
global data_lon
global data_alt
global data_vy
global data_vx
global data_vz
sendbuff=zeros(1,48);
f2ubuff=zeros(1,4);
d2ubuff=zeros(1,8);
data_lat=zeros(1,num);
data_lon=zeros(1,num);
data_alt=zeros(1,num);
data_vy=zeros(1,num);
data_vx=zeros(1,num);
data_vz=zeros(1,num);

%获取日志数据
[FileName PathName]=uigetfile();
file=fullfile(PathName,FileName);
M=csvread(file);
data_lat=M(1:num,1);
data_lon=M(1:num,2);
data_alt=M(1:num,3);
data_vy=M(1:num,4);
data_vx=M(1:num,5);
data_vz=M(1:num,6);

%选定串口,创建串口设备对象
s=serial('COM18');
fclose(s);
%设置串口属性
set(s,'BaudRate',115200,'parity','none','databits',8,'stopbits',1); 
%打开串口
fopen(s);
%固定字节
sendbuff(1)='#39;;
sendbuff(2)='E';
sendbuff(3)='X';
sendbuff(4)='Y';
sendbuff(5)='F';
sendbuff(6)=48;
sendbuff(7)=0;
sendbuff(8)=20;
sendbuff(9)=20;
sendbuff(42)=1;
sendbuff(43)=0;
sendbuff(44)=0;
sendbuff(45)=160;
sendbuff(46)=64;
sendbuff(47)=0;
sendbuff(48)=63;

for i=1:num
%纬度
d2ubuff=typecast(double(data_lat(i)),'uint8');
sendbuff(10)=d2ubuff(1);
sendbuff(11)=d2ubuff(2);
sendbuff(12)=d2ubuff(3);
sendbuff(13)=d2ubuff(4);
sendbuff(14)=d2ubuff(5);
sendbuff(15)=d2ubuff(6);
sendbuff(16)=d2ubuff(7);
sendbuff(17)=d2ubuff(8);
%经度
d2ubuff=typecast(double(data_lon(i)),'uint8');
sendbuff(18)=d2ubuff(1);
sendbuff(19)=d2ubuff(2);
sendbuff(20)=d2ubuff(3);
sendbuff(21)=d2ubuff(4);
sendbuff(22)=d2ubuff(5);
sendbuff(23)=d2ubuff(6);
sendbuff(24)=d2ubuff(7);
sendbuff(25)=d2ubuff(8);
%高度
f2ubuff=typecast(single(data_lon(i)),'uint8');
sendbuff(26)=f2ubuff(1);
sendbuff(27)=f2ubuff(2);
sendbuff(28)=f2ubuff(3);
sendbuff(29)=f2ubuff(4);
%vy
f2ubuff=typecast(single(data_vy(i)),'uint8');
sendbuff(30)=f2ubuff(1);
sendbuff(31)=f2ubuff(2);
sendbuff(32)=f2ubuff(3);
sendbuff(33)=f2ubuff(4);
%vx
f2ubuff=typecast(single(data_vx(i)),'uint8');
sendbuff(34)=f2ubuff(1);
sendbuff(35)=f2ubuff(2);
sendbuff(36)=f2ubuff(3);
sendbuff(37)=f2ubuff(4);
%vz
f2ubuff=typecast(single(data_vz(i)),'uint8');
sendbuff(38)=f2ubuff(1);
sendbuff(39)=f2ubuff(2);
sendbuff(40)=f2ubuff(3);
sendbuff(41)=f2ubuff(4);

fwrite(s,sendbuff);
% 延时200ms
tic
while toc < 0.2
    
end

end

%延时一段时间等待数据发送完毕再关闭串口,数据未发送完毕时,不能正常关闭串口
pause(3);
%关闭串口
fclose(s);
%删除内存中串口设备对象
delete(s);
%清除工作空间中串口设备对象
clear s;

相关推荐

声学EI要完稿?十步速写法

【推荐会议】国际声学与振动会议(ICAV)会议号:CFP23112A截稿时间:2025年4月20日召开时间/地点:2025年8月15-17日·新加坡论文集上线:会后3个月提交EiComp...

结构力学!EI会议图表规范秘籍

推荐会议:国际结构与材料工程进展大会(ISME2026)会议编号:EI#73521截稿时间:2026年3月10日召开时间/地点:2026年8月15-17日·德国柏林论文集上线:会后4...

傅里叶级数物理意义的直观理解:利用傅里叶级数逼近方波信号

上篇文章将向大家介绍频谱的概念,对傅里叶级数、傅里叶积分、傅里叶变换进行了数学的推导,并解释了它们各自的物理意义。推导过程见我的上一篇文章:频谱分析——频谱概念(傅里叶变换、级数、积分及物理意义)如下...

通过对航空发动机整机振动进行分析,有何控制方法?

前言针对航空发动机整机振动问题的复杂性和多样性,以整机振动的振源分析为出发点,总结国内外关于转子系统故障、气流激振、轴承故障、齿轮故障和结构局部共振等引起的整机振动的研究情况。结合航空发动机整机结构动...

MATLIB中使用PCA

主成分分析PCA(PrincipalComponentsAnalysis),奇异值分解SVD(Singularvaluedecomposition)是两种常用的降维方法降维致力于解决三类问题:降维...

数据处理|软件:让科研更简单2

书接上回,继续介绍免费的数据处理软件。eGPS一款热图绘制专用软件,热图就是用颜色代表数字,让数据呈现更直观,对比更明显。优点:小巧方便,基本功能齐全,包括数据转换、聚类分析、颜色调整等等缺点:常见的...

电力系统常用的通讯协议及其在Speedgoat系统中的实现

在电力系统中,IEC61850协议、DNP3协议、ModbusTCP广泛应用于远程终端设备(RTU)、智能电子设备(IED)交互以及监控和数据采集(SCADA)系统。一、IEC61850协议IE...

电子工程师的常用仿真软件

不知道从事电子行业的工程师,有没有使用模拟仿真工具,仿真软件网上又有很多,初学者,可能只知道Multisim和Proteus。一般Multisim适合在学习模拟电路和电路分析原理课程时使用,便于理解电...

技术论文|异结构混沌系统的组合同步控制及电路实现

欢迎引用[1]李贤丽,马赛,樊争先,王壮,马文峥,于婷婷.异结构混沌系统的组合同步控制及电路实现[J].自动化与仪器仪表,2022,No.276(10):80-84.DOI:10.14016/j.cn...

现场︱某110KV主变事故过程仿真分析

三峡电力职业学院、河南省电力公司洛阳供电公司的研究人员李莉、任幼逢、徐金雄、王磊,在2016年第6期《电气技术》杂志上撰文,针对某110KV变电站主变差动保护跳闸事故,结合事故相关检测数据,通过MAT...

光伏发电系统篇:单级式并网系统实时仿真

在全球积极推动清洁能源转型的大背景下,光伏发电作为重要的可再生能源利用方式,得到了广泛关注和迅猛发展。目前常用的光伏并网及光伏电站主要拓扑结构有单级式和双级式。相较于传统的多级式系统,单级式光伏发电并...

光伏发电系统篇:三电平并网逆变器实时仿真

一、三电平并网逆变器在能源转型加速的当下,分布式能源接入电网需求大增。三电平并网逆变器凭借低谐波、高功率密度等优势,有效提升电能转换效率,于新能源并网发电中担当关键角色。常见的三电平电路拓扑结构包括二...

自制3.5KW大功率逆变器,很简单,看过这个电路原理就懂了

前言拿下8000元奖金的项目,是什么水平?本项目经过联合湖南科技大学光伏逆变以及电力电子研究生团队共同探讨方案。项目成本:1200元,获得奖金:8000元!参加赛事:立创开源硬件平台_星火计划·外包赛...

圈内分享:电容式加速度计接口电路非线性建模与仿真设计

摘要:非线性是Sigma-Delta(ΣΔ)加速度计系统的关键指标之一。基于一个五阶ΣΔ加速度计结构,分析了其主要的非线性模块,在MATLAB中建立了整体结构的行为级模型,并利用根轨迹法进行了稳...

基于Matlab/Simulink建立一种Thevenin/RC电池模块仿真模型

本文以锂电池数学模型为基础,在Matlab/Simulink的仿真系统中,建立了一种Thevenin/RC电池模块仿真模型,通过实际工况试验,测试精度在允许误差范围内,为电池SOC/SOH研究提供了极...