热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MATLAB串口通信

matlab串口编程由于项目需要,用matlab做了一个串口通信工具,也碰到不少坑。这里总结一下。读取串口数据matlab支持串口通信,因此直接调用串口的结构体serial就可以,
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

参考
1 http://blog.csdn.net/u010177286/article/details/45872365
2 http://blog.csdn.net/guomutian911/article/details/41206663
3 http://blog.sina.com.cn/s/blog_6163bdeb0102e8qc.html
4 https://wenku.baidu.com/view/72661333b90d6c85ec3ac67f.html


推荐阅读
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 在软件开发过程中,MD5加密是一种常见的数据保护手段。本文将详细介绍如何在C#中使用两种不同的方式来实现MD5加密:字符串加密和流加密。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
  • 本文探讨了在C++中如何有效地清空输入缓冲区,确保程序只处理最近的输入并丢弃多余的输入。我们将介绍一种不阻塞的方法,并提供一个具体的实现方案。 ... [详细]
author-avatar
Durston
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有