三、Matlab串行通信
在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 ; %清除变量
注意:串口的读写操作有文本方式和二进制方式两种。在文本方式