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

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

cac55 2025-06-10 13:23 18 浏览 0 评论

如题,这里对数据的处理对于熟悉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;

相关推荐

为什么要对彗星“深度撞击”(比特彗星中文破解版)

在太阳系中,被人类探测器造访的彗星数量与行星数量差不多。其中绝大多数探测器都是从彗星附近飞过采集数据。但2005年“深度撞击”探测器则采取了主动出击的策略。它释放出的撞击体以10千米/秒的速度撞...

准妈妈备产清单:看看凯特王妃待产包里都有啥

来源:新华网英国威廉王子和凯特王妃即将迎来他们的第三个孩子。据悉,同生乔治王子和夏洛特公主时一样,此次凯特仍然选择在伦敦圣玛丽医院生产。那么,凯特的待产包里有些什么呢?匿名消息源向英国《OK!》杂志透...

系统小技巧:正确处理软件放行与禁用的矛盾

有时,我们讨厌一些程序运行,但它们偏偏会自动弹出,我们希望禁止其运行。而还有的时候,因为某种原因使用了比较复杂的“软件限制策略”,造成某些软件无法运行,这时我们希望将其解禁。虽然我们可以用修改注册表的...

老网民的青春:盘点那些消失在互联网中的软件,你用过哪款?

一则ICQ即将关闭的消息,唤醒了很多70后80后尘封的记忆。ICQ可以说是即时通讯软件的鼻祖,它诞生于1996年,由以色列公司Mirabilis推出,ICQ是Iseekyou的简写,中文释义为“我...

Windows Vista 动态桌面的设置(windows10动态桌面)

一、VMwareWorkstation15(16的版本能安装但是不能实现动态桌面)安装WindowsVistaEnterprise,15下安装及设置完成后,在16下可以正常显示,虚拟机下安装...

Hexoskin智能T恤 穿在身上的运动追踪器

来源:MSN理财综合|2016-01-0615:14:42[摘要]Hexoskin使用方便,续航时间超长。它能准确追踪运动数据,可以满足专业运动员以及热爱健身的人,官网售价399美元。其实不用多说什...

你了解这些互联网的名词吗?(互联网的别称有哪些)

要想成为互联网的菜鸟,可以先了解一下互联网的一些基础名词。现在就一起来来看看吧,记住了,可以应急用哦!PV:即页面浏览量,或点击量(用户每次刷新即被计算一次)UV:独立访客(UniqueVisi...

不要成为无用的大人——写给三十岁前的你

我不习惯写励志故事,看到鸡汤绕道而行,原因是任何人选择入世生活,就并不值得安慰,以及不要期待享受特权,也没有你必须不得承受的麻烦。金牛座的世界里遭遇一切苦都是应该的,一切得到则需要努力得到,而且要认真...

尼康宣布正研发专业级FX格式数码单反相机D5

尼康宣布正在研发专业级FX格式数码单反相机D5。作为D4s的后续机型,D5机型的命名源于此款产品代表了尼康数码单反相机的第5代专业级机型。D4s于2014年2月发布,作为专业级数码单反相机,一经推出,...

配置管理流程(配置管理流程属于)

资料来源:https://www.cnblogs.com/wayne-ivan/articles/525818.html1 概要1.1 内容规范配置管理活动,确保配置项正确地唯一标识并易于存取,保证基...

小密圈-重新定义你的朋友圈(小密圈开放了)

微信在我们的生活中已经被使用的非常广泛了,除了聊天、视频之外,用的最多的就是朋友圈。在朋友圈里分享自己每天的所感所悟,家长里短本来是一件很开心的事,但是最近的一条新闻引起了人们的关注。某白领因为不愿意...

十招教你找到海量PPT模板(怎么找ppt模板资源)

配图设计:@乌素淖尔我每天都能遇到这种求助问题,不堪重负。问:急求XXXPPT模版?无耻的来求PPT模版,我是在一家互联网公司工作的小员工,领导安排说年初要用PPT做一份工作计划报告,主要是想说一下今...

安卓系统手机文件夹及其文件详细解析

打开Android文件管理器,会发现里面数十个英文名称命名的文件夹罗列其中,很多功能我们可以从其名字上略有所知,内部大批量的文件却让我们有些一头雾水。这些文件是什么呢?有什么用?我们能不能删?这些都是...

我为什么不喜欢微信(有没有人不喜欢聊微信)

这个问题是我在知乎的一个回答,原始问题是“什么样的用户不喜欢微信”?出于数据备份的原因,将其复制保留一份到这里,以防丢失。以下是原回答内容:我是做技术出身的,我非常不喜欢微信,同样也不喜欢QQ,但是为...

花了一周时间,整理出推荐频率最高的14款办公必备软件

澄清!猫猫最近没有偷懒!猫猫去干大事儿了!随着猫猫推荐的软件越来越多,大家是不是也苦恼每次想找一类软件,还得去一篇一篇翻历史文章,其实我也很苦恼这个问题。于是!猫猫上周搭建了一个“猫猫软件中心”,这里...

取消回复欢迎 发表评论: