matlab读取表格数据以固定周期通过串口发送
cac55 2025-06-10 13:23 23 浏览 0 评论
如题,这里对数据的处理对于熟悉matlab各函数操作的同学来讲,是常规操作,但对于matlab新手或只是想借用matlab工具将存于PC端文件中的数据通过串口发送出去的工程人员来说,由于对matlab软件比较陌生,实现各种功能所应该调用的函数没有头绪,所以还是比较麻烦的。这里先简单介绍实现这项操作过程中的几个步骤,然后贴出完整代码,供大家需要时查询。
这里主要以功能分以下步骤:
- matlab读取指定文件数据
- 不同类型数据转换为字节数据
- 固定时间间隔的实现
- 操作串口发送数据
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;
相关推荐
- MIRIX重塑AI记忆:超Gemini 410%,节省99.9%内存,APP同步上线
-
MIRIX,一个由UCSD和NYU团队主导的新系统,正在重新定义AI的记忆格局。在过去的十年里,我们见证了大型语言模型席卷全球,从写作助手到代码生成器,无所不能。然而,即使最强大的模型依...
- 硬盘坏了怎么把数据弄出来对比10种硬盘数据恢复软件
-
机械硬盘或固态硬盘损坏导致数据丢失时,应立即停止对硬盘的读写操作,并根据损坏类型选择逻辑层恢复工具或专业物理恢复服务。紧急处置措施立即停止通电使用:发现硬盘异响、无法识别或数据异常时,需立即断开连接,...
- 蓝宝石B850A WIFI主板新玩法:内存小参调节体验
-
蓝宝石前段时间发布了一款性价比极高的主板:NITRO氮动B850AWIFI主板。这款主板的售价只要1349元,相比普遍1500元以上的B850主板,确实极具竞争力。虽然价格实惠,蓝宝石NITR...
- 内存卡损坏读不出怎么修复?这5个数据恢复工具汇总,3秒挽回!
-
在数字化生活的浪潮中,内存卡凭借小巧便携与大容量存储的特性,成为相机、手机、行车记录仪等设备存储数据的得力助手,承载着无数珍贵回忆与重要文件。然而,当内存卡突然损坏无法读取,无论是误删、格式化、病毒入...
- 内存卡修复不再难,2025年必学的6款软件工具
-
内存卡出现问题时,通常是因为文件系统损坏、物理损坏或病毒感染。通过专业的修复工具,我们可以尝试恢复数据并修复内存卡。内存卡修复利器:万兴恢复专家万兴恢复专家是一款功能强大的数据恢复软件,支持多种设备和...
- 有5款内存卡修复工具汇总,内存卡数据轻松找回!
-
在如今的数字时代,内存卡作为不可或缺的存储介质,广泛应用于相机、手机、行车记录仪等各类设备中,承载着我们珍贵的照片、视频以及重要文件。然而,数据丢失的风险却如影随形,误删、格式化、病毒入侵、硬件故障等...
- 揭秘:如何通过多种方式精准查询内存条型号及规避风险?
-
以下是内存条型号查询的常用方法及注意事项,综合了物理查看、软件检测、编码解析等多种方式:一、物理标签查看法1.拆机查看标签打开电脑主机/笔记本后盖找到内存条,观察标签上的型号标识。例如内存标签通常标...
- 内存卡数据恢复5个工具汇总推荐,轻松找回珍贵记忆!
-
在这个数字化时代,内存卡作为我们存储珍贵照片、重要文件的常用载体,广泛应用于手机、相机、平板电脑等设备。但数据丢失的意外却常常不期而至,误删除、格式化、病毒攻击,甚至内存卡的物理损坏,都可能让辛苦保存...
- 电脑内存智能监控清理,优化性能的实用软件
-
软件介绍Memorycleaner是一款内存清理软件。功能很强,效果很不错。Memorycleaner会在内存用量超出80%时,自动执行“裁剪进程工作集”“清理系统缓存”以及“用全部可能的方法清理...
- TechPowerUp MemTest64:内存稳定性测试利器
-
TechPowerUpMemTest64:内存稳定性测试利器一、软件简介TechPowerUpMemTest64,由知名硬件信息工具GPU-Z的出品公司TechPowerUp发布,是一款专为64位...
- 微软推出AI恶意软件检测智能体Project Ire,精确度高达98%
-
IT之家8月6日消息,当地时间周二,微软宣布推出可自主分析恶意软件的AI检测系统原型——ProjectIre。该项目由微软研究院、Defender研究团队及Discovery&a...
- 农村老木匠常用的20种老工具,手艺人靠它养活一家人,你认识几种
-
生活中的手艺老匠人是非常受到尊敬和崇拜的,特别是在农村曾经的老匠人都是家里的“座上宾”。对于民间传统的手艺人,有一种说法就是传统的八大匠:木匠、泥匠、篾匠、铁匠、船匠、石匠、油匠和剃头匠。木匠的祖始爷...
- 恶意木马新变种伪装成聊天工具诱人点击
-
国家计算机病毒应急处理中心通过对互联网监测发现,近期出现一种恶意木马程序变种Trojan_FakeQQ.CTU。该变种通过伪装成即时聊天工具,诱使计算机用户点击运行。该变种运行后,将其自身复制到受感染...
- 学习网络安全 这些工具你知道吗?
-
工欲善其事必先利其器,在新入门网络安全的小伙伴而言。这些工具你必须要有所了解。本文我们简单说说这些网络安全工具吧!Web安全类web类工具主要是通过各种扫描工具,发现web站点存在的各种漏洞...
- 5分钟盗走你的隐私照片,这个全球性漏洞到底有多可怕?
-
这个时代,大家对电脑出现漏洞,可能已经习以为常。但如果机哥告诉大家,这个漏洞能够在5分钟内,破解并盗取你所有加密文件,而且还无法通过软件和补丁修复...这可就有点吓人啦。事情是酱婶的。来自荷兰埃因...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 如何绘制折线图 (52)
- javaabstract (48)
- 新浪微博头像 (53)
- grub4dos (66)
- s扫描器 (51)
- httpfile dll (48)
- ps实例教程 (55)
- taskmgr (51)
- s spline (61)
- vnc远程控制 (47)
- 数据丢失 (47)
- wbem (57)
- flac文件 (72)
- 网页制作基础教程 (53)
- 镜像文件刻录 (61)
- ug5 0软件免费下载 (78)
- debian下载 (53)
- ubuntu10 04 (60)
- web qq登录 (59)
- 笔记本变成无线路由 (52)
- flash player 11 4 (50)
- 右键菜单清理 (78)
- cuteftp 注册码 (57)
- ospf协议 (53)
- ms17 010 下载 (60)