找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1477|回复: 0
收起左侧

MATLAB的串口通讯

[复制链接]
ID:283558 发表于 2018-2-10 17:18 | 显示全部楼层 |阅读模式
在Matlab环境下,读取串口数据的方式可以分为两种:查询法和事件驱动法。以查询的方式进行串行通信时,如下位有大量的数据分时分批传送给PC机,上位机就需要不停查询串行口的缓冲区,有数据就读取;虽然编程容易,但这样无法实现对数据进行实时处理和图形显示,系统实时性不高,而且会极大地占用系统的资源和出现丢帧现象。以事件驱动的方式对串口进行控制实现串行通信,就可以实时处理下位机传送的数据;但编程相对复杂一些,需要采用Matlab的事件和回调函数机制。
1.查询法
MATLAB使用查询法对进行串行通讯的程序如下:
g =serial('com1');    %创建串口对象
g.baudrate=115200;  %设置波特率,缺省9600bit/s
g.parity='none';  %设置校验位无奇偶校验
g.stopbits=1;     %设置停止位
g.inputbuffersize=256; %设置输入缓冲区为256b,缺省值为512b
g.Terminator='LF'; %设置输入缓冲区为256b,缺省值
recbuf=zeros(1,40); %清接收缓冲区(40)      
framelen=23;       %帧长度(每帧23byte)
framenum=0;       %清接收帧数
rectr=0;            %接收计数器清零
xctr=0;             %输入接收的数据帧数
recnum= input('请输入要接收的数据帧数:\n');
%打开串口设备
fopen(g);    %打开串口设备对象g
fwrite(g,255) ; %以二进制的方式发送握手信号0xFF                                                   
%进入接收循环
while framenum<recnum        
recdta=fread(g,1,'uint8');  %以二进制的方式读入数据
if recdta==255            %找帧头
    rectr=rectr+1;        %接收计数器加1
    recbuf(rectr)=recdta; %送入接收缓冲区     
    elseif recdta==framelen&rcbuf(1)==255 %验证接收长度和帧头
     framelen=recdta;   %取帧长度
    rectr=rectr+1;         %接收计数器加1
    recbuf(rectr)=recdta; %送入接收缓冲区
    elseif rectr>1&rectr<framelen %接收数据
    rectr=rectr+1;            %接收计数器加1
    recbuf(rectr)=recdta;    %送入接收缓冲区
    if rectr==framelen       %如果接收完进行处理
       rectr=0;           %清接收计数器
       framenum=framenum+1;   %帧数累加
   %根据具体通讯协议提取数据
   …
  %接收滤波后的数据
  ….
   plot(…)      %输出显示
     end
       else rectr=0;         %未找到帧头清计数器
       end     %接收结束  
end     %主循环结束                                                                              
%程序结束关闭串口类
fclose(g);    %关闭串口                                                               
delete(g);    %删除串口对象
clear g ;      %清除变量
注意:串口的读写操作有文本方式和二进制方式两种。在文本方式下,串口设备只接收可以显示的ASCII字符,将0x00H~0x1FH范围内的字符解释为控制字符。使用文本方式对串口的读写函数分别为fprintf()(写)、fscanf()(读)。
2.事件驱动法
在Matlab环境下以事件驱动的方式进行串行通信,类似于VC中的MSCOMM控件中ONCOMM事件的实现方法。Matlab7.0提供了instrcallback(obj,event)回调函数,用户根据需要可以自行设置具体的串行通信事件。Matlab常用的串行口通信中断事件有:缓冲区有指定字节数目的数据可用事件(bytes-available event)、串口接收到的数据长时间处于非激活状态事件(break-interrupt event)、串行口引脚状态改变事件(pin-status event)、输出缓冲区为空事件(output empty event)等。当串口上有监视的事件发生时,Matlab会自动调用回调函数进行通信事件的处理。因此,事件驱动实质上是一种中断机制,而回调函数实质上相当于一个中断服务子程序。Matlab端实时串行通信的程序流程如图4所示,以下是具体的编程步骤。
(1)主程序
g =serial('com1');    %创建串口对象
g.baudrate=115200;  %设置波特率,缺省9600bit/s
g.parity='none';  %设置校验位无奇偶校验
g.stopbits=1;     %设置停止位
g.BytesAvaibleFcnMode='byte';% 设置中断触发事件为‘bytes-available Event’
g.BytesAvailableFcnCount=30; % 设置接收缓冲区每收到30个字节时,触发回调函数
g.BytesAvailableFcn=@instrcallback;得到回调函数句柄
fopen(g);%连接串口设备对象
fwrite(g,255);%写串口,发送握手信号0xFF(等价于十进制下的数值255)
(2)中断调用程序
Matlab缺省的回调函数instrcallback(obj,event)存在于instrcallback.m文件中。该文件类似于VC中的ONCOMM事件函数模块。需用户自行添加相应的中断处理程序代码。
Matlab安装目标盘下有两个instrcallback.m文件,我们只需要修改Matlab7\toolbox\matlab\iofun\@instrument目录下的instrcallback.m文件即可。注意,在修改instrcallback.m文件之前,最好对进行备份。另外,需要注意的是:程序调试过程中如果再次修改了该回调函数,要重新启动Matlab,才能使得新的回调函数文件生效。
%修改后的instrcallback.m文件如下:
function instrcallback(obj, event)
%以下是用户自行添加的通信事件处理及通信数据处理的中断服务程序代码
%定义存储串口30个字节通信数据的数组
Inbuffer1=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
inbuffer2=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
%以下程序用以对串口通信事件处理
out= fread (obj, 30, 'uint8')   %接下位机发送的30个数据(每个数据占一个字节)
%以下程序用以数据进行滤波
inbuffer2=filter(…., Inbuffer1);
%以下程序用以对滤波后数据进行文件存储
fid = fopen('C:\MATLAB7\work\data.txt','a+'); %创建并data.txt文件
fprintf(fid,'%3d',inbuffer2); %将滤波后数据存储到fid文件设备中
fclose(fid); %关闭fid文件设备
%数据计算

% 进行实时图形输出显示
plot(…);
end

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表