Matlab - 串口通信,转

 Matlab并不具备直接访问硬件的能力,但是支持面向对象技术,通过调用Instrument Control Toolbox中的serial类函数来创建串口对象,对串口对象操作就是对串口操作,


使用起非常方便。同时,Matlab封装的串口对象支持对串口的异步读写操作,使得计算机在读写串口时能同时进行其他处理工作,因而能大大提高计算机执行效率。Matlab用


多线程技术实现这种异步操作,通过异步读写设置,计算机在执行读写串口函数时能立即返回不必等待串口把数据传输完毕,当指定的数据传输结束时就触发事件,执行事件


回调函数,可以在事件回调函数中编程,进行数据处理,这样就不会造成因等待串口传输数据引起的时间浪费。


MATLAB的Instrument Control Toolbox提供了 MATLAB与仪器仪表通信的功能 ,它支持 GPIB 通用接口总线 、VISA、TCP/ IP、UDP、RS2232等多个协议 ,具有同步和异步读写功能以


及事件处理和回调操作功能,可读写和记录二进制和ASCII文本数据。与串口有关的主要函数如下[3]:
(1)建立串口对象函数:obj=seril(’port’,’property name’,propertyvalue……),其中主要的属性有:baudrate(波特率),databits(数据位),parity(校验方式),


stopbits(终止位)等,可以在初始化时进行赋值或者使用set函数。 (2)打开串口设备对象:fopen(obj) (3)串口读写操作:当matlab通信数据采用二进制格式时,读写串口设备的命令为fread()和fwrite();当通行数据采用文本(ASCII)格式时,读写串口设备的命令为fscanf()和


fprintf()。 (4)关闭并清除设备对象: Fclose(obj);%关闭串口设备对象 Delete(obj);%删除内存中的串口设备对象

基于本系统串口通信协议,对串口对象的读写部分程序如下(简单例程),查询方式

Obj=serial(’com1’,’baudrate’,9600,’parity’,’none’,’databits’,8,’stopbits’,1);%初始化串口
Fopen(obj);%打开串口对象
Fwrite(obj,256);%向串口发送握手信号0xff
TMP=fread(obj,3,’unit8’);%从串口读取3字节数据,后2个即是16bit温度数据
If TMP(1)= =256   %判断第一个字节受否是握手信号
For i = 1:3
Dat(i)=TMP(i+1);%剔除第一个握手信号字节
End
End
Fclose(obj);%关闭串口设备对象
Delete(obj);%删除内存中的串口设备对象 

2.中断方式通信

参考:http://blog.sina.com.cn/s/blog_62de76a90100fhbw.html

从Matlab6.0版本开始,Mathworks公司在软件中增加了设备控制箱(instrument control toolbox),提供了对RS-232/RS-485通信标准串口通信正式支持。利用该工具箱serial类及instrcallback()回调函数,能可靠地进行实时串地通信。为此,笔者充分结合单片机和Matlab优点,基于事件驱动中断通信机制,提出了一种Matlab环境下PC机与单片机实时串行通信数据处理方法,极大地简化开发流程,提高了系统开发效率。另外,与目前普遍采用基于Matlab查询方式下非实时串行通信技术相比,这种方法实用性也大大增强了

在Matlab6.0中新增设备控制工具条(instrument control toolbox)用来负责上、下位机之间通信。该设备控制工具箱特色如下:

①支持基于串行接口(RS-232、RS-422、RS-485)、GPIB总线(IEEE2488、HPIB标准)、VISA总线通信;

②通信数据支持二进制和文本(ASCII)两种方式,文本方式支持SCPI(Standard Commands for Programmable Instruments)语言;

③支持异步通信和同步通信;

④支持基于事件驱动通信。

从以上Matlab设备控制工具箱特点可以看到,Matlab完全可以满足我们实现串行通信要求。

3.1 Matlab对串行口控制基础知识

Matlab对串行口编程控制主要分为四个步骤。

①创建串口设备对象并设置其属性。

scom=serial(‘com1’);%创建串口1设备对象scom

scom.Terminator=’CR’;%设置终止符为CR(回车符),缺省为LF(换行符)

scom.InputBufferSize=1024;%输入缓冲区为256B,缺省值为512B

scom.OutputBufferSize=1024;%输出缓冲区为256B,缺省值为512B

scom.Timeout=0.5;%Y设置一次读或写操作最大完成时间为0.5s,缺省值为10s

s.ReadAsyncMode=’continuous’(缺省方式);%在异步通信模式方式下,读取串口数据采用连续接收数据(continuous)缺省方式,那么下位机返回数据会自动地存入输入缓冲区中.

注意:在些属性只有在对象没有被打开时才能改变其值,如InputBufferSize、OutputBufferSize属性等。对于一个RS-232/RS-422/RS-485串口设备对象,其属性缺省值为波特率9 600b/s,异步方式,通信数据格式为8位数据位,无奇偶校验位,1位停止位。如果要设置串口设置对象属性值与缺省值属性值相同,用户可以不用另行设置。

另外,设置串口设置对象属性也可以用一条指令完成,如:scom=serial(‘COM1’,’BaudRate’,38400,’Parity’,’none’,’DataBits’,8,’StopBits’,1)。也可以用set命令,如set(scom,’BaudRate’,19200,’Parity’,’even’)。创建了对象后可以在Matlab命令窗口直接敲对象名并回车,看到其基本属性和当前状态。若需要知道其全部属性,可以用get(scom)命令。

②打开串口设备对象。

fopen(scom);

③读写串口操作。初始化并打开串口调协对象之后,现在可以对串口设备对象进行读写操作,串口读写操作支持二进制和文本(ASCII)两种方式。当Matlab通信数据采用西方(ASCII)方式时,读写串口设备命令分别是fscanf、fpritf;当Matlab通信数据采用二进制方式时,读写串口设备命令分别是fread、fwrite。下面以文本方式读写串口为例:

a.读串口。A=fscanf(scom,’%d’,[10,100];%从串口设备对象scom中读入10*100个数据填充到数组A[10,100]中,并以整型数据格式存放。PCbfans.cn提示请看下图:Matlab环境下PC与单片机的串行通信及数据处理 - huzoy - mylearning

h.写串口。Fprintf(scom,’%s’,’RS232’,’async’);%将字符串‘RS232?’以字符数据格式写入到串口设备scom,写操作以异步方式进行。

④关闭并清除设备对象。

fclose(scom);%关闭串口设备对象

delete(scom);%删除内存中串口设备对象

clear scom; %清除工作空间中串口设备对象

当不再使用该串口设备对象时,顺序使用以上3条命令,可以将所创建串口对象对象清除,以免占用系统资源。

可以看出,在Matlab中进行串行通信是十分方便,编程较为简单。而且,在Matlab中串行通信失误率很低,通信较为可靠,也可以采用增加握手信号以及数据校验等方式进一步增加通信可靠性。

3.2 Matlab实现串行通信软件设计

在Matlab环境下,读取串口数据方式可以分为两种—查询和中断。以查询方式进行串行通信时,如下位单片机有大量数据分时分批传送给PC机,就需要不停查询串行口缓冲区,有数据就读取;虽然编程容易,但这样做不能对数据进行实时处理,系统实时性不高,而且会极大地占用系统资源。以中断方式对串口进行控制实现串行通信,就可以实时处理下位机传送数据;但编程相对复杂一些,需要采用Matlab事件和回调函数机制。

(1)基于Matlab查询方式异步串行通信编程

Matlab查询方式串行通信编程虽然简单,但这种方法在实际应用中实用价值不高,下面只作简单介绍。通信源程序如下:

clc;%初始化串口设备对象,设置串口属性为:PC机com2口,输入缓冲区为1024,读写最大完成时间为0.6s,波特率为115 200b/s,1位停止位,遇到换行符中止,硬件流控制

g=serial(‘com2’);

g.InputBufferSize=4096;

g.timeout=0.6;

g.BaudRate=115200;

g.Parity=’none’;

g.StopBits=1;

g.Terminator=’LF’;

g.FlowControl=’hardware’;

fopen(g);%打开串口设备对象s

fwrite(g,255);%以二进制方式发送握手信号0xFF,缺省为异步通信方式

out=fread(g,33,’uint8’)%接收单片机发送33个数据(8位),并存入out数组中

%释放串口设备对象

fclose(g);

delete(g);

clear g;

(2)基于Matlab中断方式实时串行通信编程

在Matlab环境下以中断方式进行串行通信,实际上是采用事件驱动方法实现。Matlab提供了instrcallback(obj,event)回调函数,用户根据需要可以自行设置具体串行通信事件。Matlab常用串行口通信中断事件有:缓冲区有指定字节数目数据可用事件(bytes-available event)、串口接收到数据长时间处于非激活状态事件(break-interrupt event)、串行口引脚状态改变事件(pin-status event)、输出缓冲区为空事件(output empty event)等。当串口上有监视事件发生时,Matlab会自动调用回调函数进行通信事件处理。因此,事件驱动实质上是一种中断机制,而回调函数实质上相当于一个中断服务子程序。Matlab端实时串行通信程序流程如图4所示。以下是具体编程步骤。

①建立一个串行通信主程序:serial.m文件,在主程序中进行串口设备初始化操作,并指定回调函数中串行通信事件。

程序主要源代码如下(创建串口设备对象、设备串口设备属性及打开串口等初始化操作代码与前述查询方式下初始化代码相同):

%设置回调函数触发事件—当串口缓冲区中有33字节数据时,触发中断事件,此后主程序自动调用instrcallback(obj,event)回调函数

g.BytesAvaibleFcnMode=’byte’;%中断触发事件为‘bytes-available Event’

g.BytesAvailableFcnCount=33;%接收缓冲区每收到33个字节时,触发回调函数

g.BytesAvailableFcn=@instrcallback;%得到回调函数句柄

fopen(g);%连接串口设备对象

fwrite(g,255);%写串口,发送握手信号0xFF(等价于十进制下数值255)

②修改instrcallback(obj,event)回调函数,对所发生串口通信事件进行处理。

Matlab缺省回调函数instrcallback(obj,event)存在于instrcallback.m文件中。该文件实际上是一个有待于用户修改程序模块。其中只有一些最基本程序代码,能够显示导致串口中断发生是哪一类事件,中断事件所发生时间以及导致事件发生对象名等信息(修改回调函数文件时,注意要取消文件中相应信息后分号,才能够在Matlab命令窗口(command window)中将这些信息显示出来)。中断发生后通信事件处理以及通信数据分析处理任务,需要用户自行添加相应服务程序代码。

PCbfans.cn提示请看下图:Matlab环境下PC与单片机的串行通信及数据处理 - huzoy - mylearning

Matlab安装目标下有两个instrcallback.m文件,我们只需要修改@instrument目录下instrcallback.m文件即可。当然,在修改instrcallback.m文件之前,最好对其做一个备份。另外,需要注意是:程序调试过程中如果再次修改了该回调函数,要重新启动Matlab配置该文件,才能使得新回调函数文件生效。

修改后instrcallback.m文件见网站www.dpj.com.cn。该修改后回调函数能够完成如下任务:

①实时接收单片机实时5ms发送33个串行通信数据,其中包括1个握手信号和32个A/D转换数据(这些数据是PIC单片机系统采集到传感器信号,每个数据占1字节),并存储在out数组中;

②对接收到数据进行处理,由于PIC单片机A/D转换值为10位,占2字节,而单片机每次只能传送1个字节数据,故将收到每两个通信数据整合成为1个真实A/D转换数据,共16个A/D转换数据,并存储在Dataout数组中;

③将接收到串口数据存储到serialdata.txt文件中,将整合后单片机A/D转换数据存储到一个以中断事件发生时间为文件名txt文件中;

④根据A/D转换数据,利用Matlab求其最大值、最小值和平均值,并利用FIR滤波器对传感器信号A/D转换值作FIR滤波处理,得到窗格为5滑动滤波平均值;

⑤利用Matlab中plot()函数实时绘制单片机采集到传感器信号原始波形图和FIR滤波后波形图,如图5所示,可以看到经过FIR滤波后传感器动态信号值较为稳定,精度大幅提高。

实验证明,基于Matlab中断方式PC机与单片机实时串行通信稳定可靠,处理数据方便,编程简单,开发效率大大提高。

4 结论

本文介绍基于Matlab环境下PC机与PIC单片机串行通信实现方法,利用MatlabInstrument Control Tollboxserial类及instrcallback()回调函数,实现基于事件驱动实时中断通信。使开发人员可以充分利用Matlab工具箱中现有函数,方便地实现串行通信、数据分析处理和图形显示,大大简化系统上位机软件编程工作量。

    1. matlab串口GUI实现

      参考:http://blog.sina.com.cn/s/blog_4b94ff130100e7wt.html

      http://blog.sina.com.cn/s/blog_62de76a90100fhbz.html