3.2 系统蓝牙串口通信主要代码
void lanyaInit(void)
{
SCI0BD=208;//17; //波特率9600
SCI0CR1=0X00;
SCI0CR2=0X0C; //RE=1 TE=1
}
void SCI_send(byte data) //1ms //串口发送函数
{
while(!SCI0SR1_TDRE); //等待发送数据寄存器(缓冲器)为空
SCI0DRL = data;
}
byte SCI_receive(void) //串口接收函数
{
while(!SCI0SR1_RDRF); //等待发送数据寄存器满标识置位
return(SCI0DRL);
}
4 基于Matlab GUI的PC机与智能车的通信
4.1 Matlab GUI基础上实现串口通信的软件设计
在matlab环境下,读取串口数据的方法有查询和中断两种方式。查询方式数据只能分批进行传送,实时性不高,且对系统资源的占用度比较大。以中断方式实现的串口通信,通常的处理方式是对matlab提供instrcallback回调函数进行修改,采用事件驱动的方式,达到实时处理下位机传送的数据的目的。但是采用Matlab的事件和回调函数机制编程要相对复杂一些。在对instrcallback函数进行修改和备份等操作容易出错且比较麻烦。另外每次修instrcallback函数后都要重新启动matlab,可能会导致数据丢失等一些不必要的麻烦。将事件驱动函数写入GUI组件的M文件中,可以减少编程的复杂性,避免一些不必要的麻烦,实现串口之间的实时通信。
4.2 介绍设备控制工具箱
Matlab设备控制工具箱主要是提供MATLAB软件与各种智能仪器的直接通讯功能。工具箱提供了以下功能:
① 支持串行接口(RS-232、RS-422、RS-485)、GPIB接口(IEEE®-488)等通信协议。
② 支持IVI,VXIplug&play和MATLAB设备驱动(instrument drivers),不需要学会写与设备相关的指令即能与仪器直接联通。
③ 传输的数据可以是文本或二进制的(数字的)。
④ 支持同步和异步(有阻塞或无阻塞)通信。
⑤ 支持基于事件的通讯。
⑥ 新的TMTOOL图形用户接口不仅能够连接仪器、接收/发送数据,而且可以自动的生成M代码文件以加入编写的MATLAB程序中
5 基于matlabGUI的查询方式编程实现的异步串行通信
基于Matlab查询方式的非实时串口通信虽然编程简单、对数据的调用处理也更为容易,但是只能接收一个过程的数据,这在对实时性要求较高的系统中往往不能满足设计者的需求。以下为部分通信程序代码。
g.InputBufferSize=1024000; %设置串口输入缓冲区大小为256000B,缺省值为512B
g.timeout=Time%设置一次读或写操作的最大完成时间为Time对应值,缺省值为10s
g.ReadAsyncMode='continuous';%(缺省方式) 在异步通信模式下采用缺省方式,串口得到的数据会自动连续的传入缓冲区保存
g.BaudRate=buad%设置串口对象的波特率为buad对应值,注意要根据下位机设定的值进行修改,缺省值为9600b/s
g.StopBits=1;%停止位设置为1,HCS12G128单片机设置的SCICR1的bit4要相应的设置为0。
g.Terminator='LF';%设置终止符为CR(回车符),缺省为LF(换行符)。
g.FlowControl='none';%可选则none、hardware、software
fopen(g)%打开串口设备对象g
fwrite(g,255);%以二进制的方式发送握手信号0xFF,缺省为异步通信方式。
[out,huancuncount]=fread(g,1000000,UNIT)%接收单片机发送的4000个数据并存入out数组中,huancuncount为存入out数组的数据数量,其中UNIT要选择与单片机发送的数据相对应的格式(一般为8位),其值为UNIT所对应的输入。
%串口的读写不仅支持二进制数据的通信也支持ASCII(文本)方式,,当matlab串口之间通信的数据为ASCII(文本)方式时,读写命令分别为fscan和fprintf。.
set(handles.huancunjishu,'String',huancuncount);%将缓存冲空间储存的数据量显示在tag为huancunjishu的文本框中。
assignin('base','outws',out);%将得到的out数据保存到工作空间
fclose(g);%关闭串口设备对象
delete(g);%删除内存中的串口设备对象
clear g;%清除工作空间中的串口设备对象
6 基于matlab中断方式编程实现的实时串行通信
事件驱动方式的优点是程序响应及时,可靠性高,在matlab环境下实现实时通信的中断方式,其实际上即是采用事件驱动的方式实现的,类似于VB的MSComm控件中OnComm事件的实现方法。当串口上有监视到缓冲区有指定字节数目的数据可用 (bytes-available event)、串口接收到的数据长时间处于非激活状态 (break-interrupt event)、串行口引脚状态改变 (pin-status event)或输出缓冲区为空 (output empty event)等事件发生时,Matlab会自动调用回调函数进行通信事件的处理。因此,事件驱动实质上是一种中断机制,而回调函数实质上相当于一个中断服务子程序。 Matlab端实时串行通信的程序流程如图6所示。以下为两种不同的方式实现实时通信的中断机制程序
6.1 将中断服务子程序写入GUI组件的部分M文件代码:
主程序:
(创建串口设备对象、设置串口设备属性及打开串口等初始化操作的代码与查询方式下的初始化代码相同):
handles.o_SerialPort=g; %设置串口全局变量
g.BytesAvailableFcnMode='byte';%设置中断触发事件为‘bytes-available Event’
g.BytesAvailableFcnCount=30;%设置接收缓冲区每收到30个字节时,触发回调函数
g.BytesAvailableFcn={@EveBytesAvailableFcn,handles};
fopen(g)%打开串口设备对象g
fwrite(g,255);
guidata(hObject, handles);
触发串口中断的服务子程序:
function EveBytesAvailableFcn( t,event,handles )%串口通信中断函数
g=handles.o_SerialPort;
Tic
[out,huancuncount]=fread(g,30,'uint8');
plot(handles.axes52,1:30,out,'r*');
plot(1:30,out);
toc
6.2 通过调用修改后的instrcallback.m文件实现中断:
主程序:
g.BytesAvailableFcnMode='byte';%设置中断触发事件为‘bytes-available Event’
g.BytesAvailableFcnCount=30;%设置接收缓冲区每收到30个字节时,触发回调函数
g.BytesAvailableFcn=@instrcallback;
fopen(g)%打开串口设备对象g
fwrite(g,255);
guidata(hObject, handles);
修改instrcallback(obj, event)回调函数Instrcallback.m文件包含了Matlab提供的回调函数程序模板,设计者可以根据需要自行添加相应的服务程序代码。Matlab安装目录下有两个instrcallback.m文件,我们只需要修改\MATLAB\toolbox\matlab\iofun\@instrument目录下的instrcallback.m 文件即可。另外,在修改instrcallback.m文件之前,最好对其做一个备份。在修改了instrcallback(obj,event)回调函数后,需要对其进行保存,重新启动matlab配置该文件,才成是修改后的函数生效。
修改后的instrcallback.m文件主要程序代码如下(图7为以下方式实现的智能车速度值的实时反馈图):
Function instrcallback(obj,event)
[out,huancuncount]=fread(g,30,'uint8');
assignin('base','outws',out);
assignin('base','huancuncountws',huancuncount);
Plot(…) %输出显示
End
实验证明,基于Matlab事件驱动实现的智能车与上位机的实时串口通信可以很好的满足智能车调试过程中的需要,且将中断服务子程序写入GUI组件和修改instrcallback.m文件两种方式通信都稳定可靠
7 结 论
在Matlab环境下两种实现智能车与PC机实时通信的中断机制都能实时稳定的进行数据传输,不过将中断服务子程序写入GUI组件的方式编程简单,数据处理方便,实现更为容易,开发效率相对的得到了较大的提高。实践证明了,采用这种方法是可行的,它不但能够应用于本文的智能车系统,也可广泛应用在其它具有串口通信能力的仪器设备中。
参考文献
[1] MATIAB Instrument Control Toolbox™ User’s Guide [M].2011.
[2]求是科技.MATLAB7.0从入门到精通[M].北京:人民邮电出版社,2006:356—358.Matlab环境下PC机与单片机的串行通信及数据处理
[3]向先波,徐国华,张琴.Matlab环境下PC机与单片机的串行通信及数据处理[J].单片机与嵌入式系统应用,2004·12:27~31