1、0 引言Matlab 是 MathWorks 公司开发的一种科学计算软件。Matlab 运行稳定、可靠、使用方便,是广大科研人员进行科学研究的得力助手。Matlab 不仅具有强大的科学计算功能,还具有满足一般要求的数据采集以及界面设计开发功能。Matlab GUI(Graphic User Interface)就是内置于 Matlab 的进行图形界面开发的模块。本文利用 Matlab GUI 设计通过串口进行数据发送和接收的界面,并利用内置于Matlab 的串口通信 API 实现串口数据发送与接收功能。1 Matlab GUl 介绍启动 Matlab 后,运行 guide 命令即可以启动 Ma
2、tlab GUI 开发工具。如图 1 所示。 新建 Blank GUI,如图 2 所示。在新建 Blank GUI 界面中,包含了一般的界面元素,如菜单、按钮、坐标轴、控件等。添加必要的串口通信参数设置按钮。运行后的界面如图 3 所示。2 串口数据发送与接收功能实现21 建立串口通信流程的基本步骤Matlab 提供了对串口进行打开、关闭、以及串口参数设置等操作的一系列函数。利用这些函数可以选择串口号、设置串口通信参数(波特率、数据位、停止位、校验位等)、进行中断控制、流控制。从建立串口通信到结束串口通信的完整流程包括以下几个步骤:(1)为应用程序创建串口对象。实现该功能的函数为:其中参数 po
3、rt 为完整的串口名称,如 cornl。PropertyName 为串口通信参数,如 baudrate,startbits 等。创建串口对象的过程中,也可以忽略PropertyName。其函数为:(2)连接打开串口。实现该功能的函数为:obj 即为使用创建串口对象函数的返回值。在连接打开串口后,可以对串口通信参数进行修改。(3)设置或者修改串口通信参数。在能够有效地进行串口通信前,必须设置正确的串口通信参数。实现该功能的函数为:obj 即为使用创建串口对象函数的返回值; PropertyName 为串口通信参数,如baudrate,startbits 等。(4)从串口读写数据。在前面三个步骤正
4、常完成后,即可以从串口读数据或者向串口写数据,也就是接收或者发送数据。实现读串口功能的函数有多个。其区别在于根据到达串口数据的类型选择合适的读函数。主要包括:fgetl,fgets,fread,fscanf。这里主要介绍fread,fread 函数实现从串口读入二进制数据。 fread 的实现形式为:A=fread(obj,size)A 为读入的数据,以数组的形式存储,存储数据形式为字节;obj 即为使用创建串口对象函数的返回值;size 指定一次读操作读入字节的个数。实现写串口的函数有两个,分别为fwrite 和 fprintf。fwrite 以二进制形式向串口写入数据,实现形式为:fwri
5、te(obj,A)obj 即为使用创建串口对象函数的返回值; A 为写入的数据,以数组形式存储。fwrite 以文本形式向串口写入数据,即以 ASCII 码的形式向串口写数据,实现形式为:fprintf(obj,cmd)obj 即为使用创建串口对象函数的返回值; cmd 为写入的文本数据,以数组形式存储。(5)关闭串口以及释放串口对象占用的存储空间。关闭串口函数为:fclose(obj)。释放串口对象占用的内存空间,函数为:delete(obj)。释放串口对象在 Matlab 工作区中占用的存储空间,函数为:clear obj。以上 5 步是建立串口通信过程到关闭串口,释放串口占用资源的基本步
6、骤。基本步骤可以实现手动收发数据。其例程如下:运行以上语句后,显示的结果如下:串口数据接收完毕后,需要关闭串口,并释放串口对象占用的资源,使用的命令如下:22 串口中断设置及中断处理函数要实现自动收发数据,还需要定义串口中断处理函数以及触发串口中断的方式。定义串口中断处理函数也就是定义串口数据接收或者发送函数。定义触发串口中断的方式其目的是为了在串口检测到接收数据的时候,通知并启动串口数据接收函数进行数据接收操作;在串口输出缓存为空的时候,通知启动串口数据发送函数。(1)触发串口中断的方式。在 Matlab 串口通信编程中,Matlab 通过检测到串口通信事件,从而触发串口中断。涉及到串口读写
7、的事件包括:Bytes available,Output empty。其中Bytes available 事件有两种:一种是接收到的字符数达到人工设定的数目时,则系统产生该事件;另一种是当接收到指定字符时,系统产生该事件。Output erupty 事件是在系统检测到输出缓存区为空时,产生该事件。Bytes available 事件需要事先设置。可以使用函数:set(obj,By tesAvailableFcnMode,byte);set(obj,BytesAvailableFcn-Count,240) ;以上两个函数设置当串口检测到输入缓存中到达了 240 个字符的数据时,则触发串口中断。另
8、外,也可以设置为当系统检测到某个字符达到串口,则触发串口中断。其设置函数为:set(obj,BytesAvailableFcnMode,terminator);set(obj,terminator, H)。以上两个函数设置当串口检测到字符 H 时,则触发串口中断。输出缓存为空事件的产生。该事件由系统自动检测产生,不需要用户特别设置。该事件一般在输出缓存中的最后一个字符发送完毕后产生。用户可以定义该事件引起的串口中断处理函数。(2)串口中断处理函数。串口中断处理函数可以根据用户需要自行定义。如串口读中断处理函数可以这样定义:objBytesAvailableF-cn=reeeiveData。re
9、ceiveData 即为串口读中断处理函数。在读中断处理函数中可以进行串口读操作。即将输入缓存区中的数据读到用户自定义的存储变量中,以备后续的数据处理与分析。类似可以定义输出缓存为空时触发的串口中断处理函数:objOutputEmptyFcn=write-Data。本文开发的串口通信程序用于接收采集 IMU(Inertial Measurement Unit)输出的加速度计和陀螺的测量数据。通过定义串口读中断事件和串口中断处理函数,实现了数据的自动采集,并以 Matlab 图形方式实时显示数据。(3)设置或者修改串口通信参数。在能够有效地进行串口通信前,必须设置正确的串口通信参数。实现该功能的
10、函数为:obj 即为使用创建串口对象函数的返回值; PropertyName 为串口通信参数,如baudrate,startbits 等。(4)从串口读写数据。在前面三个步骤正常完成后,即可以从串口读数据或者向串口写数据,也就是接收或者发送数据。实现读串口功能的函数有多个。其区别在于根据到达串口数据的类型选择合适的读函数。主要包括:fgetl,fgets,fread,fscanf。这里主要介绍fread,fread 函数实现从串口读入二进制数据。 fread 的实现形式为:A=fread(obj,size)A 为读入的数据,以数组的形式存储,存储数据形式为字节;obj 即为使用创建串口对象函数
11、的返回值;size 指定一次读操作读入字节的个数。实现写串口的函数有两个,分别为fwrite 和 fprintf。fwrite 以二进制形式向串口写入数据,实现形式为:fwrite(obj,A)obj 即为使用创建串口对象函数的返回值; A 为写入的数据,以数组形式存储。fwrite 以文本形式向串口写入数据,即以 ASCII 码的形式向串口写数据,实现形式为:fprintf(obj,cmd)obj 即为使用创建串口对象函数的返回值; cmd 为写入的文本数据,以数组形式存储。(5)关闭串口以及释放串口对象占用的存储空间。关闭串口函数为:fclose(obj)。释放串口对象占用的内存空间,函数
12、为:delete(obj)。释放串口对象在 Matlab 工作区中占用的存储空间,函数为:clear obj。以上 5 步是建立串口通信过程到关闭串口,释放串口占用资源的基本步骤。基本步骤可以实现手动收发数据。其例程如下:运行以上语句后,显示的结果如下:串口数据接收完毕后,需要关闭串口,并释放串口对象占用的资源,使用的命令如下:22 串口中断设置及中断处理函数要实现自动收发数据,还需要定义串口中断处理函数以及触发串口中断的方式。定义串口中断处理函数也就是定义串口数据接收或者发送函数。定义触发串口中断的方式其目的是为了在串口检测到接收数据的时候,通知并启动串口数据接收函数进行数据接收操作;在串口
13、输出缓存为空的时候,通知启动串口数据发送函数。(1)触发串口中断的方式。在 Matlab 串口通信编程中,Matlab 通过检测到串口通信事件,从而触发串口中断。涉及到串口读写的事件包括:Bytes available,Output empty。其中Bytes available 事件有两种:一种是接收到的字符数达到人工设定的数目时,则系统产生该事件;另一种是当接收到指定字符时,系统产生该事件。Output erupty 事件是在系统检测到输出缓存区为空时,产生该事件。Bytes available 事件需要事先设置。可以使用函数:set(obj,By tesAvailableFcnMode,
14、byte);set(obj,BytesAvailableFcn-Count,240) ;以上两个函数设置当串口检测到输入缓存中到达了 240 个字符的数据时,则触发串口中断。另外,也可以设置为当系统检测到某个字符达到串口,则触发串口中断。其设置函数为:set(obj,BytesAvailableFcnMode,terminator);set(obj,terminator, H)。以上两个函数设置当串口检测到字符 H 时,则触发串口中断。输出缓存为空事件的产生。该事件由系统自动检测产生,不需要用户特别设置。该事件一般在输出缓存中的最后一个字符发送完毕后产生。用户可以定义该事件引起的串口中断处理函
15、数。(2)串口中断处理函数。串口中断处理函数可以根据用户需要自行定义。如串口读中断处理函数可以这样定义:objBytesAvailableF-cn=reeeiveData。receiveData 即为串口读中断处理函数。在读中断处理函数中可以进行串口读操作。即将输入缓存区中的数据读到用户自定义的存储变量中,以备后续的数据处理与分析。类似可以定义输出缓存为空时触发的串口中断处理函数:objOutputEmptyFcn=write-Data。本文开发的串口通信程序用于接收采集 IMU(Inertial Measurement Unit)输出的加速度计和陀螺的测量数据。通过定义串口读中断事件和串口中
16、断处理函数,实现了数据的自动采集,并以 Matlab 图形方式实时显示数据。3 串口通信程序的编译发布31 编译程序为了对代码进行保密,以及方便用户发布可以在不同平台运行的可执行程序,Matlab 提供了 Matlab 程序编译与发布功能。在进行 Matlab 程序编译之前,需要设置编译工具。在 Matlab 命令窗口中,输入运行 mbuild-setup,进行编译工具设置。如图 4 所示。 mbuild-setup 命令运行后,Matlab 会检测已经安装在本机上的编译器,用户可以自行选择任意一个编译器,选择完毕后,运行编译命令,Matlab 将使用用户选定的编译器对程序进行编译。设置完毕编
17、译工具后,即可以在命令窗口中运行编译命令,将 Matlab 程序编译成可执行程序。命令格式为:mcc-optionsmifilelmfile2mfileN;options 为编译参数;mfilel 为待编译的 Matlab 文件,如果包含多个 Matlab文件,可以直接列在 mfilel 后面。如将一个文件名为 myfunm 的 Matlab 文件编译成一个独立可执行程序,可以使用 mcc 命令:mcc-m myfun:mcc 命令可以用使用多个编译参数,相应参数的含义可以参见 Matlab 帮助文档。32 发布程序Matlab 文件编译完毕后,生成的可执行程序还需要Matlab 环境的支持,
18、要发布到没有安装 Matlab 的机器上运行,还需要进行最后一项工作,即打包Matlab 组件运行环境(Matlab Component Runtime,MCR)。将 MCR 与可执行程序一起打包,拷贝到其他没有安装 Matlab 的机器上,在该机器上安装 MCR,安装完毕即可以直接在该机器上运行编译的 Matlab 可执行程序。MCR 安装文件位于:Matlab Roottoolboxcompilerdeploywin32在 2008 版 Matlab 中,已经内置了 Matlab 编译发布工具箱,在 Matlab 命令窗口中运行 deploytool 命令,即可以调出该工具窗口,通过该工具可以方便、快捷地编译发布 Matlab 程序。4 结语Matlab 具有强大的科学计算功能和图形显示功能,选用 Matlab 作为数据处理与分析工具是合适的,但其界面开发和数据采集功能相对较弱,不如VisualC+或者 LabView 强大。不过,对于一般的界面开发,和普通功能的串口通信开发,Matlab 是足以胜任的,同时也可以直接利用其强大的数据分析与处理功能。本文基于 Matlab GUI 的串口通信功能的编程实现表明利用 Matlab GUI 可以进行包含一般界面元素的界面开发,在此基础上,加入串口通信功能,实现数据的实时采集与分析处理,并进行图形化显示。