热门标签 | 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


推荐阅读
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
  • 哈密顿回路问题旨在寻找一个简单回路,该回路包含图中的每个顶点。本文将介绍如何判断给定的路径是否构成哈密顿回路。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 探讨了在有序数列中实现多种查询和修改操作的高效数据结构设计,主要使用线段树与平衡树(Treap)结合的方法。 ... [详细]
  • 本文介绍了 Winter-1-C A + B II 问题的详细解题思路和测试数据。该问题要求计算两个大整数的和,并输出结果。我们将深入探讨如何处理大整数运算,确保在给定的时间和内存限制下正确求解。 ... [详细]
  • 本文详细介绍超文本标记语言(HTML)的基本概念与语法结构。HTML是构建网页的核心语言,通过标记标签描述页面内容,帮助开发者创建结构化、语义化的Web页面。 ... [详细]
  • C语言基础入门:7个经典小程序助你快速掌握编程技巧
    本文精选了7个经典的C语言小程序,旨在帮助初学者快速掌握编程基础。通过这些程序的实践,你将更深入地理解C语言的核心概念和语法结构。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
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社区 版权所有