matlab 串口 事件,MATLAB 串口通信
matlab 串口编程
由于项目需要,用matlab 做了一个串口通信工具,也碰到不少坑。这里总结一下。
读取串口数据
matlab 支持串口通信,因此直接调用串口的结构体serial就可以,在调用之前,需要对串口属性进行设置。
delete(instrfindall) %%关闭没用的,这句很重要
s=serial('COM5');%创建串口
set(s,'BauRate',115200); %设置波特率
set(s,'inputBufferSize',1024000) %设置输入缓冲区域为1M
%串口事件回调设置
set(s,'BytesAvailabelFcnMode','bytes');%设置中断响应函数对象
set(s,'BytesAvailabelFcnCount',10);%设置终端触发方式
s.BytesAvailabelFcn=@ReceiveCallback;%ReceiveCallback是中断的触发函数,这里我是自定义的。系统的回调函数为instrcallback;
fopen(s);%打开串口
%data=fread(s)%读取二进制字节 fwrite二进制写入 相应文本用fscanf 和fpintf
%data %进行数据处理
%fclose(s);
%delete(s);
%clear s;
以上的代码是MATLAB 串口读取的基本函数,对串口操作的整个过程可以概括为:“设置串口参数”->"打开串口“->"读取串口数据”->“关闭串口”。
串口通信方式选择
serial 中断方式参数为BytesAvailabelFcnMode,它的方式有Terminator 和bytes 两种。Terminator 为查询方式中断方式。其值有“LR(换行符)” 和“CR(回车符)” 两种。
查询方式中断
查询方式中断方式为Terminator,值有CR和LF两个。查询中断的含义是在缓存区读取数据,当读取到存在CR和LF之后,触发中断,调用回调函数。查询中断简单但不适用。具体例子可以看http://blog.sina.com.cn/s/blog_6163bdeb0102e8qc.html
set(s,'BytesAvailabelFcnMode','Termiator');% 查询中断
set(s,'Terminator','CR');%设置中断方式
基于matlab 方式实时串行通信编程
matlab更多的采用的事事件驱动方法中断。中断参数为"bytes"。即按字节中断。如设定缓存区域达到10个字节,就触发中断,调用回调函数,进行处理。
set(s,'BytesAvailabelFcnMode','bytes');%设置中断响应函数对象
set(s,'BytesAvailabelFcnCount',10);%设置终端触发方式
s.BytesAvailabelFcn=@ReceiveCallback;
我们可以对系统的instrcallback 函数进行修改调用系统的回调函数,但是系统的回调函数matlab 安装包下,可以右键打开,或者直接用which 命令查找它的位置,另外我们也可以自己写相应的回掉函数。比如我这里自己定义回调函数ReceiceCallback。
function ReceiveCallback( obj,event) %创建中断响应函数
global s a fid;
str = fread(s);%读取数据
% hex=dec2hex(str)
a=[];IMU_data = [];Motion_data=[];
sign_head1=hex2dec('A5');sign_head2 = hex2dec('5A');
sign_finish=hex2dec('AA');sign_IMU=hex2dec('A1');sign_Motion=hex2dec('A2');
a= [a;str];
j=1;
while (~isempty(a))
if j>size(a,1)
break;
end
if a(j)==sign_head1 && a(j+1) == sign_head2
if (j+a(j+2)+1) > size(a,1)
break;
end
index_start = j+2;
index_finish= index_start + a(j+2)-1;
pack = a(index_start:index_finish);
if ~isempty(pack) &&pack(pack(1))== sign_finish
if pack(2) == sign_IMU
IMU_data(1,:) = Get_IMU(pack);
j = index_finish;
continue;
end
if pack(2) ==sign_Motion
Motion_data(1,:) = Get_Motion(pack);
j = index_finish;
end
if ~isempty(IMU_data) && ~isempty(Motion_data)
act_data = [IMU_data,Motion_data]
fprintf(fid,'%8.1f%8.1f%8.1f%8.1f%8.1f%8.1f%8d%8d%8d%8d%8d%8d%8d%8d%8d\n',act_data);
Motion_data=[];IMU_data=[];
a(1:index_finish)=[];
j=1;
end
end
else
j=j+1;
end
end
end
回调函数包含两个参数,这个必须要,不能少。其中obj 是传递串口参数的。event暂时没用到。这里回调函数是从还从去读取二进制数据。然后解算出姿态传感器的姿态数据和传感器数据。并且存到txt中。姿态上报数据格式为A5 5A 开头,第三位为传递数据位(不包含A55A),第四位为A1/A2,A1。A1 表示的是姿态数据,A2表示传感器数据。数据以AA结尾。因此算法的思路是每次有姿态数据和传感器数据然后就保存到文本中。
代码已上传到我的github
matlab 串口 事件,MATLAB 串口通信相关推荐
- matlab 鼠标事件,MATLAB鼠标事件应用(记录)
前记: 人机交互的方式--键盘开关.鼠标.触摸屏.体感传感器(Kinect.leap motion)等的使用大大促进人与机器的交流过程. 这里记录鼠标事件与MATLAB的结合,为后期机器人仿真控制打下 ...
- matlab+stm32通讯,matlab与stm32之间利用串口通信记录
1.涉及到的函数 serial,fopen,fclose, instrfindall,instrhwinfo, fprintf,fscanf,fwrite,fread,isempty 1.1 串口函数 ...
- matlab中instr,MATLAB 串口通信
matlab 串口编程 由于项目需要,用matlab 做了一个串口通信工具,也碰到不少坑.这里总结一下. 读取串口数据 matlab 支持串口通信,因此直接调用串口的结构体serial就可以,在调用之 ...
- matlab gul介绍及串口通信实现,Matlab - GUl介绍及串口通信实现(转)
新建Blank GUI. 在新建Blank GUI界面中,包含了一般的界面元素,如菜单.按钮.坐标轴.控件等.添加必要的串口通信参数设置按钮. 2 串口数据发送与接收功能实现 2.1 建立串口通信流程 ...
- Matlab与单片机的串口通信-matlab…
Matlab提供了对串口进行 打开. 关闭.以及 串口参数设置等操作的一系列 函数.利用这些函数可以选择串口号. 设置串口通信参数( 波特率. 数据位.停止位. 校验位等).进行中断控制. ...
- 51单片机进阶案例(1)——基于MATLAB GUI的单片机串口与PC的通信实现实时时钟和双向可调时钟功能(利用DS1302时钟芯片和LCD1602液晶屏)
目录 一.案例描述 二.实现功能 三.51单片机部分实现 3.1 实时时钟的实现 3.2 串口通信的实现 3.2.1 接收数据 3.2.2 发送数据 四.MATLAB部分实现 4.1 GUI界面 4. ...
- 【MATLAB】使用matlab进行串口通信(详细方法+代码讲解)
整理时间:2020-05-19 目录: 1.matlab可以 进行串口通信? 2.怎么搞 3.总结 正文: 1.matlab可以 进行串口通信 matlab的toolbox很强大.其中Instrume ...
- matlab实用小程序段 —— 串口发送和读取
sr3 = serial('COM3'); % 使用默认设置创建串口sr3 fopen(sr3); %打开串口 fprintf(sr3,'xxx'); ...
- 单片机数据用matlab处理程序设计,单片机串口论文,关于基于单片机MATLAB实现信号的波形显示相关参考文献资料-免费论文范文...
导读:该文是关于单片机串口论文范文,为你的论文写作提供相关论文资料参考. (温州医科大学 信息与工程学院,浙江 温州 325035) [摘 要]本文介绍了基于单片机与MATLAB实现信号的波形显示的方 ...
- java 串口波特率_JAVA串口通信的方法
以前经常用C语言操作串口,实现一些发送接收之类的小功能,最近项目中也用到了串口通信,不过语言变成了Java,这个搞起来略蛋疼. Java说起来就是各种库各种引用,所以得到某些需求先google搜一把~ ...
最新文章
- windows服务程序设置为自动 重启后又变为手动启动_系统小技巧:解决Windows无法正常关机的问题...
- xp系统怎么弄清微软服务器名称,xp系统电脑怎么远程云服务器
- '=='操作符的小动作
- 万用socket神器Linux Netcat 命令
- MFC项目实战(1)文件管理器--准备篇
- 更改阿里云域名解析台里某个域名绑定的IP之后不能解析到新IP
- QEMU多进程(Multi-process QEMU)及vfio-user应用
- NYOJ--91--阶乘之和
- C语言 第六章 多重循环练习
- 闲聊:Android 平台网络游戏加速器(二)
- linux鼠标手势软件,linux 系统中全能的鼠标手势——easystroke
- Excel如何快速完成图片查找?
- 如何快速画好一张程序流程图
- 帮助新员工快速形成战斗力,Filez在入职与培训场景应用
- AAAI 2019 论文解读:卷积神经网络继续进步
- P3265 [JLOI2015] 线性基
- 两化融合能给企业带来什么好处
- 【面试题目】你有12个硬币,其中有一个的重量与其他的不一样,有三次使用测量平衡的机会来找出重量不同的那个。该怎么做呢?
- xp计算机无法远程桌面连接,XP sp3系统下远程桌面不能连接到指定计算机的解决方案...
- 稳坐全球第一的小米手环,爆款背后的“护城河”是如何造就的?