(一)matlab接口编程基础(通过串口与单片机通讯)(1)Matlab对串行口的编程控制主要分为四个步骤。①创建串口设备对象并设置其属性。scom=serial('com1');%创建串口1的设备对象scomscom.Terminator='CR';%设置终止符为CR(回车符),缺省为LF(换行符)scom.InputBufferSize=1024;%输入缓冲区为256B,缺省值为512Bscom.Timeout=0.5;%Y设置一次读或写操作的最大完成时间为0.5s,缺省值为10ss.ReadAsyncMode='continuous'(缺省方式);%在异步通信模式方式下,读取串口数据采用连续接收数据(continuous)的缺省方式,那么下位机返回的数据会自动地存入输入缓冲区中.这里,串口还有很多其他属性可以设置,不一一列举。②打开串口设备对象。fopen(scom);③读写串口操作。初始化并打开串口调协对象之后,现在可以对串口设备对象进行读写操作,串口的读写操作支持二进制和文本(ASCII)两种方式。当Matlab通信数据采用西方(ASCII)方式时,读写串口设备的命令分别是fscanf、fpritf;当Matlab通信数据采用二进制方式时,读写串口设备的命令分别是fread、fwrite。我们这里使用fread,可以一次性把数据读进来。④关闭并清除设备对象。fclose(scom);%关闭串口设备对象delete(scom);%删除内存中的串口设备对象clearscom;%清除工作空间中的串口设备对象当不再使用该串口设备对象时,顺序使用以上3条命令,可以将所创建的串口对象对象清除,以免占用系统资源。(2)基于Matlab中断方式的实时串行通信编程在Matlab环境下以中断的方式进行串行通信,实际上是采用事件驱动的方法实现的。Matlab提供了instrcallback(obj,event)回调函数,用户根据需要可以自行设置具体的串行通信事件。其编程步骤如下:①建立一个串行通信主程序:serial.m文件,在主程序中进行串口设备初始化操作,并指定回调函数中串行通信的事件。设置回调函数触发事件—当串口缓冲区中有n字节的数据时,触发中断事件,此后主程序自动调用instrcallback(obj,event)回调函数s.BytesAvaibleFcnMode='byte';%中断触发事件为‘bytes-availableEvent’s.BytesAvailableFcnCount=n;%接收缓冲区每收到n个字节时,触发回调函数s.BytesAvailableFcn=@instrcallback;%得到回调函数句柄%另外,s.BytesAvailableFcn={@instrcallback,s};得到回调函数句柄,并将变量s渗透到instrcallback中。fopen(s);%连接串口设备对象fwrite(s,255);%写串口,发送握手信号0xFF(等价于十进制下的数值255)②修改instrcallback(obj,event)回调函数,对所发生的串口通信事件进行处理。Matlab缺省的回调函数instrcallback(obj,event)存在于instrcallback.m文件中。该文件实际上是一个有待于用户修改的程序模块。其中只有一些最基本的程序代码,能够显示导致串口中断发生的是哪一类事件,中断事件所发生的时间以及导致事件发生的对象名等信息(修改回调函数文件时,注意要取消文件中相应信息后的分号,才能够在Matlab的命令窗口(commandwindow)中将这些信息显示出来)。中断发生后的通信事件处理以及通信数据的分析处理任务,需要用户自行添加相应的服务程序代码。Matlab安装目标下有两个instrcallback.m文件,我们只需要修改@instrument目录下的instrcallback.m文件即可。如果Matlab安装在C盘,instrcallback.m文件目录为:C:\ProgramFiles\MATLAB\R2007a\toolbox\matlab\iofun\@instrument。(一定要替换,,不然串口无法启动)1.gui_cc2430receive.m是数据采集程序,运行后选择‘开始’,开始采集数据,点击希望观察的节点可查看该节点的数据波形图。此程序有针对目前使用的“节点上有五个传感器”的情况,不一定通用。2.instrcallback.m是系统的回调函数,满足中断条件时会进入此函数。3.callbackDealWithData.m是实时处理函数,当程序进入回调函数instrcallback时就会调用此函数,在callbackDealWithData里面可以添加希望执行的指令代码,完成数据解析、保存、数据滤波、画图、实时跟踪等功能。gui_cc2430receive.m文件是启动本采集系统的关键,其中设置的“开始”按钮为代码中的b1,按下按钮,会进入b1callback函数。b1=uicontrol('parent',h0,...'units','points',...'tag','b1',...'style','pushbutton',...'string','开始',...'backgroundcolor',[0.750.750.75],...'position',[200505020],...'callback',b1callback);b1callback=[...'s=serial(''COM1'');,',...'set(s,''BaudRate'',57600);,',...'s.BytesAvailableFcnMode=''byte'';,',...'s.BytesAvailableFcnCount=4;,',...'s.BytesAvailableFcn={@instrcallback,s};,',...'fopen(s);,',...'get(s);,',...'systime1=clock;,'...'fprintf(''======Readytoreceivedata.======\n''),',...];%%%%%%b1callback的基本语句分析如下%%%%%%%%%%%%%%s=serial('COM1');%创建串口设备对象set(s,'BaudRate',57600);%设置对象属性,波特率设为57600s.BytesAvailableFcnMode='byte';%中断触发事件为‘bytes-availableEvent’s.BytesAvailableFcnCount=4;%接收缓冲区每收到4个字节时,触发回调函数s.BytesAvailableFcn={@instrcallback,s};%得到回调函数句柄,并将变量s渗透到instrcallbackfopen(s);%连接到串口设备get(s);%显示串口对象各属性的当前值fprintf('======Readytoreceivedata.======\n')%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%其他的按钮类似,可自行设计。按“停止”键,保存数据并清除串口设备,“关闭”键关闭整个界面。这里没有设计暂停。对于本系统,最为关键的是数据接收、解析和储存,至于如何应用或处理可根据需要选择不同的方式。考虑我们在数据发送方cc2430里面设置的数据格式,我们用4个字节的数据包表示WSN节点上某个传感器的信息,如表一所示。目前整个WSN只有4个节点,节点地址为1、2、3、4,每个节点上有8个可以读到电压模拟量的A/D转换通道,P1.0~P1.7,这八个地址我们设为A1~A8,用十六进制表示为161~168。这样,matlab接收到串口数据包后,根据数据包的后两位解析出实际电压值,根据前两位确定该值的地址属性。例如,我们用一个矩阵来存储数据的话,就可以根据地址得出行码或列码,将数据归入某一行或某一列。考虑这里用struct结构类型存储数据,如表二所示,其中“接收数据的时刻”由中断发生的时间确定,虽然不够精确,但是也不会有太大偏差,而且减少了通信数据量(CC2430每隔200ms或更短的一段时间读入A/D端口的数据并把数据通过无线网络发送给基站)。数据结构初始化:node.channel(1:chlnum)=struct('receiveVoltage',[],'receiveTime',[],'oldNum',1,'newNum',0);最后两个数值是用于实时处理的,记录当前时间段所处理的数据的起始时刻和结束时刻的下标。表一:数据包格式数据包字节(byte)1234信息节点地址传感器地址数据高位数据低位