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

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

yund56 2025-04-04 01:08 14 浏览

如题,这里对数据的处理对于熟悉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行以红色画出图来。

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

图 1

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

图 2

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

图 3

这里采用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)='
; 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;

相关推荐

仍需打磨:首款Windows 10X模拟器上手

今天,微软发布了适用于Windows10X的首款模拟器,以便于开发人员初步了解适用于双屏设备的操作系统调整。微软希望在SurfaceNeo今年年底正式发售之前,让开发人员对应用程序进行优化。因此...

Windows10 编译OpenCV4.5源码

在OpenCV4.5+VisualStudio2017开发环境配置中,介绍了OpenCV4.5的下载和安装,待扩展内容OpenCV源码编译,在本文中做补充。研究源码无疑是学习OpenCV的一...

微软7年磨一剑,Windows 10X抢先上手体验

2月22日消息,微软在去年10月正式推出了Windows10X系统,该系统除了可用于传统的电脑外,同样适用于双屏设备或者折叠屏设备,拥有更好的触控操作体验。Windows10X在操作系统底层、命令...

Office重新设计了图标,你觉得如何?

微软重新设计了Office的应用图标,在接下来的几个月里,这些图标将从移动端和网页端开始陆续推广至各大平台。距离Office图标的最近一次更新还是在2013年,那时鲍尔默时代的产物,那时微软还在纠结是...

微软发布 Win10 Build 21376 内测版:重新设计默认用户界面字体

IT之家5月7日消息今年早些时候,微软意外地确认正在为Windows10进行UI改进,并在预览版中发现了相关的非活动代码。微软今天宣布向开发渠道中的内测用户发布Windows1...

前端开发需要了解常用7种JavaScript设计模式

作者|Deven译者|王强策划|小智转发链接:https://mp.weixin.qq.com/s/Lw4D7bfUSw_kPoJMD6W8gg前言JavaScript中的设计模式指的是...

「Qt入门第二篇」基础(二)编写Qt多窗口程序

导语程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对...

在吴中 ,哪里有学网页设计的培训班?

网页设计介绍Web2.0标准布局之网页长期签约就业班(全日制)课程收费:7680元课程周期:5-6个月(45分钟/课)使用教材:《教师自编教材》考核发证:Adobe《网页设计师》培训内容第一部份:...

Qt快速入门(工程的创建、UI界面布局、多线程、项目)

本文档将介绍QT工程的创建、UI界面布局,并以计数器为例了解QT中多线程的用法,最终完成一个基础的QT项目。1创建QT工程文件在安装好QT之后,能够在其安装组件中找到QtCreator,点击设置项...

应用崩溃有救啦!Windows新更新将解决应用崩溃问题

【CNMO新闻】对于不少上班族来说,当自己的电脑在运行某个应用程序时,突然出现应用程序崩溃问题,常常会让人十分苦恼。尤其是对于设计师或者编辑,当自己的作品未能及时保存应用崩溃全部消失的时候,简直就是痛...

Python Qt GUI设计:窗口布局管理方法【强化】(基础篇—6)

在PythonQtGUI设计:窗口布局管理方法【基础篇】(基础篇—5)文章中,聊到了如何使用QtDesigner进行窗口布局管理,其实在QtDesigner中可以非常方便进行窗口布局管理设计,...

思考:如何设计游戏业务框架

虽然现在连主机游戏都纷纷加入了网战部分,不过其身份主要充当状态同步,矛盾点集中在同步即时性上。以大量数值逻辑为主的业务功能侧重点则不同。如果说写代码就是用状态的操作给问题建模,那么编程范式和设计模式种...

用.NET设计一个假装黑客的屏幕保护程序

本文主要介绍屏幕保护程序的一些相关知识,以及其在安全方面的用途,同时介绍了如何使用.NET开发一款屏幕保护程序,并对核心功能做了介绍,案例代码开源:https://github.com/sangy...

光的艺术:灯具创意设计

本文转自|艺术与设计微信号|artdesign_org_cn“光”是文明的起源,是思维的开端,同样也是人类睁眼的开始。每个人在出生一刻,便接受了光的照耀和洗礼。远古时候,人们将光奉为神明,用火来...

Python Qt GUI设计:将UI文件转换Python文件三种妙招(基础篇—2)

在开始本文之前提醒各位朋友,Python记得安装PyQt5库文件,Python语言功能很强,但是Python自带的GUI开发库Tkinter功能很弱,难以开发出专业的GUI。好在Python语言的开放...