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中instr,MATLAB 串口通信相关推荐

  1. matlab gul介绍及串口通信实现,Matlab - GUl介绍及串口通信实现(转)

    新建Blank GUI. 在新建Blank GUI界面中,包含了一般的界面元素,如菜单.按钮.坐标轴.控件等.添加必要的串口通信参数设置按钮. 2 串口数据发送与接收功能实现 2.1 建立串口通信流程 ...

  2. matlab上位机串口通信,MATLAB GUIDE 上位机串口通信开发 绘制图形

    本人因项目需求,需要开发这个串口通信上位机界面,用于实时绘制串口发送过来的数据.本人之前基本没使用过MATLAB,也就知道个zeros(100)这种在命令行窗口中输入的函数.至于MATLAB能开发图形 ...

  3. Matlab与单片机的串口通信-matlab…

          Matlab提供了对串口进行 打开. 关闭.以及 串口参数设置等操作的一系列 函数.利用这些函数可以选择串口号. 设置串口通信参数( 波特率. 数据位.停止位. 校验位等).进行中断控制. ...

  4. matlab中normfit,MATLAB中如何得到一组统计数据的分布特征

    MATLAB中如何得到一组统计数据的分布特征 我想通过MATLAB知道一组统计数据的分布特征,如属于哪种分布,均值方差等,请问如何实现?谢谢! function f=p_judge(A,alpha) ...

  5. matlab中fdyn,Matlab的用法总结

    1. 对序列进行洗牌 randperm() randperm()产生随机的序列 %if filepaths 是一个5*1的结构体,then cshuffle = randperm(length(fil ...

  6. matlab中rsa,matlab - Matlab中的RSA代码 - 堆栈内存溢出

    我想加密一条消息,例如" HELO1234" ,然后解密以获取原始消息.我已经在matlab中编写了无法正常工作的RSA代码. 参数计算 temp=1; range=1:10; k ...

  7. 在matlab中function,Matlab中function函数使用操作方法

    亲们或许不知道Matlab中function函数如何使用,那么今天小编就讲解Matlab中function函数使用操作方法哦,希望能够帮助到大家呢. Matlab中function函数使用操作方法 打 ...

  8. matlab中投影,MATLAB在极射赤平投影中的应用

    文章编号: 100926825 (2010) 360357202 MATLAB在极射赤平投影中的应用 收稿日期: 20100822 作者简介:潘冀川 (1988) ,男 ,石家庄经济学院本科生 ,河北 ...

  9. matlab中lambertw,MATLAB解常微分方程

    在MATLAB中,由函数dsolve()解决常微分方程(组)的求解问题,其具体格式如下: X=dsolve('eqn1','eqn2',-) 函数dsolve用来解符号常微分方程.方程组,如果没有初始 ...

最新文章

  1. linux防火墙伦堂,「linux专栏」自从看了这篇文章,我彻底搞懂了selinux和防火墙...
  2. 随机顺序_SSD固态硬盘的顺序读写和随机读写区别,谁更重要?
  3. 0330 第九次课:软件包安装及卸载
  4. 盈客在线陈清平:数据驱动让传统餐饮业焕发新活力
  5. 28 | 案例篇:一个SQL查询要15秒,这是怎么回事?
  6. ConcurrentHashMap的源码分析-initTable
  7. odata service authorization check in backend
  8. 苹果账号:个人,公司,企业,教育,
  9. JAVA日期格式化大写YYYY-MM-dd和小写yyyy-MM-DD的坑
  10. 163邮箱怎么注册,怎么给邮箱起一个好用的用户名?
  11. Excel如何将中文快速翻译?
  12. 微信图片翻译技术优化之路
  13. 动态IP代理芝麻软件现在覆盖这些城市
  14. [附源码]JAVA+ssm计算机毕业设计高校体育馆管理信息系统(程序+Lw)
  15. JSP动态网页技术基本知识点总结
  16. 乐鑫Esp32学习之旅14 esp32 sdk编程实现门户强制认证,连接esp32热点之后,自动强制弹出指定的登录html界面。(附带Demo)
  17. Ueditor 自定义多图上传路径及回显
  18. 校招拼多多笔试题(前端工程师)
  19. 串口转USB传输数据过快导致电脑死机问题的解决
  20. JXL(JXLS)的使用:java中操作Excel的解决方案之一。

热门文章

  1. 正式举报林-裴 (1999) 论文涉嫌学术不端
  2. AI算法连载03:数学基础之数值计算
  3. instring java_Decode a string in Java
  4. pytorch深度学习之音频librosa库与torchaudio库的安装与使用(windows和ubuntu)
  5. python中lowerright_python字符串,从入门到高阶看这篇就够了
  6. 要打造一款稳定顺滑、火遍全球的游戏?云将成为你的坚实后盾
  7. 如何在 PyFlink 1.10 中自定义 Python UDF?
  8. 你只差这两步 | 将Sentinel 控制台应用于生产环境
  9. 机器学习和人工智能的初学指南
  10. re:Invent大会第十年,亚马逊云科技推出了哪些底层自研技术