Matlab进行串口通信


文章目录

  • Matlab进行串口通信
  • 前言
  • 问题
  • 解决方案
  • 方法一:Instrument Control Toolbox
  • 方法二.编写通信脚本
  • 总结



前言

在电机运行过程中,需要将电机的姿态等参数通过串口传输至PC端,然后在Matlab进行姿态解算,这样便可以快速直观的获取仪器的井斜角度、方位角、工具面角等参数信息。

问题

  1. 如何使用Matlab进行串口通信?
  2. Matlab串口通信时的注意事项。

解决方案

Matlab并不具备直接访问硬件的能力,但是支持面向对象技术,通过调用Instrument Control Toolbox中的serial类函数来创建串口对象,对串口对象操作就是对串口操作,使用起非常方便。同时,Matlab封装的串口对象支持对串口的异步读写操作,使得计算机在读写串口时能同时进行其他处理工作,因而能大大提高计算机执行效率。Matlab用多线程技术实现这种异步操作,通过异步读写设置,计算机在执行读写串口函数时能立即返回不必等待串口把数据传输完毕,当指定的数据传输结束时就触发事件,执行事件回调函数,可以在事件回调函数中编程,进行数据处理,这样就不会造成因等待串口传输数据引起的时间浪费。本次主要从Instrument Control Toolbox用户自己编程两个方面记录自己使用过程的一些问题。

方法一:Instrument Control Toolbox

MATLAB的Instrument Control Toolbox提供了 MATLAB与仪器仪表通信的功能 ,它支持 GPIB 通用接口总线 、VISA、TCP/ IP、UDP、RS2232等多个协议 ,具有同步和异步读写功能以及事件处理和回调操作功能,可读写和记录二进制和ASCII文本数据。

  • 在APP的应用下搜索Instrument Control ,打开后如下图所示:
  • matlab app designer串口发送数据 matlab发送数据给串口_matlab

  • 进入到该界面后我们按照上图的顺序指示,先选中串口(Serial), 点击浏览(Scan)查看可用的串口,最后在第三处会罗列出可用的串口号(例如我的串口号为COM5)。
  • 双击Serial下的COM5得到如下视图界面:
  • matlab app designer串口发送数据 matlab发送数据给串口_串口通信_02

  • 这里需要注意的是在该应用下发送一串16进制命令的时候每个字节间需要有空格进行隔开,若没有间隔下位机只能接受最后一个字节的数据(我的下位机以中断模式进行接受)
  • 如上图所示,点击连接便可以与对应的串口建立通信,然后可以对发送区域的数据类型以及数据形式进行设置,例如我实验过程中发送的数据是16进制,数据格式是8位,接受数据的格式与发送一致,设置如下图所示:
  • matlab app designer串口发送数据 matlab发送数据给串口_matlab_03

  • 点击发送(Write)发送成功后,窗口的下半部分会显示发送的消息,点击读取(Read),会将接受到的数据存储在data里面,点击Export可将数据导入工作空间进行查看。
  • matlab app designer串口发送数据 matlab发送数据给串口_串口通信_04

方法二.编写通信脚本

采用上面的串口应用每次需要我们手动发送命令和接收数据,在实时调试的过程中,需要不断的发送命令、获取数据等,上面的方法就体现不出优势了,所以我们可以通过编写代码去实现上面软件应用的不足,同时可以借助Instrument Control Toolbox里面的Session Log窗口下的代码,它将我们用使用过程以matlab语言方式记录了下来,我们可以通过它辅助我们完成串口通信代码的编写,实验过程中端口配置如下。
代码如下(示例):

scom = serial('COM5');    %建立串口对象函数(需要手动和自己电脑的端口匹配)
fclose(scom);               %关闭串口设备对象
scom.InputBufferSize =512;%输入缓冲区
scom.OutputBufferSize =512;%输出缓冲区
scom.ReadAsyncMode = 'continuous';%异同通信模式下,读取串口数据采用连续接收数据方式,下位机返回数据自动存入输入缓冲区中。
scom.BaudRate  = 9600;%设置波特率
scom.Parity = 'none';%无校验位
scom.StopBits  = 1;%1个停止位
scom.DataBits  = 8;%8个数据位
scom.Terminator = 'LF';%设置终止符(CR为回车符,LF为换行符)
scom.FlowControl  = 'none';%流控
scom.timeout  = 1.0;%一次操作超时时间
scom.BytesAvailableFcnMode =  'byte';%数据读入格式
scom.BytesAvailableFcnCount  = 1024;%触发中断的数据数量
scom.BytesAvailableFcn  = @callback;%串口接收中断回调函数 
try
 fopen(scom);
catch
 '串口打开失败';
End
fwrite(scom,[hex2dec('01') hex2dec('FD'); %写入数据
data1 = fread(scom,10,'uint8'); %读取数据
Fclose(obj);%关闭串口设备对象
Delete(obj);%删除内存中的串口设备对象

总结

本文对使用matlab进行串口通信进行了一个简要的介绍,具体的细节的了解可以去查看Matlab的帮助文档和以下参考文献:
Matlab上位机开发(五)Matlab串口通信MATLAB串口通信